Optimización de consultas de bases de datos Postgis

10

Tengo un conjunto de rásteres en formato DTED que cargo en la base de datos PostGIS usando la herramienta de línea de comandos raster2pgsql.

Cada uno de los rásteres se almacena simplemente en una fila y se describe mediante rid y un valor de formato de ráster.

Ahora, quiero crear una función de base de datos que tome la longitud y la latitud de un punto y devuelva un valor de píxel correspondiente a este punto.

El problema que tengo es que lleva bastante tiempo hacerlo (3-4 segundos) porque la base de datos funciona en la placa Odroid.

Sé que el conjunto de datos que proceso es bastante grande (los rásteres cubren todo el área del Reino Unido), pero como no estoy muy familiarizado con PostgreSQL y PostGIS, sospecho que se puede hacer más rápido.

Esto es lo que he hecho hasta ahora:

SELECT ST_Value(rast, ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326))
FROM (
    SELECT * FROM rasters
    WHERE rast && ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326)
) x;

$1y $2son largos y lat respectivamente.

Zed está muerto
fuente
2
¿Cortó el ráster en mosaicos cuando importó a postgis? (parámetro -t ancho x alto)?
mutolisp
Sí, lo hice. Mejoró un poco el rendimiento. Probablemente también debería agregar que la base de datos está en la placa Odroid, por lo tanto, funciona significativamente más lento que en la PC de escritorio. Me preguntaba si puedo cambiar de alguna manera el enfoque del procesamiento de rásteres para que haga menos cálculos innecesarios. Por ejemplo, inicialmente, estaba llamando a la función ST_Value en todos los rásteres y luego buscaría la fila que realmente contiene algún valor. Fue el enfoque más simple pero funcionó mucho más lento.
zedsdead
2
El uso ST_SetSRID(ST_MakePoint($1, $2),4326)en lugar de los concatenos de cuerdas puede ahorrarle algo de tiempo si hay suficientes iteraciones.
Scro
1
No parece ayudar mucho, pero gracias. Estaba pensando en agregar otra columna cuando se crea la tabla que contendría simplemente un cuadro delimitador para un solo ráster. Tal vez de esta manera se podría encontrar un ráster derecho más rápido ... Además, me preguntaba si el cálculo previo de la posición del píxel en el ráster basado en las coordenadas de la esquina y el paso del píxel en lon / lat podría ayudar ... Si alguien tiene alguna pensamientos sobre eso estaré agradecido por compartirlos :)
zedsdead
2
Tal vez podría intentar usar "explicar" para verificar dónde está el cuello de la botella.
mutolisp

Respuestas:

1

Podrías probar esto:

--calculate and store geom point just One time
WITH point_geom AS 
(
    SELECT ST_setsrid(ST_GeomFromText('POINT('|| $1 || ' '|| $2 || ')'), 4326) as geom
)
-- Your subquery is maybe useless , alias "x" isn't used
SELECT ST_Value( rast, point_geom.geom )
FROM rasters
WHERE rast && point_geom.geom;

Pero el verdadero problema es query raster; el mosaico del conjunto de datos debería acelerar las consultas. Puede intentar usar PostGIS WKT Raster y seguir este tutorial .

Espero que sea útil

Benno
fuente