Sto cercando di calcolare le statistiche raster (min, max, media) per ogni poligono in un livello vettoriale usando PostgreSQL / PostGIS.
Questa risposta GIS.SE descrive come eseguire questa operazione, calcolando l'intersezione tra il poligono e il raster e quindi calcolando una media ponderata: https://gis.stackexchange.com/a/19858/12420
Sto usando la seguente query (dov'è il dem
mio raster, topo_area_su_region
è il mio vettore ed toid
è un ID univoco:
SELECT toid, Min((gv).val) As MinElevation, Max((gv).val) As MaxElevation, Sum(ST_Area((gv).geom) * (gv).val) / Sum(ST_Area((gv).geom)) as MeanElevation FROM (SELECT toid, ST_Intersection(rast, geom) AS gv FROM topo_area_su_region,dem WHERE ST_Intersects(rast, geom)) foo GROUP BY toid ORDER BY toid;
Funziona, ma è troppo lento. Il mio livello vettoriale ha 2489k funzioni, ognuna delle quali impiega circa 90 ms per l'elaborazione: occorrerebbero giorni per elaborare l'intero livello. La velocità del calcolo non sembra essere significativamente migliorata se calcolassi solo il minimo e il massimo (il che evita le chiamate a ST_Area).
Se eseguo un calcolo simile utilizzando Python (GDAL, NumPy e PIL), posso ridurre significativamente il tempo necessario per elaborare i dati, se invece di vettorizzare il raster (usando ST_Intersection) rasterizzo il vettore. Vedi il codice qui: https://gist.github.com/snorfalorpagus/7320167
Non ho davvero bisogno di una media ponderata - un approccio "se tocca, è in" è abbastanza buono - e sono ragionevolmente sicuro che questo è ciò che sta rallentando le cose.
Domanda : esiste un modo per far comportare PostGIS in questo modo? cioè per restituire i valori di tutte le celle dal raster toccato da un poligono, anziché dall'intersezione esatta.
Sono molto nuovo di PostgreSQL / PostGIS, quindi forse c'è qualcos'altro che non sto facendo bene. Sto eseguendo PostgreSQL 9.3.1 e PostGIS 2.1 su Windows 7 (2.9GHz i7, 8GB RAM) e ho modificato la configurazione del database come suggerito qui: http://postgis.net/workshops/postgis-intro/tuning.html