Wie berechnet man Raster-Statistiken für Polygone?

14

Wie kann ich Summen, Durchschnitte usw. von Rasterpunkten (Multiband) pro Polygon einer Vektorebene berechnen? Mir wurde gesagt, dass dies "Zonenstatistik" genannt wird. Ich habe das zuerst mit QGIS versucht.

Es gibt einen Weg, dies zu tun, aber der ist viel zu langsam (Raster in Vektor umwandeln, Schnittmenge mit zweiter Vektorebene, Geometrie berechnen, Zahlen exportieren, Statistiken mit Tabellenkalkulation oder einem anderen Programm berechnen, Ergebnisse erneut importieren, für mich ewig dauern 350.000 Rasterpunkte).

Mir wurde auch der Hinweis gegeben, Saga-Gis zu benutzen. Das hat "zonale Statistiken", aber diese basieren auf Kategorien aus einem Raster-Band, nicht auf Polygonen aus einem Vektor-Layer. Um dies zu nutzen, müsste ich meine Vektorebene in ein Raster konvertieren und dann die Statistik berechnen.

Dies scheint der falsche Weg zu sein, um dies zu lösen. Es gibt keine Möglichkeit, Rasterpunkte zu berücksichtigen, die zu zwei oder mehr Polygonen gehören, da sie von der Polygongrenze geschnitten werden. Ich gehe davon aus, dass polygonbasierte Statistiken damit umgehen können sollten, und gehe daher auch davon aus, dass ich noch nicht das richtige Modul gefunden habe.

Saga-gis hat wirklich viele Module. Bitte lassen Sie mich wissen, welches für diese Anwendung das richtige ist.

stn
quelle
Ich versuche die Lösung von Rudivonstaden und die folgenden Fehlermeldungen werden angezeigt, wenn ich die letzten beiden Befehle eingebe: >>> zonalstats = qgis.analysis.QgsZonalStatistics (Vektorebene, Rasterdatei) Traceback (letzter Aufruf): Datei "<Eingabe>" , Zeile 1, in <Modul> AttributeError: 'Modul' Objekt hat kein Attribut 'Analyse' >>> zonalstats.calculateStatistics (Keine) Traceback (letzter Aufruf zuletzt): Datei "<Eingabe>", Zeile 1, in <Modul > NameError: Name 'zonalstats' ist nicht definiert. Ich frage mich, ob die Befehle korrekt sind oder ob die von mir verwendete Rasterdatei das richtige Format hat. Vielen Dank!
Dan Wolf
Hallo Dan. Stackexchange funktioniert etwas anders als ein Forum. Das Ziel ist eher eine Interaktion mit Fragen und Antworten als eine ständige Diskussion. Wenn die Antworten auf die ursprüngliche Frage nicht das auflösen, was Sie wissen müssen, sollten Sie entweder im Kommentarbereich eine Erläuterung anfordern oder eine neue Frage stellen.
Jay Guarneri
Danke für deinen Kommentar, Dan. Bei meiner Antwort fehlte eine notwendige Import-Anweisung, die nun behoben werden sollte.
Rudivonstaden

Antworten:

22

Ich hatte Mühe, genau dasselbe zu tun, aber aus verschiedenen Gründen bin ich der Verwendung von QGIS verpflichtet. Ich habe versucht, v.rast.stats mit dem GRASS-Plugin und auch mit dem Sextante-Plugin zu verwenden. Letzterer Ansatz ist fehlgeschlagen, da er die Statistiken an eine temporäre Vektorebene anzuhängen scheint, die dann gelöscht wird. Das GRASS-Plugin hat funktioniert, behandelt aber keine überlappenden Polygone.

Nach einigem Herumstöbern (in der Quelle des vielversprechend klingenden ZonalStats-Plugins) stellte ich fest, dass QGIS tatsächlich in die API integrierte Methoden für zonale Statistiken enthält, die auch Python-Bindungen enthalten. Solange Sie nur suchen count, sumund meanStatistiken für Ihre Polygon - Features, die Python - Konsole (Plugins> Python - Konsole) ist derzeit der einfachste Weg , die Statistiken auf die Polygon - Attributtabelle zu befestigen.

  1. Wählen Sie Ihren Raster-Layer im Inhaltsverzeichnis aus und geben Sie Folgendes in die Konsole ein (der Name der Quelldatei Ihres Raster-Layers wird abgerufen).

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

  2. Wählen Sie Ihre Vektorebene aus und führen Sie den folgenden Befehl in der Konsole aus (die Vektorebene selbst wird erfasst).

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

  3. Führen Sie die folgenden drei Befehle in der Konsole aus (sie übergeben die Vektorebene und die Rasterdatei an den in QGIS integrierten Zonenstatistikrechner).

    >>> import qgis.analysis

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

    >>> zonalstats.calculateStatistics(None)

Die Ergebnisse werden als zusätzliche Felder in der Polygonebene angehängt.

Zonenstatistik

Beachten Sie, dass Sie, wenn Sie den neuen Feldern ein Präfix hinzufügen möchten (anstatt sie nur als Summe, Mittelwert und Anzahl zu haben), den ersten Befehl in Schritt 3 durch den folgenden ersetzen würden (vorausgesetzt, Sie möchten 'zonal_' als verwenden) das Präfix:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")
rudivonstaden
quelle
1
+1 qgis.analysis.QgsZonalStatistics ()
Aaron
Es gibt ein Zonal Statistics-Plugin in QGIS, sodass Sie die genannten Befehle wahrscheinlich nicht selbst ausführen müssen: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Ich frage mich, warum es keine Möglichkeit gibt, Maximum und Minimum zu berechnen Werte als auch.
Matandked
Ich habe Ihre Technik verwendet, aber es löscht einige Polygone :(
Niahoo
6

Endlich gefunden: Öffnen Sie in Saga-GIS Kategorie-Polygone und Datengitter und dann Formen-> Gitter-> Gitterwert-> Gitterstatistik für Polygone

stn
quelle
3

Mit PostGIS geht das ganz einfach. Siehe dieses Tutorial: http://trac.osgeo.org/postgis/wiki/WKTRasterTutorial01

Pierre Racine
quelle
THX für die Idee. Ich hatte gehofft, dies zu erreichen, ohne eine weitere Software hinzuzufügen und zu erlernen. Ich werde jedoch PostGIS für später im Auge behalten.
Stn
3

Dieses Problem scheint schon vor einiger Zeit gelöst worden zu sein, aber ich werde trotzdem meinen Löffel in die Suppe geben, da ich vor kurzem selbst einige Rasterstatistiken brauchte.

Die von rudivonstaden beschriebene QGIS-Methodik hat wie ein Zauber funktioniert, danke für den Tipp. In meinem Fall wollte ich jedoch auch die minimalen und maximalen Werte und die Standardwerte für die Rasterwerte in meinen Polygonen kennen, und diese Funktionalität konnte ich in QGIS nicht finden. Ich fand eine Lösung durch die Funktion isectpolyrst in GME , die für die Lösung von GIS-Problemen bei mir am beliebtesten ist. Diese Funktion gab mir genau die Statistiken, die ich brauchte, und zwar ziemlich schnell.

PS. GME hat eine bedauerliche Abhängigkeit (ArcGIS). Obwohl das Programm selbst für alle frei verfügbar ist, benötigen Sie ArcGIS, um es auszuführen. Wenn Sie jedoch über ArcGIS (eine beliebige Lizenzstufe) verfügen, sollten Sie es ausprobieren.

BEARBEITEN:

Ich habe die Statistiken bekommen, die ich wollte, aber später habe ich herausgefunden, dass ich nach dem Betrachten der tatsächlichen Zahlen ein wenig hastig zu Schlussfolgerungen gekommen bin. Sie erhalten Statistiken, ja, aber nur für die erste Band in einem Raster. Wenn Sie also mit einem 3-Band-Rasterbild arbeiten, sind die Statistiken unvollständig. Ich hätte in meinem ursprünglichen Beitrag auf die Anzahl der Kanäle hinweisen sollen. Verwenden Sie SAGA-GIS am besten wie oben beschrieben, wenn Sie mit Multiband-Rasterbildern arbeiten.

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

berechnet standardmäßig nur Count, Sum und Mean (wie Sie Raster -> Zonal Statisticsin QGIS Desktop sehen können, kann es viel mehr).

Wenn Sie zum Beispiel nur den Mittelwert berechnen möchten, müssen Sie Folgendes verwenden:

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

Siehe API für alle Optionen.

Fitzroy Hogsflesh
quelle