Mit dem Ausdruckseditor verfügt QGIS über ein sehr mächtiges Werkzeug zur Datenabfrage und Datenmanipulation. Neben der Vielzahl an Text-, Geometrie- und Mathematikfunktionen gibt es auch die Möglichkeit, eigene Funktionen für den Ausdruckseditor mit Python zu erstellen.
Der folgende Artikel zeigt, wie wir mit wenig Pythoncode eine Reverse-Geocoding-Funktion erstellen, also eine Funktion, die zu gegebenen Koordinaten die Adresse ermittelt. Neben dem Aufbau des Werkzeugs geht es darum, wie die Funktion in einem Eingabeformular verwendet werden kann und was zu beachten ist, wenn eigene Funktionen für den QGIS-Ausdruckseditor erstellt werden.
In den QGIS-Python-Kursen der FOSS Academy haben wir für die Erstellung von eigenen Ausdruckseditor-Funktionen bisher immer ein Skript zur Erzeugung von Donut-Geometrien verwendet. Da aber Donuts weder in QGIS noch in der Bäckerei besonders spannend sind, stelle ich hier ein anderes interessantes Thema vor: das Ermitteln einer Adresse aus Geokoordinaten mittels des Nominatim Webdienstes von OpenStreetMap.
Im konkreten Fall wollen wir in einem neuen Punktthema "POI" die Adresse im Erfassungsformular mit der gefundenen Adresse von Nominatim vorbelegen. Dazu öffnen wir die Eigenschaften des Themas und navigieren zum Formular. Dort aktivieren wir das Feld "Adresse" und gehen in den Eigenschaften zu den Vorgabewerten. Hier klicken wir auf das "Epsilon"-Symbol, darauf öffnet sich der Ausdruckseditor.
Im Ausdruckseditor aktivieren wir den Reiter Funktionseditor, siehe Abb. 2 (1) und klicken auf das PLUS Symbol am unteren Ende (2). Nun geben wir einen Dateinamen für die Pythonfunktion ein und eine neue Template-Funktion "my_sum" erscheint. Diese Funktion können wir nun mit dem Code aus diesem Python-Skript ersetzen.
Schauen wir uns nun die Funktion im Einzelnen etwas genauer an (3):
Für den Zugriff auf den aktuellen Layer zur Berechnung der Layerprojektion benötigen wir die Klasse iface, für den Zugriff auf Nominatim benötigen wir die Bibliotheken urllib und json. Diese laden wir in den Zeilen 4 und 5 des Codes.
Zeile 7:
@qgsfunction(args='auto', group='Custom')
Hier wird festgelegt, in welcher Gruppe die neue Funktion im Ausdruckseditor erscheint und wie die Anzahl der Parameter automatisch ermittelt wird.
Zeile 8:
def reverse_geocode(feature, parent)
Definition unserer Funktion: Wir rufen diese mit den beiden Parametern feature und parent auf, diese beiden sind Pflicht und brauchen anschließend nicht mehr explizit übergeben werden. feature ist das aktuelle Feature, z. B. bei der Digitalisierung eines Punktes der aktuelle Punkt. Darüber können wir dann dessen Geometry ermitteln. Zusätzlich wird im Code noch das Layer-CRS ermittelt und gegebenfalls die Geometrie transformiert (Zeilen 19-23), sodass im Anschluss die Koordinaten im Koordinatensystem WGS84 (4326) vorliegen.
Zeile 28:
url = "http://nominatim.openstreetmap.org/reverse?format=json&lat={}&lon={}&zoom=18&addressdetails=1&limit=1".format(y,x)
Hier wird nun die Anfrage mit den ermittelten Koordinaten zusammengesetzt und in den Zeilen 29-34 der Rückgabewert des Dienstes – in diesem Fall ein JSON-Objekt – ausgewertet.
Nun können wir die neue Funktion direkt in unser Erfassungsformular integrieren und das Feld "Adresse" dadurch vorbelegen lassen.
Bei der Programmierung eigener Funktionen für den Ausdruckseditor ist allerdings Vorsicht geboten, denn die Python-Funktionen werden direkt beim Start von QGIS eingelesen und ausgewertet. Wurde aus Versehen ein Bug programmiert, also z. B. eine Variable falsch geschrieben, kann dies beim QGIS-Start zum Verhängnis werden – im schlimmsten Fall startet QGIS nicht mehr. Da QGIS die Funktionen jedoch in das Profilverzeichnis des Nutzers legt, können Korrekturen auch ohne Zugriff auf QGIS korrigiert werden. Hierzu navigieren wir mit einem Dateimanager zu dem aktuellen Profilverzeichnis:
Die Python-Dateien sind im Unterverzeichnis \Profilname\python\expressions zu finden. Hier kann der Fehler behoben oder die falsche Datei entfernt werden, damit QGIS wieder ohne Probleme starten kann.
Im folgenden Video sind alle Arbeitsschritte noch einmal aufgezeichnet:
Wenn Dich weitere Tipps und Tricks zu QGIS interessieren, empfehlen wir diese QGIS-Blogposts: