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.
Réponses:
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
,sum
et lesmean
statistiques 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.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()
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()
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.
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:
la source
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
la source
Vous pouvez le faire assez facilement avec PostGIS. Voir ce tutoriel: http://trac.osgeo.org/postgis/wiki/WKTRasterTutorial01
la source
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.
la source
calcule par défaut uniquement Count, Sum et Mean (comme vous pouvez le voir
Raster -> Zonal Statistics
dans QGIS Desktop, il peut faire beaucoup plus).Si vous, par exemple, souhaitez calculer uniquement la moyenne que vous devez utiliser:
voir l' API pour toutes les options.
la source