Vous utilisez le plug-in QGIS Zonal Stats depuis la console Python?

9

J'utilise le plugin Zonal Stats dans QGIS pour extraire des statistiques raster de polygones superposés (j'ai des fichiers de formes de distribution d'espèces et je veux extraire des données environnementales à l'intérieur de l'aire de chaque espèce). J'ai environ 300 fichiers dont j'ai besoin pour obtenir des données et je voudrais donc écrire un script à exécuter dans la console python, mais je suis un novice complet avec python et je ne sais pas comment faire.

Thomas
la source
Tchad - oui c'est une question similaire mais c'est plus spécifique. Personne n'a répondu à l'autre question, mais ils ont suggéré d'autres façons de résoudre le problème. Je ne sais pas comment supprimer l'autre message
Thomas
Dans l'autre question, je vous ai indiqué un script r capable de ce que vous voulez et Sylvester Sneekly vous a nommé la méthode exacte en python. Si vous n'êtes pas habitué à coder en python ou en r, tous les autres conseils ne vous aideront pas. Vous avez besoin d'un script auto-codé ou de nombreux clics de souris. Apprenez à coder, essayez les exemples et faites un rapport si quelque chose ne fonctionne pas.
Courlis
@Curlew - La méthode de Sylvester, même si elle semble très bonne, représenterait une énorme courbe d'apprentissage pour moi et je n'ai pas le temps de le faire pour le moment. J'apprécie l'aide de Sylvester mais ce n'était pas la réponse simple que je recherchais. Je pensais que j'avais la plupart du code que je recherchais dans le message que j'ai mentionné dans mon autre question ( gis.stackexchange.com/questions/23203/… ). Si la méthode de Sylvester est le seul moyen de le faire en python, j'ai peut-être sous-estimé à quel point ce serait difficile.
Thomas
@Curlew - Votre script R fonctionne effectivement, merci. La seule chose que je n'ai pas encore trouvée est de savoir comment ajouter les résultats renvoyés en R au fichier .dbf pour mes fichiers de formes (toute aide à ce sujet serait très appréciée).
Thomas

Réponses:

13

Le code ci-dessous a fonctionné pour moi QGis 1.8.0

Vous pouvez modifier cela pour accueillir plusieurs fichiers avec une boucle.

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
la source
Génial. Merci beaucoup vinayan, c'est exactement ce que je cherchais.
Thomas
Voir également ici pour une solution alternative utilisant R
Thomas
heureux que cela vous ait aidé!
vinayan
@vinayan le QProgressDialog est utile pour les environnements visuels où vous voulez voir dans quelle mesure les calculs ont progressé. Il n'a aucune utilité depuis la ligne de commande. Vous pouvez utiliser Nonecomme paramètre et cela fonctionne très bien. Ensuite, vous n'avez pas besoin de la PyQt4..ligne de départ ou de la progressDialog = ligne. Voir un article similaire sur gis.stackexchange.com/questions/23203/…
rudivonstaden
@rudivonstaden - cela a du sens maintenant..j'ai mis à jour la réponse
vinayan
2

Voici comment obtenir ce que vous voulez dans SAGA GIS. Ce n'est probablement pas la solution que vous souhaitez, mais cela fonctionne. J'examinerai les raisons de l'échec de mes plugins et le mettrai à jour dès que possible.

Installez SAGA GIS (devrait également être disponible via apt-get ou aptitudbe dans votre distribution linux).

  • Démarrez SAGA, chargez votre raster et forme vectorielle (Modules de menu -> Fichier -> Importation GDAL / OGR). Vous pouvez voir le processus ci-dessous.
  • Exécutez le module "Statistiques de grille pour les polygones" (Modules de menu -> Forme -> Grille -> Valeurs de grille). Les valeurs sont ajoutées directement au tableau. La boîte de dialogue devrait ressembler à cecientrez la description de l'image ici
  • Allez dans l'onglet "Données" de l'espace de travail, faites un clic droit sur votre calque vectoriel et choisissez " enregistrer sous " pour exporter la forme avec les attributs ajoutés. Vous pouvez également afficher la table des attributs via un clic droit puis cliquez sur le tableau afficher

Cela fonctionne pour l'ensemble de données que vous m'avez envoyé. Il est également possible d'appeler des modules SAGA dans QGIS via SEXTANTE en tant que processus BATCH. Pour ce faire, il vous suffit d'activer les modules SAGA dans les options SEXTANTE.

Courlis
la source
merci pour la suggestion, mais j'ai déjà essayé la saga - les résultats qu'elle a produits étaient incohérents, c'est-à-dire que faire la même chose deux fois a donné des résultats différents. Je sais que le plugin ZonalStats dans QGIS fonctionne, donc je suis à la recherche d'un moyen d'automatiser ZonalStats.
Thomas
@vinayan j'ai le code que vous avez donné pour les statistiques zonales mais il crée les colonnes dans la couche vectorielle polygonale mais ne met pas à jour les valeurs calculées. Pourquoi en est-il ainsi?
user99
2
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)

calcule par défaut uniquement Count, Sum et Mean (comme vous pouvez le voir Raster -> Zonal Statisticsdans QGIS Desktop, il peut faire beaucoup plus).

Si, par exemple, vous souhaitez calculer uniquement la moyenne que vous devez utiliser:

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

voir l' API pour toutes les options.

Fitzroy Hogsflesh
la source
Quelqu'un peut-il aider avec la syntaxe pour obtenir deux statistiques de choix, par exemple Min & Max, en même temps? J'ai essayé différentes manières mais sans succès
dorakiara
Dans Qgis 3, vous devez remplacer le chemin du fichier raster par le fichier raster lui-même! Par conséquent, rasterFilePath = 'F: /temp/zonalstat/raster1.tif' devient: rasterFile = QgsRasterLayer ('F: /temp/zonalstat/raster1.tif', 'raster') Ensuite, vous modifiez le rasterFilePath en rasterFile dans la zoneStat commande zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (None)
philsch