¿Cómo acelerar las consultas para bases de datos raster?

15

Tengo una base de datos raster en postgresql / postgis con estas columnas:

(ID, rast, data_of_data) .

'rast' es la columna que tiene archivos ráster en formato WKT. Una consulta de ejemplo para encontrar el valor de DN de un punto en el sistema WGS84 (30.424, -1.66) y para 2002-01-09 es la 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?

    
pregunta f.ashouri 04.12.2012 - 04:09

3 respuestas

11

¡Esta es una pregunta emocionante! ¿Qué tan grande es el raster que desea consultar? WKTRaster se almacena en la base de datos como BLOB . Para encontrar el valor en un punto específico, a partir de una coordenada de esquina conocida (x_0, y_0), los índices de fila / columna (i, j) se calculan utilizando (dx, dy) pasos y rotación. Con (i, j) conocido, la función ST_Value () puede acceder a los datos reales con el desplazamiento de bytes correcto.

Esto significa que la base de datos tiene que leer en promedio al menos la mitad de la mancha de datos al responder una consulta para un punto (según la implementación, en realidad puede leer todos los datos en todo momento). Por lo tanto, supongo que el rendimiento de WKTRaster sufre cuando los BLOB de datos son demasiado grandes. Enlazar el conjunto de datos debe acelerar las consultas. Eche un vistazo a cómo se manejan los datos SRTM (que vienen en segmentos de 6000x6000 píxeles) en este tutorial . En realidad, agrupan los datos en 50x50 píxeles realmente pequeños, lo cual es un claro indicio de que mi suposición puede no estar muy lejos de la verdad.

La indexación espacial de datos ráster probablemente solo indexará el cuadro delimitador, que no es una ayuda real para su problema.

    
respondido por el bhell 06.12.2012 - 10:22
3

Dependiendo de la distribución de sus datos, es posible que obtenga muy buenas aceleraciones simplemente al indexar la columna date_of_data .

Puede utilizar la sintaxis de EXPLAIN ANALYZE para averiguar si sus índices están siendo utilizado o no.

    
respondido por el dwurf 10.12.2012 - 22:34
3

Dos aspectos que encontré aceleraron mis cálculos de ráster de PostGIS, estaban usando valores enteros en el ráster, y usando rásteres multibanda cuando fue posible. En este caso, ¿se puede almacenar el valor de DN como enteros, si aún no se ha hecho?

El otro pensamiento (y no estoy seguro de que sea relevante aquí) es utilizar rásteres multibanda. Por ejemplo, si está viendo segmentos de datos mensuales, cada mes podría ser una capa ráster. Luego, puede recuperar los valores múltiples de un punto en diferentes segmentos de tiempo consultando 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, hay un indicador -t para TILE_SIZE . Podría explorar si el tamaño del mosaico que está utilizando funciona bien para su consulta.

    
respondido por el djq 11.12.2012 - 03:31

Lea otras preguntas en las etiquetas