Ottimizzazione delle query del database Postgis


10

Ho un set di raster in formato DTED che carico nel database PostGIS usando lo strumento da riga di comando raster2pgsql.

Ciascuno dei raster è semplicemente memorizzato in una riga e descritto da rid e un valore del formato raster.

Ora, voglio creare una funzione di database che prende la longitudine e la latitudine di un punto e restituisce un valore di pixel corrispondente a questo punto.

Il problema che ho è che ci vuole molto tempo per farlo (3-4 secondi) perché il database funziona sulla scheda Odroid.

So che il set di dati che elaboro è piuttosto grande (i raster coprono l'intera area del Regno Unito) ma poiché non ho molta familiarità con PostgreSQL e PostGIS, sospetto che possa essere fatto più velocemente.

Questo è quello che ho fatto finora:

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;

$1e $2sono rispettivamente long e lat.


2
Hai tagliato il raster in tessere durante l'importazione in Postgis? (parametro -t larghezza x altezza)?
mutolisp

Si l'ho fatto. Ha migliorato un po 'le prestazioni. Probabilmente dovrei anche aggiungere che il database si trova sulla scheda Odroid, quindi funziona significativamente più lentamente rispetto al PC desktop. Mi stavo solo chiedendo se posso cambiare in qualche modo l'approccio all'elaborazione dei raster in modo che esegua calcoli meno inutili. Ad esempio, inizialmente, stavo chiamando la funzione ST_Value su tutti i raster e quindi avrei cercato la riga che in realtà contiene un valore. Era l'approccio più semplice ma ha funzionato molto più lentamente.
Zedsdead,

2
L'uso ST_SetSRID(ST_MakePoint($1, $2),4326)al posto dei concatenamenti può farti risparmiare un po 'di tempo se ci sono abbastanza iterazioni.
Scro,

1
Non sembra aiutare molto, ma grazie. Stavo pensando di aggiungere un'altra colonna quando viene creata una tabella che conterrebbe semplicemente un rettangolo di selezione per un singolo raster. Forse in questo modo un raster giusto potrebbe essere trovato più velocemente ... Inoltre, mi chiedevo se il pre-calcolo della posizione dei pixel nel raster in base alle coordinate degli angoli e al passaggio dei pixel in lon / lat potesse aiutare ... Se qualcuno ha qualche pensieri su che sarò grato per averli condivisi :)
zedsdead,

2
Forse potresti provare a usare "Spiega" per verificare dove si trova il collo della bottiglia.
mutolisp

Risposte:


1

Puoi provare questo:

--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;

Ma il vero problema è la query raster; la piastrellatura del set di dati dovrebbe accelerare le query. Puoi provare a utilizzare PostGIS WKT Raster e seguire questo tutorial .

Spero che sia utile,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.