Tengo una base de datos ráster en postgresql / postgis con estas columnas:
(ID, rast, data_of_data) .
'rast' es la columna que tiene archivos ráster en formato WKT. Un ejemplo de consulta para encontrar el valor DN de un punto en el sistema WGS84 (30.424, -1.66) y para 2002-01-09 es el siguiente:
SELECT
st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM
my_table
WHERE
date_of_data='2002-01-09'
¿Existe un método (por ejemplo, índice espacial) para acelerar ese tipo de consultas?
postgis
raster
query
performance
spatial-index
f.ashouri
fuente
fuente
Respuestas:
Esta es una pregunta emocionante! ¿Qué tan grande es el ráster que desea consultar? WKTRaster se almacena en la base de datos como un BLOB . Para encontrar el valor en un punto específico, a partir de una esquina (x_0, y_0) se calculan los índices de fila / columna de coordenadas (i, j) utilizando pasos (dx, dy) y rotación. Con (i, j) conocido, la función ST_Value () puede acceder a los datos reales en el desplazamiento de bytes correcto.
Esto significa que la base de datos tiene que leer en promedio al menos la mitad del blob de datos al responder una consulta para un punto (dependiendo de la implementación, en realidad puede leer todos los datos en todo momento). Por lo tanto, supongo que el rendimiento de WKTRaster se ve afectado cuando los BLOB de datos se hacen demasiado grandes. El mosaico del conjunto de datos debería acelerar las consultas. Eche un vistazo a cómo se manejan los datos SRTM (que vienen en fragmentos de 6000x6000 píxeles) en este tutorial . En realidad, agrupan los datos en píxeles realmente pequeños de 50x50, lo que es una clara pista de que mis suposiciones pueden no estar muy lejos de la verdad.
La indexación espacial de datos ráster probablemente solo indexará el cuadro delimitador, lo que no es una ayuda real para su problema.
fuente
CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));
( fuente )Dos aspectos que encontré aceleraron mis cálculos de ráster PostGIS: usar valores enteros en el ráster y usar rásteres multibanda cuando sea posible. En este caso, ¿se puede almacenar el valor DN como enteros, si esto no se está haciendo ya?
El otro pensamiento (y no estoy seguro de que sea relevante aquí) es usar rásteres multibanda. Por ejemplo, si está viendo porciones mensuales de datos, cada mes podría ser una capa ráster. Luego puede recuperar múltiples valores de un punto en diferentes segmentos de tiempo al consultar el ráster en capas. Encontré que este enfoque es mucho más rápido que consultar rásteres separados.
Finalmente, cuando carga sus datos, aparece el
-t
indicador TILE_SIZE . Podría explorar si el tamaño de mosaico que está utilizando funciona bien para su consulta.fuente
Dependiendo de la distribución de sus datos, puede obtener algunas aceleraciones muy buenas simplemente indexando la
date_of_data
columna.Puede usar la sintaxis EXPLAIN ANALYZE para determinar si sus índices se están utilizando o no.
fuente
create index tbl_name_date_idx on tbl_name (date_of_data)
. Si tiene muchas fechas distintas, esto reducirá drásticamente la cantidad de datos que PostGIS tiene que procesar.WHERE
cláusula, siempre debe considerar indexarla. No solo ayudará en este caso si tiene muchas fechas distintas (es decir, un dominio de gran valor) sino también si tiene una gran cantidad de registros en la tabla.explain analyze SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val from my_table where date_of_data='2002-01-09'
?