Verarbeitungsroutinen mit Python ausführen (QGIS3)

Die QGIS-Verarbeitungswerkzeuge enthalten eine ständig wachsende Sammlung an Geoverarbeitungswerkzeugen. Die Verarbeitungswerkzeuge besitzen eine einfache Oberfläche zur Stapelverarbeitung von vielen Eingangsdaten. Siehe Stapelverarbeitung mit dem Processing Framework (QGIS3). Es gibt aber Fälle in denen man die Stapelverarbeitung durch eigene Anpassungen erweitern möchte. Alle Verarbeitungsalgorithmen können auch über die Python API gestartet werden. Diese Anleitung zeigt, wie man einen angepassten Verarbeitungsalgorithmus mit Hilfe der Python Konsole startet. Dazu sind nur einige wenige Zeilen Programmiercode erforderlich. Unter Mit der Pythonprogrammierung loslegen (QGIS3) kann man sich mit den Grundlagen der Python Scripting Umgebung in QGIS vertraut machen.

Überblick über die Aufgabe

Wie werden 12 Layer mit Rastergittern der Monatsniederschläge verwenden, um den mittleren monatlichen Niederschlag je Postleitzahlengebiet im Gebiet um Seattle zu bestimmen.

Weitere Fähigkeiten die wir erlernen

  • Wie man eine Spalte (d.h. ein Attributfeld) eines Vektorlayers löscht.

Beschaffung der Daten

The PRISM Climate Group sammelt klimatische Daten und stellte historische und aktuelle Daten für die USA und angrenzende Gebiete bereit. Gehe zum Tab Recent Years und lade die monatlichen Niederschlagsdaten für das Jahr 2017 im Format BIL herunter.

../../_images/data14.png

City of Seattle Open Data portal stellt Daten der Stadt als Opendata zur Verfügung. Suche folgende Datei und lade sie im shape-Format herunter: Zip Codes.

Der Einfachheit halber können wir beide Datensätze unter folgenden links herunterladen:

PRISM_ppt_stable_4kmM3_2017_all_bil.zip

Zip_Codes.zip

Datenquelle [PRISM] [CITYOFSEATTLE]

Arbeitsablauf

  1. Entpacke die die Datei PRISM_ppt_stable_4kmM3_2017_all_bil.zip. Gehe im QGIS Browser zum Ordner PRISM_ppt_stable_4kmM3_2017_all_bil und erweitere ihn. Der Ordner enthält 12 Layer für jeden Monat. Halte die Taste Ctrl gedrückt und wähle die 12 Dateien mit der Endung .bil aus. Ziehe die Dateien danach in den Arbeitsbereich.

../../_images/1105.png

Bemerkung

Die Daten liegen in folgendem Format vor: BIL format. Zu jedem Layer gehören mehrere Dateien. Die Datei mit der Endung .bil enthält die aktuellen Daten, die Datei mit der Endung .hdr beschreibt die Datenstruktur und die Datei mit der Endung .prj enthält die Information zur Projektion des Koordinatensystems.

  1. Als nächstes entpacken wir die Datei Zip_Codes.zip. Wir suchen den Ordner Zip_Codes und ziehen die Datei Zip_Codes.shp aus dem Ordner in den Arbeitsbereich.

../../_images/260.png

Bemerkung

The unzip step is important because the Zonal Statistics algorithm works by adding a new field to the layer. If the layer is zipped, QGIS cannot update the layer.

  1. Wir klicken mit der rechten Maustaste auf den Layer Zip_Codes und wählen Auf den Layer zoomen. Jetzt sehen wir die Polygone der Postleitzahlen für die Stadt Seattle und Umgebung.

../../_images/338.png
  1. Gehe zu Verarbeitung ‣ Werkzeugkiste.

../../_images/422.png
  1. Der Algorithmus, um Rasterlayer auf Basis eines überlagerten Vektorlayers abzutasten ist als „Zonenstatistik“ bekannt. Suche nach dem Algorithmus in den Verarbeitungswerkzeugen. Wähle den Algorithmus aus und bewege den Mauszeiger darüber. Wir sehen einen Hinweis mit dem Text Algorithmen Kennung: ‚qgis:zonalstatistics‘. Beachte, dass diese Kennung für den Aufruf des Algorithmus mit der Python API benötigt wird. Klicke doppelt auf den Algorithmus Zonenstatistik, um ihn zu starten.

../../_images/522.png
  1. Wir werden zuerst einen manuellen Test mit einem Layer durchführen. Das ist ein praktischer Weg, um zu sehen, wie sich der Algorithmus verhält und um herauszufinden, wie man die relevanten Parameter mit Python an den Algorithmus übergeben kann. Wir geben im Dialogfenster Zonenstatistik die Datei PRISM_ppt_stable_4kmM3_201701_bil als Rasterlayer und Zip_Codes als Zonenvektorlayer an. Die anderen Parameter lassen wir auf den Voreinstellungen. Klicke auf den Knopf neben Zu berechnende Statistik und wähle nur Mittel aus. Klicke auf Starte.

../../_images/622.png
  1. Nachdem die Berechnung abgeschlossen wurde, gehen wir zum Log tab. Wir machen uns eine Notiz der Eingabeparameter die an den Algorithmus übergeben wurden und klicken auf Schließen.

../../_images/721.png
  1. Wir sehen uns das Ergebnis der Berechnung an. Im QGIS Hauptfenster klicken wir mit der rechten Maustaste auf den Layer Zip_Codes und wählen Attributtabelle öffnen. Der verwendete Algorithmus verändert den Eingabelayer und fügt für jede berechnete Statistik eine neue Spalte hinzu. Da wir nur Mittel gewählt hatten, wurde eine neue Spalte _mean zur Tabelle hinzugefügt. Das Zeichen _ wird als Standard Prefix verwendet. Wenn wir den Algorithmus für die Layer aller Monate starten, ist es sinnvoll einen angepassten Prefix wie z.B. die Monatsnummer (01_mean, 02_mean usw.) zu verwenden. Damit sind die Werte einfach einem Monat zuzuordnen. Die Verwendung eines angepassten Präfixes ist innerhalb der Stapelverarbeitung von QGIS nicht möglich. Man müsste hier manuell für jeden Layer den angepassten Prefix eingeben. Wenn man mit vielen Layern arbeitet, ist das sehr mühsam. Wir nutzen daher die Python API, um die Anpassung mit Hilfe einer For-Schleife zu erreichen.

../../_images/821.png
  1. Bevor wir fortfahren, löschen wir die Spalte _mean, die während des Tests erstellt wurde. Klicke auf den Knopf Bearbeitungsmodus umschalten und danach auf den Knopf Spalte löschen. Wähle das Feld _mean und klicke auf OK.

../../_images/921.png
  1. Klicke noch einmal auf den Knopf Bearbeitungsmodus umschalten und Speichern, um die Änderung zu speichern.

../../_images/1021.png
  1. Zurück im QGIS Hauptfenster gehen wir zu Erweiterungen ‣ Python-Konsole.

../../_images/1125.png
  1. Um den Algorithmus mittels Python zu starten, müssen wir auf alle Layernamen zugreifen. Wir geben den folgenden Programmkode in der Python-Konsole ein und drücken Enter. Man sieht nun, wie die Namen aller Layer in der Konsole angezeigt werden.

root = QgsProject.instance().layerTreeRoot()
for layer in root.children():
  print(layer.name())
../../_images/121.gif
  1. Um einen angepassten Prefix zu vergeben, müssen wir den Layernamen betrachten und die Teilzeichenkette der Monatsnummer daraus extrahieren. Gebe nachfolgenden Programmkode ein, um alle Rasterlayer durchzugehen, den angepassten Prefix zu extrahieren und den qgis:zonalstatistics Algorithmus mit diesem Präfix zu starten.

root = QgsProject.instance().layerTreeRoot()
for layer in root.children():
  if layer.name().startswith('PRISM'):
    prefix = layer.name()[-6:-4]
    params = {'INPUT_RASTER': layer.name(), 'RASTER_BAND': 1, 'INPUT_VECTOR': 'Zip_Codes', 'COLUMN_PREFIX': prefix+'_', 'STATS': 2}
    processing.run("qgis:zonalstatistics", params)
../../_images/131.gif
  1. Nachdem die Berechnung abgeschlossen wurde, klicken wir mit der rechten Maustaste auf den Layer Zip_Codes und wählen Attributtabelle öffnen.

../../_images/1420.png
  1. Wir sehen 12 neue Spalten mit dem angepassten Prefix, die den mittleren aus den Rasterlayern extrahierten Niederschlag enthalten.

../../_images/1519.png
comments powered by Disqus