¿Usa el complemento QGIS Zonal Stats de la consola Python?

9

Estoy usando el complemento Zonal Stats en QGIS para extraer estadísticas ráster de los polígonos superpuestos (tengo archivos de forma de distribución de especies y quiero extraer datos ambientales dentro del rango de cada especie). Tengo aproximadamente 300 archivos de los que necesito obtener datos, por lo que me gustaría escribir un script para ejecutar en la consola de Python, sin embargo, soy un novato completo con Python y no tengo idea de cómo hacerlo.

Thomas
fuente
Chad: sí, es una pregunta similar pero es más específica. Nadie ha respondido a la otra pregunta, sino que sugirieron otras formas de resolver el problema. No sé cómo eliminar la otra publicación
Thomas
En la otra pregunta, te señalé un r-script capaz de lo que quieres y Sylvester Sneekly te nombró el método exacto en python. Si no está acostumbrado a codificar en python o r, todas las sugerencias adicionales no lo ayudarán. Necesita un script autocodificado o muchos clics del mouse. Aprenda algo de codificación, pruebe los ejemplos e informe, si algo no funciona.
Curlew
@Curlew: el método de Sylvester, aunque suena muy bien, representaría una curva de aprendizaje masiva para mí y no tengo tiempo para hacerlo en este momento. Aprecio la ayuda de Sylvester pero no fue la respuesta directa que buscaba. Pensé que tenía la mayoría del código que buscaba en la publicación que mencioné en mi otra pregunta ( gis.stackexchange.com/questions/23203/… ). Si el método de Sylvester es la única forma de hacer esto en Python, tal vez subestimé lo difícil que sería.
Thomas
@Curlew: su script R sí funciona, gracias. Lo único que todavía tengo que resolver es cómo agregar los resultados devueltos en R al archivo .dbf para mis archivos de forma (cualquier ayuda con esto sería muy apreciada).
Thomas

Respuestas:

13

El siguiente código funcionó para mí QGis 1.8.0

Puede modificar esto para acomodar múltiples archivos con algún bucle.

from qgis.analysis import QgsZonalStatistics

#specify polygon shapefile vector
polygonLayer = QgsVectorLayer('F:/temp/zonalstat/zonePoly.shp', 'zonepolygons', "ogr") 

# specify raster filename
rasterFilePath = 'F:/temp/zonalstat/raster1.tif'

# usage - QgsZonalStatistics (QgsVectorLayer *polygonLayer, const QString &rasterFile, const QString &attributePrefix="", int rasterBand=1)
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)
vinayan
fuente
Excelente. Muchas gracias vinayan, eso es exactamente lo que estaba buscando.
Thomas
También vea aquí para una solución alternativa usando R
Thomas
me alegro de que te haya ayudado!
vinayan
@vinayan, el QProgressDialog es útil para entornos visuales en los que desea ver hasta dónde han progresado los cálculos. No tiene uso desde la línea de comandos. Puede usarlo Nonecomo parámetro y funciona bien. Entonces no necesitas la PyQt4..línea de origen o la progressDialog = línea. Ver publicación similar en gis.stackexchange.com/questions/23203/…
rudivonstaden
@rudivonstaden - eso tiene sentido ahora ... actualicé la respuesta
vinayan
2

Aquí hay una manera de obtener lo que quiere en SAGA GIS. Probablemente esta no sea la solución que desea, pero funciona. Analizaré las razones por las que mis complementos fallan y lo actualizaré lo antes posible.

Instale SAGA GIS (también debe estar disponible a través de apt-get o aptitudbe en su distribución de Linux).

  • Inicie SAGA, cargue en su forma Ráster y vectorial (Módulos de menú -> Archivo -> Importación GDAL / OGR). Puedes ver el proceso a continuación.
  • Ejecute el Módulo "Estadísticas de cuadrícula para polígonos" (Módulos de menú -> Forma -> Cuadrícula -> Valores de cuadrícula). Los valores se agregan directamente a la tabla. El diálogo debería verse asíingrese la descripción de la imagen aquí
  • Vaya a la pestaña "Datos" en el espacio de trabajo, haga clic con el botón derecho en su capa vectorial y elija " guardar como " para exportar la forma con los atributos agregados. También puede mostrar la tabla de atributos haciendo clic derecho y luego haciendo clic en mostrar tabla

Esto funciona para el conjunto de datos que me enviaste. También es posible llamar a los módulos SAGA en QGIS a través de SEXTANTE como un proceso BATCH. Para hacer esto, simplemente active los módulos SAGA en las opciones de SEXTANTE.

Zarapito
fuente
gracias por la sugerencia, pero ya probé la saga: los resultados que produjo fueron inconsistentes, es decir, hacer lo mismo dos veces dio resultados diferentes. Sé que el complemento ZonalStats en QGIS funciona, por lo tanto, busco una forma de automatizar ZonalStats.
Thomas
@vinayan tengo el código que has dado para los estáticos zonales pero está creando las columnas en la capa del vector poligonal pero no actualizando los valores calculados. ¿Por que es esto entonces?
user99
2
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)

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

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

zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1, QgsZonalStatistics.Mean)
zoneStat.calculateStatistics(None)

ver API para todas las opciones.

Fitzroy Hogsflesh
fuente
¿Alguien puede ayudar con la sintaxis para obtener dos estadísticas de elección, digamos Min y Max, al mismo tiempo? He estado intentando diferentes formas pero no he tenido éxito
dorakiara
¡En Qgis 3 necesita reemplazar la ruta del archivo ráster con el archivo ráster mismo! Por lo tanto, rasterFilePath = 'F: /temp/zonalstat/raster1.tif' se convierte en: rasterFile = QgsRasterLayer ('F: /temp/zonalstat/raster1.tif', 'raster') Luego cambia el rasterFilePath al rasterFile en zoneStat comando zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (None)
philsch