Sto usando PostGIS2.0 per fare alcune intersezioni raster / poligoni. Sto incontrando difficoltà nel capire quale operazione dovrei usare e quale sia il modo più rapido per farlo. Il mio problema è il seguente:
- Ho un poligono e un raster
- Voglio trovare tutti i pixel che rientrano nel poligono e ottenere la somma del valore del pixel
- E (problema aggiornato): sto ottenendo valori enormi per alcuni pixel che non esistono nel raster originale quando eseguo la query
Ho difficoltà a capire se dovrei usare ST_Intersects()
o ST_Intersection()
. Inoltre non so quale sia l'approccio migliore per sommare i miei pixel. Ecco il primo approccio che ho provato (n. 1):
SELECT
r.rast
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
Questo restituisce un elenco di rast
valori, che non sono sicuro di cosa fare. Ho provato a calcolare le statistiche di riepilogo usando ST_SummaryStats()
ma non sono sicuro se questa è la somma ponderata di tutti i pixel che si trovano all'interno del poligono.
SELECT
(result).count,
(result).sum
FROM (
SELECT
ST_SummaryStats(r.rast) As result
FROM
raster As r,
polygon As p
WHERE
ST_Intersects(r.rast, p.geom)
) As tmp
L'altro approccio che ho provato (n. 2) utilizza ST_Intersection()
:
SELECT
(gv).geom,
(gv).val
FROM
(
SELECT
ST_Intersection(r.rast, p.geom) AS gv
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
) as foo;
Questo restituisce un elenco di geometrie che analizzerò ulteriormente, ma suppongo che questo sia meno efficiente.
Non sono chiaro su quale sia anche l'ordine di funzionamento più rapido. Dovrei sempre scegliere raster, polygon
o polygon, raster
, o convertire il poligono in un raster in modo che sia raster, raster
?
EDIT: ho aggiornato l'approccio n. 2 con alcuni dettagli dal R.K.
link di.
Usando l'approccio n. 2, ho notato il seguente errore nei risultati, che è parte del motivo per cui non ho capito l'output. Ecco l'immagine del mio raster originale e uno schema del poligono che viene utilizzato per intersecarlo, sovrapposto in alto:
Ed ecco il risultato dell'incrocio con PostGIS:
Il problema con il risultato è che vengono restituiti valori di 21474836, che non si trovano nel raster originale. Non ho idea del perché questo accada. Ho il sospetto che sia correlato a piccoli numeri da qualche parte (dividendo per quasi 0), ma restituisce il risultato sbagliato.
ST_SummaryStats()
per il n. 1, ma non sono sicuro di come farlo per il n. 2.