¿Cómo calcular estadísticas ráster para polígonos?


14

¿Cómo puedo calcular sumas, promedios, etc. de puntos ráster (multibanda) por polígono de una capa vectorial? Me dijeron que esto se llama "estadísticas zonales". Lo intenté con QGIS primero.

Hay una manera de hacerlo, pero eso es demasiado lento (convertir el ráster en vector, intersecar con la segunda capa vectorial, calcular la geometría, exportar números, calcular estadísticas con una hoja de cálculo u otro programa, volver a importar los resultados, me lleva una eternidad para mi 350.000 puntos de trama).

También me dieron la pista de usar saga-gis. Eso tiene "estadísticas zonales", pero se basan en categorías de una banda de trama, no en polígonos de una capa vectorial. Entonces, para usar esto, tendría que convertir mi capa vectorial en ráster y luego calcular las estadísticas.

Esta parece ser la forma incorrecta de resolver esto. No habría forma de tener en cuenta los puntos ráster que pertenecen a 2 o más polígonos porque están intersectados por el límite del polígono. Supongo que las estadísticas basadas en polígonos deberían poder manejar esto, así que también asumo que todavía no he encontrado el módulo correcto.

Saga-gis tiene realmente muchos módulos. Por favor, hágame saber cuál es el adecuado para esta aplicación.


Estoy probando la solución de Rudivonstaden, y los siguientes mensajes de error aparecen cuando ingreso los dos últimos comandos: >>> zonalstats = qgis.analysis.QgsZonalStatistics (vectorlayer, rasterfile) Traceback (última llamada): Archivo "<input>" , línea 1, en <module> AttributeError: el objeto 'module' no tiene atributo 'analysis' >>> zonalstats.calculateStatistics (None) Traceback (última llamada reciente): Archivo "<input>", línea 1, en <module > NameError: el nombre 'zonalstats' no está definido. Me pregunto si los comandos son correctos o si el archivo ráster que estoy usando está en el formato correcto. ¡Gracias!
Dan Wolf

Hola dan Stackexchange funciona un poco diferente de un foro. El objetivo es tener una interacción de tipo Q&A en lugar de una discusión continua. Si las respuestas a la pregunta original no resuelven lo que necesita saber, debe pedir una aclaración en la sección de comentarios o considerar hacer una nueva pregunta.
Jay Guarneri

Gracias por tu comentario, Dan. A mi respuesta le faltaba una declaración de importación necesaria, que ahora debería corregirse.
rudivonstaden

Respuestas:


22

Estaba luchando por hacer exactamente lo mismo, pero por varias razones estoy comprometido a usar QGIS. Intenté usar v.rast.stats usando el complemento GRASS y también a través del complemento Sextante. El último enfoque falló, porque parece adjuntar las estadísticas a una capa vectorial temporal que luego elimina. El complemento GRASS funcionó, pero no trata con polígonos superpuestos.

Después de investigar un poco (en la fuente del complemento ZonalStats prometedor), descubrí que QGIS en realidad tiene métodos de estadísticas zonales integrados en la API, y estos también tienen enlaces de Python. Así que, mientras que sólo se busca count, sumy meanestadísticas de sus funciones de polígonos, la consola de Python (Plug-ins> Consola Python) es actualmente la forma más fácil de conectar a las estadísticas de la tabla de atributos de polígonos.

  1. Seleccione su capa ráster en la tabla de contenido y escriba lo siguiente en la consola (toma el nombre del archivo fuente de su capa ráster)

    >>> rasterfile = qgis.utils.iface.mapCanvas().currentLayer().source()

  2. Seleccione su capa vectorial y ejecute el siguiente comando en la consola (agarra la capa vectorial en sí)

    >>> vectorlayer = qgis.utils.iface.mapCanvas().currentLayer()

  3. Ejecute los siguientes tres comandos en la consola (pasan la capa vectorial y el archivo ráster a la calculadora de estadísticas zonales incorporada de QGIS)

    >>> import qgis.analysis

    >>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)

    >>> zonalstats.calculateStatistics(None)

Los resultados se agregarán como campos adicionales en la capa de polígono.

Estadísticas zonales

Tenga en cuenta que si desea agregar un prefijo a los nuevos campos (en lugar de simplemente tenerlos como suma, media y conteo), entonces reemplazaría el primer comando en el paso 3 con lo siguiente (suponiendo que deseara usar 'zonal_' como el prefijo

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")

1
+1 qgis.analysis.QgsZonalStatistics ()
Aaron

Hay un complemento de Zonal Statistics en QGIS, por lo que probablemente no necesite ejecutar los comandos mencionados usted mismo: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Me pregunto, ¿por qué no hay posibilidad de calcular el máximo y el mínimo? valores también.
matandked

Usé

6

Finalmente lo encontré: en Saga-GIS abrir categoría-polígonos y cuadrícula de datos, luego formas-> cuadrícula-> valor de cuadrícula-> estadísticas de cuadrícula para polígonos



3

Parece que este problema ya se resolvió hace algún tiempo, pero de todos modos agregaré mi cuchara a la sopa, ya que recientemente necesité algunas estadísticas de trama.

La metodología QGIS descrita por rudivonstaden funcionó de maravilla, gracias por el consejo. Sin embargo, en mi caso también quería saber los valores mínimo y máximo y estándar para los valores ráster dentro de mis polígonos, y esa funcionalidad que no pude encontrar en QGIS. Encontré una solución a través de la función isectpolyrst en GME , que es una de mis favoritas para resolver problemas con SIG. Esta función me dio las estadísticas que necesitaba y también bastante rápido.

PD. GME tiene una dependencia desafortunada (ArcGIS). Entonces, aunque el programa en sí está disponible gratuitamente para todos, necesita ArcGIS para ejecutarlo. Pero si tiene ArcGIS (cualquier nivel de licencia), le recomiendo que lo pruebe.

EDITAR:

Obtuve las estadísticas que quería, pero luego descubrí que salí a conclusiones un poco apresuradamente después de mirar los números reales. Obtienes estadísticas, sí, pero solo para la primera banda en una trama. Entonces, si opera con una imagen ráster de 3 bandas, las estadísticas están incompletas. Debería haber señalado la cantidad de canales en mi publicación original. Es mejor usar SAGA-GIS como stn propuesto anteriormente si está trabajando con imágenes ráster de múltiples bandas.


3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

calcula de forma predeterminada solo Count, Sum y Mean (como puede ver Raster -> Zonal Statisticsen QGIS Desktop, puede hacer mucho más).

Si, por ejemplo, desea calcular solo la media que debe usar:

zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer, rasterfile, QgsZonalStatistics.Mean)
zonalstats.calculateStatistics(None)

ver API para todas las opciones.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.