Verwenden Sie das QGIS Zonal Stats Plugin von Python Console?

9

Ich verwende das Zonal Stats-Plugin in QGIS, um Rasterstatistiken aus überlagerten Polygonen zu extrahieren (ich habe Shapefiles der Artenverteilung und möchte Umweltdaten aus dem Bereich der einzelnen Arten extrahieren). Ich habe ungefähr 300 Dateien, aus denen ich Daten abrufen muss, und möchte daher ein Skript schreiben, das in der Python-Konsole ausgeführt wird. Ich bin jedoch ein absoluter Neuling in Python und habe keine Ahnung, wie das geht.

Thomas
quelle
Tschad - ja, es ist eine ähnliche Frage, aber sie ist spezifischer. Niemand hat die andere Frage beantwortet, stattdessen schlugen sie andere Wege zur Lösung des Problems vor. Ich weiß nicht, wie ich den anderen Beitrag löschen soll
Thomas
In der anderen Frage habe ich Sie auf ein R-Skript hingewiesen, das in der Lage ist, was Sie wollen, und Sylvester Sneekly hat Ihnen die genaue Methode in Python genannt. Wenn Sie nicht daran gewöhnt sind, in Python oder r zu codieren, helfen Ihnen alle weiteren Hinweise nicht weiter. Sie benötigen ein selbstcodiertes Skript oder viele Mausklicks. Lernen Sie etwas Codierung, probieren Sie die Beispiele aus und melden Sie sich zurück, wenn etwas nicht funktioniert.
Curlew
@Curlew - Sylvesters Methode klingt zwar sehr gut, würde aber eine enorme Lernkurve für mich darstellen, und ich habe im Moment keine Zeit dafür. Ich schätze Sylvesters Hilfe, aber es war nicht die einfache Antwort, nach der ich gesucht habe. Ich dachte, ich hätte den größten Teil des Codes, nach dem ich in dem Beitrag gesucht habe, den ich in meiner anderen Frage erwähnt habe ( gis.stackexchange.com/questions/23203/… ). Wenn Sylvesters Methode der einzige Weg ist, dies in Python zu tun, habe ich vielleicht unterschätzt, wie schwierig es sein würde.
Thomas
@Curlew - Ihr R-Skript funktioniert tatsächlich, danke. Das einzige, was ich noch ausarbeiten muss, ist, wie ich die in R zurückgegebenen Ergebnisse an die DBF-Datei für meine Shapefiles anhänge (jede Hilfe hierzu wäre sehr dankbar).
Thomas

Antworten:

13

Der folgende Code funktionierte für mich QGis 1.8.0

Sie können dies ändern, um mehrere Dateien mit einer Schleife aufzunehmen.

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
quelle
Groß. Vielen Dank Vinayan, genau das habe ich gesucht.
Thomas
Siehe auch hier für eine alternative Lösung mit R
Thomas
froh, dass es dir geholfen hat!
Vinayan
@vinayan Der QProgressDialog ist nützlich für visuelle Umgebungen, in denen Sie sehen möchten, wie weit die Berechnungen fortgeschritten sind. Es hat keine Verwendung über die Befehlszeile. Sie können Noneals Parameter verwenden und es funktioniert gut. Dann brauchen Sie weder die From- PyQt4..Zeile noch die progressDialog = Zeile. Siehe ähnlichen Beitrag unter gis.stackexchange.com/questions/23203/…
rudivonstaden
@ Rudivonstaden - das macht jetzt Sinn .. Ich habe die Antwort aktualisiert
Vinayan
2

Hier erfahren Sie, was Sie in SAGA GIS wollen. Dies ist wahrscheinlich nicht die gewünschte Lösung, aber es funktioniert. Ich werde die Gründe untersuchen, warum meine Plugins fehlschlagen, und sie so schnell wie möglich aktualisieren.

Installieren Sie SAGA GIS (sollte auch über apt-get oder aptitudbe in Ihrer Linux-Distribution verfügbar sein).

  • Starten Sie SAGA, laden Sie Ihre Raster- und Vektorform (Menümodule -> Datei -> GDAL / OGR-Import). Sie können den Prozess unten sehen.
  • Führen Sie das Modul "Rasterstatistik für Polygone" aus (Menümodule -> Form -> Raster -> Rasterwerte). Werte werden direkt zur Tabelle hinzugefügt. Der Dialog sollte so aussehenGeben Sie hier die Bildbeschreibung ein
  • Gehen Sie zur Registerkarte "Daten" im Arbeitsbereich, klicken Sie mit der rechten Maustaste auf Ihre Vektorebene und wählen Sie " Speichern unter ", um die Form mit den hinzugefügten Attributen zu exportieren. Sie können die Attributtabelle auch per Rechtsklick anzeigen und dann auf Tabellenshow klicken

Dies funktioniert für den Datensatz, den Sie mir gesendet haben. Es ist auch möglich, SAGA-Module in QGIS über SEXTANTE als BATCH-Prozess aufzurufen. Aktivieren Sie dazu einfach die SAGA-Module in den SEXTANTE-Optionen.

Brachvogel
quelle
Vielen Dank für den Vorschlag, aber ich habe bereits die Saga ausprobiert - die Ergebnisse waren inkonsistent, dh zweimal dasselbe zu tun ergab unterschiedliche Ergebnisse. Ich weiß, dass das ZonalStats-Plugin in QGIS funktioniert, daher bin ich auf der Suche nach einer Möglichkeit, ZonalStats zu automatisieren.
Thomas
@vinayan Ich habe den Code, den Sie für zonale Statastik angegeben haben, aber es erstellt die Spalten in der Polygonvektorebene, aktualisiert aber nicht die berechneten Werte. Wieso ist es so?
user99
2
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)

berechnet standardmäßig nur Anzahl, Summe und Mittelwert (wie Sie Raster -> Zonal Statisticsin QGIS Desktop erkennen können, kann es viel mehr).

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

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

Alle Optionen finden Sie unter API .

Fitzroy Schweinefleisch
quelle
Kann jemand bei der Syntax helfen, um zwei Statistiken der Wahl gleichzeitig zu erhalten, sagen Min & Max? Ich habe verschiedene Wege ausprobiert, aber keinen Erfolg
Dorakiara
In Qgis 3 müssen Sie den Pfad der Rasterdatei durch die Rasterdatei selbst ersetzen! Daher wird rasterFilePath = 'F: /temp/zonalstat/raster1.tif' zu: rasterFile = QgsRasterLayer ('F: /temp/zonalstat/raster1.tif', 'raster'). Dann ändern Sie den rasterFilePath in die rasterFile in der ZoneStat Befehl zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (Keine)
philsch