Mit der Pythonprogrammierung loslegen (QGIS3)

QGIS hat eine mächtige Schnittstelle zur Programmierung, die sowohl die Funktionalität der Software erweitert als auch die Automatisierung von Aufgaben ermöglicht. QGIS unterstützt die bekannte Scriptsprache Python. Selbst als Anfänger hilft das Erlernen kleiner Teile Pythons und der QGIS Programmierschnittstelle, effektiver und produktiver zu arbeiten. Diese Anleitung setzt keine Programmierkenntnisse voraus und möchte eine Einleitung zur Python Script Erstellung in QGIS (PyQGIS) geben.

Überblick über die Aufgabe

Wir werden einen Punkt-Vektorlayer mit den wichtigen Flughäfen laden und dann ein Python script nutzen, um eine Textdatei mit Name, Code, Breitengrad und Längengrad für jeden enthaltenen Flughafen zu erstellen.

Beschaffung der Daten

Wir werden folgenden Datensatz von Natural Earth nutzen: Airports <http://www.naturalearthdata.com/downloads/10m-cultural-vectors/airports/>.

Lade folgende Datei herunter: Airports shapefile.

Arbeitsablauf

  1. Suche die Datei ne_10m_airports.zip im QGIS Browser und erweitere sie. Wähle die Datei ne_10m_airports.shp und ziehe sie in den Arbeitsbereich.

../../_images/160.png
  1. Wir sehen, das die Datei ne_10m_airports in QGIS geladen wurde.

../../_images/236.png
  1. Wähle das Abfrage Tool und klicke auf einen der Punkte um die vorhandenen Attribute zu sehen. Man bemerkt, dass der Name des Flughafens im Attribut name und der 3-ziffrige Code im Attribut iata_code hinterlegt sind. Wir können das Fenster Abfrageergebnisse schließen.

../../_images/326.png
  1. QGIS beinhaltet eine Konsole, in der man Python Kommandos eingeben kann und das Resultat erhält. Die Konsole ist eine großartige Möglichkeit, um die Scripterstellung zu lernen oder auch zur schnellen Datenverarbeitung. Öffne die Python-Konsole unter Plugins ‣ Python Console.

../../_images/412.png
  1. Wir sehen unter dem QGIS Arbeitsbereich ein neues Eingabefeld. Unten im Eingabefeld sehen wir das Eingabezeichen >>> wo wir Kommandos eingeben können. Um mit der QGIS Umgebung zu interagieren, müssen wir die Variable iface nutzen. Um auf den aktuell aktiven Layer in QGIS zuzugreifen, geben wir das folgende Kommando gefolgt von Enter ein. Dieses Kommando stellt einen Bezug zum aktuell geladenen Layer her und speichert ihn in der Variable layer.

layer = iface.activeLayer()
../../_images/513.png
  1. Es gibt eine praktische Funktion in Python, genannt dir(), die alle verfügbaren Methoden für ein Objekt auflistet. Das ist nützlich, wenn man sich nicht sicher ist, welche Funktionen für ein Objekt verfügbar sind. Gebe das folgende Kommando ein, um zu sehen, welche Operationen mit der layer Variable möglich sind.

dir(layer)
../../_images/613.png
  1. Man sieht nun eine lange Liste der verfügbaren Funktionen. Zuerst werden eine Funktion genannt getFeatures() nutzen, die einen Bezug auf alle Features in einem Layer herstellt. In unserem Fall ist ein Feature ein Punkt, der einen Flughafen repräsentiert. Wir können das folgende Kommandeo eingeben, um alle Features des aktuellen Layers aufzulisten.

Bemerkung

Einrückung (oder die Anzahl an Leerstellen vor jedem Kommando) ist in Python sehr wichtig. Wenn wir bei der vorherigen Eingabe eine Fehlermeldung erhalten, müssen wir sicher stellen, dass am Beginn der zweiten Zeile 2 Leerstellen vorhanden sind.

Da das print(f) Kommando innerhalb einer for-Schleife ausgeführt wird, müssen wir nach Eingabe des Kommandos zweimal Enter drücken - einmal um die Schleife zu verlassen und das andere Mal um das Kommando auszuführen.

for f in layer.getFeatures():
  print(f)
../../_images/7.gif
  1. Wir wir an der Ausgabe erkennen, enthält jede Zeile einen Bezug zu einem Feature des Layers. Der Bezug zum Feature ist in der Variable f gespeichert. Wir können die Variable f nutzen, um auf die Attribute aller Features zuzugreifen. Gebe folgendes ein, um name und iata_code für alle Flughäfen auszugeben.

for f in layer.getFeatures():
  print(f['name'], f['iata_code'])
../../_images/8.gif
  1. Wir wissen nun schon, wie man mit Programmierung auf die Attribute jedes Features eines Layers zugreifen kann. Als nächstes wollen wir auf die Koordinaten eines Features zugreifen. Auf die Koordinaten eines Vektor-Features kann man mit Hilfe der Funktion geometry() zugreifen. Diese Funktion gibt ein Geometrieobjekt zurück, das wir in der Variable geom speichern können. Wir können die Funktion asPoint() mit dem Geometrieobjekt nutzen, um die x und y Koordinaten des Punktes zu erhalten. Wenn unser Feature eine Linie oder ein Polygon ist, können wir die Funktionen asPolyline() oder asPolygon() verwenden. Gebe folgenden Programmkode ein und drücke Enter, um die x und y Koordinaten jedes Features zu sehen.

for f in layer.getFeatures():
  geom = f.geometry()
  print(geom.asPoint())
../../_images/9.gif
  1. Und wenn man nur die x Koordinate eines Features erhalten möchte? Wir können die Funktion x() auf dem Punktobjekt aufrufen und erhalten seine x-Koordinate zurück.

for f in layer.getFeatures():
  geom = f.geometry()
  print(geom.asPoint().x())
../../_images/10.gif
  1. Jetzt haben wir alle Teile zusammen, um die gewünschte Ausgabe zu erzeugen. Gebe folgenden Programmcode ein, um den Namen, iata_code, geographische Breite und geographische Länge für alle Flughafenfeatures auszugeben. Wir benutzen hier die Methode .format(), die uns mehr Kontrollmöglichkeiten zur Ausgabe mehrerer Variablen bietet. Die Notation .2f begrenzt die Anzahl der Kommastellen für die Koordinaten auf 2.

for f in layer.getFeatures():
  geom = f.geometry()
  print('{},{},{:.2f},{:.2f}'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x()))
../../_images/11.gif
  1. Wir sehen die Ausgabe des Ergebnisses in der Konsole. Nützlicher ist es, die Ausgabe in einer Datei zu speichern. Wir können folgenden Programmkode eingeben, um eine Ausgabedatei zu erzeugen und das Ergebnis dort abzuspeichern. Ersetze den Dateipfad mit einem eigenen lokalen Pfad. Beachte, dass wir \n am Ende der Zeilenformatierung verwenden. Dies fügt nach den Daten jedes Features einen Zeilenwechsel hinzu.

Bemerkung

Der Programmkode unten enthält 2 Stufen. Stelle sicher, dass die Zeile 3 mit 4 Leerzeichen beginnt.

with open('/Users/ujaval/Desktop/airports.txt', 'w') as file:
  for f in layer.getFeatures():
    geom = f.geometry()
    line = '{},{},{:.2f},{:.2f}\n'.format(f['name'], f['iata_code'], geom.asPoint().y(), geom.asPoint().x())
    file.write(line)
../../_images/12.gif
  1. Wir können nun zu dem gewählten Dateipfad gehen und die Text-Datei öffnen. Wir sehen die Daten aller Flughafen, die wir aus der shape-Datei der Flughäfen mit Hilfe von Python-scripting extrahiert haben.

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