Estoy usando PostGIS2.0 para hacer algunas intersecciones ráster / polígono. Tengo dificultades para comprender qué operación debo usar y cuál es la forma más rápida de realizarla. Mi problema es el siguiente:
- Tengo un polígono y una trama
- Quiero encontrar todos los píxeles que se encuentran dentro del polígono y obtener la suma del valor del píxel
- Y (problema actualizado): obtengo valores masivos para algunos píxeles que no existen en el ráster original cuando realizo la consulta
Tengo dificultades para entender si debo usar ST_Intersects()
o ST_Intersection()
. Tampoco sé cuál es el mejor enfoque para sumar mis píxeles. Aquí está el primer enfoque que he probado (# 1):
SELECT
r.rast
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
Esto devuelve una lista de rast
valores, con lo que no estoy seguro de qué hacer. Intenté calcular las estadísticas de resumen usando, ST_SummaryStats()
pero no estoy seguro de si esta es la suma ponderada de todos los píxeles que se encuentran dentro del polígono.
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
El otro enfoque que he probado (# 2) usa 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;
Esto devuelve una lista de geometrías que analizo más a fondo, pero supongo que esto es menos eficiente.
No tengo claro cuál es el orden de operación más rápido también. ¿Debo elegir siempre raster, polygon
o polygon, raster
, o convertir el polígono en un ráster para que así sea raster, raster
?
EDITAR: Actualicé el enfoque # 2 con algunos detalles del R.K.
enlace.
Usando el enfoque # 2, he notado el siguiente error en los resultados, que es parte de la razón por la que no entendí el resultado. Aquí está la imagen de mi ráster original, y un esquema del polígono que se está utilizando para intersecarlo, superpuesto en la parte superior:
Y aquí está el resultado de la intersección usando PostGIS:
El problema con el resultado es que hay valores de 21474836 que se devuelven, que no están en el ráster original. No tengo idea de por qué ocurre esto. Sospecho que está relacionado con números pequeños en algún lugar (dividido por casi 0), pero devuelve el resultado incorrecto.
ST_SummaryStats()
para el # 1, pero no estoy seguro de cómo hacerlo para el # 2.