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¶
Suche die Datei
ne_10m_airports.zip
im QGIS Browser und erweitere sie. Wähle die Dateine_10m_airports.shp
und ziehe sie in den Arbeitsbereich.
Wir sehen, das die Datei
ne_10m_airports
in QGIS geladen wurde.
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 Attributiata_code
hinterlegt sind. Wir können das Fenster Abfrageergebnisse schließen.
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
.
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 Variableiface
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 Variablelayer
.
layer = iface.activeLayer()
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 derlayer
Variable möglich sind.
dir(layer)
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)
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 Variablef
nutzen, um auf die Attribute aller Features zuzugreifen. Gebe folgendes ein, umname
undiata_code
für alle Flughäfen auszugeben.
for f in layer.getFeatures():
print(f['name'], f['iata_code'])
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 Variablegeom
speichern können. Wir können die FunktionasPoint()
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 FunktionenasPolyline()
oderasPolygon()
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())
Und wenn man nur die
x
Koordinate eines Features erhalten möchte? Wir können die Funktionx()
auf dem Punktobjekt aufrufen und erhalten seine x-Koordinate zurück.
for f in layer.getFeatures():
geom = f.geometry()
print(geom.asPoint().x())
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()))
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)
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.
If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)