Estoy tratando de calcular las estadísticas de rasterización (mínimo, máximo, medio) para cada polígono en una capa vectorial utilizando PostgreSQL/PostGIS.
Esta respuesta de GIS.SE describe cómo hacerlo, calculando la intersección entre el polígono y el raster y luego calculando un promedio ponderado: https://gis.stackexchange.com/a/19858/12420
Estoy utilizando la siguiente consulta (donde dem
es mi trama, topo_area_su_region
es mi vector, y toid
es un identificador único:
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;
Esto funciona, pero es demasiado lento. Mi capa vectorial tiene 2489k características, y cada una toma alrededor de 90ms para procesar - se necesitaría días para procesar toda la capa. La velocidad de cálculo no parece mejorar significativamente si sólo calculo el mínimo y el máximo (lo que evita las llamadas a ST_Area).
Si hago un cálculo similar usando Python (GDAL, NumPy y PIL) puedo reducir significativamente la cantidad de tiempo que toma procesar los datos, si en lugar de vectorizar el raster (usando ST_Intersection) rasterizo el vector. Vea el código aquí: https://gist.github.com/snorfalorpagus/7320167
Realmente no necesito una media ponderada - un enfoque de "si toca, está dentro" es suficiente - y estoy razonablemente seguro de que esto es lo que está ralentizando las cosas.
Pregunta : ¿Existe alguna forma de conseguir que PostGIS se comporte así? Es decir, que devuelva los valores de todas las celdas del raster que toca un polígono, en lugar de la intersección exacta.
Soy muy nuevo en PostgreSQL/PostGIS, así que tal vez hay algo que no estoy haciendo bien. Estoy corriendo PostgreSQL 9.3.1 y PostGIS 2.1 en Windows 7 (2.9GHz i7, 8GB RAM) y he ajustado la configuración de la base de datos como se sugiere aquí: http://postgis.net/workshops/postgis-intro/tuning.html
1 votos
He editado mi respuesta. Me olvidé de decir que la intersección en mi respuesta es menos precisa.