Comment calculer les statistiques raster pour les polygones?

14

comment puis-je calculer des sommes, des moyennes, etc. de points de trame (multibande) par polygone d'une couche vectorielle. On m'a dit que cela s'appelle des "statistiques zonales". J'ai essayé cela avec QGIS en premier.

Il existe un moyen de le faire, mais cela est beaucoup trop lent (convertir un raster en vecteur, intersecter avec une deuxième couche vectorielle, calculer la géométrie, exporter des nombres, calculer des statistiques avec une feuille de calcul ou un autre programme, réimporter les résultats, prend une éternité pour mon 350.000 points raster).

On m'a également donné le conseil d'utiliser Saga-gis. Cela a des "statistiques zonales" mais celles-ci sont basées sur des catégories d'une bande raster, pas sur des polygones d'une couche vectorielle. Donc, pour l'utiliser, je devrais convertir ma couche vectorielle en raster, puis calculer les statistiques.

Cela semble être la mauvaise façon de résoudre ce problème. Il n'y aurait aucun moyen de prendre en compte les points raster qui appartiennent à 2 polygones ou plus, car ils sont coupés par la frontière du polygone. Je suppose que les statistiques basées sur les polygones devraient être capables de gérer cela, donc je suppose également que je n'ai pas encore trouvé le bon module.

Saga-gis a vraiment de nombreux modules. Veuillez me faire savoir lequel est le bon pour cette application.

stn
la source
J'essaie la solution de Rudivonstaden et les messages d'erreur suivants apparaissent lorsque j'entre les deux dernières commandes: >>> zonalstats = qgis.analysis.QgsZonalStatistics (vectorlayer, rasterfile) Traceback (dernier appel en dernier): fichier "<input>" , ligne 1, dans <module> AttributeError: l'objet 'module' n'a pas d'attribut 'analyse' >>> zonalstats.calculateStatistics (None) Traceback (dernier appel en date): Fichier "<input>", ligne 1, dans <module > NameError: le nom 'zonalstats' n'est pas défini Je me demande si les commandes sont correctes ou si le fichier raster que j'utilise est au bon format? Merci!
Dan Wolf
Salut Dan. Stackexchange fonctionne un peu différemment d'un forum. L'objectif est d'avoir une interaction de type Q&R plutôt qu'une discussion continue. Si les réponses à la question d'origine ne résolvent pas ce que vous devez savoir, vous devez soit demander des éclaircissements dans la section des commentaires, soit envisager de poser une nouvelle question.
Jay Guarneri
Merci pour ton commentaire, Dan. Ma réponse manquait une déclaration d'importation nécessaire, qui devrait maintenant être corrigée.
rudivonstaden

Réponses:

22

J'avais du mal à faire exactement la même chose, mais pour diverses raisons, je m'engage à utiliser QGIS. J'ai essayé d'utiliser v.rast.stats en utilisant le plugin GRASS et aussi via le plugin Sextante. Cette dernière approche a échoué, car elle semble attacher les statistiques à une couche vectorielle temporaire qu'elle supprime ensuite. Le plugin GRASS a fonctionné, mais il ne traite pas des polygones qui se chevauchent.

Après avoir fait quelques recherches (dans la source du plugin ZonalStats au son prometteur), j'ai trouvé que QGIS avait en fait des méthodes de statistiques zonales intégrées dans l'API, et celles-ci ont également des liaisons Python. Donc, tant que vous êtes à la recherche que pour count, sumet les meanstatistiques de vos fonctions de polygones, la console Python (Plugins> Console Python) est actuellement la meilleure façon de joindre les statistiques à la table des attributs de polygone.

  1. Sélectionnez votre couche raster dans la table des matières et tapez ce qui suit dans la console (il saisit le nom du fichier source de votre couche raster)

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

  2. Sélectionnez votre calque vectoriel et exécutez la commande suivante dans la console (il saisit le calque vectoriel lui-même)

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

  3. Exécutez les trois commandes suivantes dans la console (elles transmettent la couche vectorielle et le fichier raster au calculateur de statistiques zonales intégré à QGIS)

    >>> import qgis.analysis

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

    >>> zonalstats.calculateStatistics(None)

Les résultats seront ajoutés en tant que champs supplémentaires dans la couche polygonale.

Statistiques zonales

Notez que si vous souhaitez ajouter un préfixe aux nouveaux champs (plutôt que de les avoir simplement comme somme, moyenne et nombre), vous devez remplacer la première commande de l'étape 3 par la suivante (en supposant que vous vouliez utiliser 'zonal_' comme le préfixe:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")
rudivonstaden
la source
1
+1 qgis.analysis.QgsZonalStatistics ()
Aaron
Il y a un plugin Zonal Statistics dans QGIS, donc vous n'avez probablement pas besoin d'exécuter vous-même les commandes mentionnées: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Je me demande pourquoi il n'y a pas de possibilité de calculer le maximum et le minimum valeurs aussi.
matandked
J'ai utilisé votre technique mais elle supprime certains polygones :(
niahoo
6

Enfin trouvé: dans Saga-GIS, ouvrez la catégorie polygones et grille de données, puis formes-> grille-> valeur de grille-> statistiques de grille pour les polygones

stn
la source
3

Ce problème semble avoir été résolu il y a déjà un certain temps, mais je vais quand même ajouter ma cuillère à la soupe depuis que j'ai récemment eu besoin de quelques statistiques raster.

La méthodologie QGIS décrite par rudivonstaden a fonctionné comme un charme, merci pour l'astuce. Cependant, dans mon cas, je voulais également connaître les valeurs min et max et std pour les valeurs raster dans mes polygones, et cette fonctionnalité que je ne pouvais pas trouver dans QGIS. J'ai trouvé une solution grâce à la fonction isectpolyrst dans GME , qui est l'un de mes favoris pour résoudre les problèmes SIG avec. Cette fonction m'a donné juste les statistiques dont j'avais besoin et assez rapidement aussi.

PS. GME a un peu d'une dépendance malheureuse (ArcGIS). Ainsi, même si le programme lui-même est librement accessible à tous, vous avez besoin d'ArcGIS pour l'exécuter. Mais si vous avez ArcGIS (n'importe quel niveau de licence), je vous recommande de l'essayer.

ÉDITER:

J'ai obtenu les statistiques que je voulais, mais j'ai découvert plus tard que je suis passé à la conclusion un peu à la hâte après avoir examiné les chiffres réels. Vous obtenez des statistiques, oui, mais uniquement pour la première bande d'un raster. Donc, si vous utilisez une image raster à 3 bandes, les statistiques sont incomplètes. J'aurais dû indiquer le nombre de chaînes dans mon message d'origine. Il est préférable d'utiliser SAGA-GIS comme stn proposé ci-dessus si vous travaillez avec des images raster multi-bandes.

GISinHelsinki
la source
3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.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 vous, par exemple, souhaitez calculer uniquement la moyenne que vous devez utiliser:

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

voir l' API pour toutes les options.

Fitzroy Hogsflesh
la source