| Volltext |
Der Fachvortrag zur Veranstaltung ist im Volltext verfügbar. Das PDF enthält alle Bilder und Formeln.
1 Vorstellung
1.1 Landesstraßenbaubehörde Sachsen-Anhalt
Die Landesstraßenbaubehörde (LSBB) plant, baut und betreibt für das Land Sachsen-Anhalt und die Bundesrepublik Deutschland alle Bundes- und Landesstraßen im Bereich von Sachsen-Anhalt. Sie ist in eine Zentrale, 5 Regionalbereiche und 23 Straßenmeistereien gegliedert.
Die Fachgruppe Vermessung in der Zentrale der LSBB ist vorrangig zuständig für Ingenieurvermessungen im Zusammenhang mit der Planung, dem Bau und für den Betrieb der Straßen und Ingenieurbauwerke. Zur Erledigung der Aufgabenfelder wurde in Zusammenarbeit mit dem Geoinformatikbüro Dassau GmbH ein OKSTRA® QGIS-Plug-In entwickelt, um die Bestandsvermessungen ohne Medienbrüche im Innen- und Außendienst visualisieren und prüfen zu können.
1.2 interactive instruments
Die interactive instruments GmbH ist ein Softwareunternehmen mit Sitz in Bonn, welches 1985 gegründet wurde und auf Entwicklungen im Bereich raumbezogene Informationen spezialisiert ist. Die Firma betreut seit über 20 Jahren die OKSTRA®-Pflegestelle, hat die OKSTRA®-Klassenbibliothek OKLABI entwickelt und pflegt diese. Arnold Vogelsang ist seit der Übernahme von Erstellung und Pflege für die technische Umgebung der OKLABI verantwortlich.
1.3 Über dieses Dokument
Das vorliegende Dokument besteht aus zwei Teilen, die sich einerseits mit der Erweiterung der OKLABI und andererseits mit dem neu entstandenen QGIS-Plug-In befassen. Es gibt dadurch inhaltliche Querbezüge, so dass manche Punkte mehrfach angesprochen werden.
2 Python-Schnittstelle für die OKLABI
2.1 Überblick OKSTRA®-Klassenbibliothek
Seit nunmehr rund 15 Jahren ist die OKSTRA®-Klassenbibliothek (OKLABI) als frei erhältliche Programmbibliothek im Einsatz beim Datenaustausch im OKSTRA®-Datenformat.
Die Bibliothek wurde im Auftrag der Bundesanstalt für Straßenwesen (BASt) erstellt. Anfangs vor allem als Unterstützung für Softwarehäuser gedacht, die mit dem Datenaustausch im OKSTRA®-Format zu tun haben, entwickelte sich im Laufe der Zeit eine Reihe von weiteren Anwendungsfeldern, in denen die Bibliothek eingesetzt wird:
- Werkzeuge für die Straßenplanung (primärer Einsatzzweck zu Beginn),
- OKSTRA®-Werkzeug, Online-Prüftool,
- Vermessungsdatenbank in Sachsen-Anhalt und Hessen (im Aufbau),
- Unterstützung beim bundesweiten Datenaustausch (INS, BISStra),
- Datenbereitstellung beim It-KO OkWS,
- EQUBAR-Projekt (Prüfdaten),
- QGIS-Plug-In (neu),
- …
Wesentlicher Aspekt der OKLABI ist, den Nutzer von formalen und technischen Aspekten soweit möglich zu entkoppeln, damit die fachlichen Inhalte bei der Arbeit im Fokus stehen können.
Dieser Teil des Dokuments beschreibt den Ansatz, wie die OKLABI mit der neuen Python-Programmierschnittstelle das jüngst entwickelte QGIS-Plug-In unterstützt. Über die Nutzung in QGIS hinaus ist die Python-Schnittstelle natürlich für alle Software-Entwickler frei einsetzbar, die mit dieser überaus beliebten Programmiersprache arbeiten wollen.
In den folgenden Abschnitten werden eine Menge technische Details angerissen, die nicht näher ausgeführt werden. Nachfragen aller Art über technische Aspekte können Sie jederzeit gern an die Autoren richten.
2.1.1 Schnittstellenkonzept der OKLABI
Um ein möglichst breit gefächertes Einsatzfeld erreichen zu können, wurde die Schnittstelle der OKLABI basierend auf den Resultaten einer Anwenderbefragung im Jahr 2009 aufgestellt. Dabei zeigte sich, dass die „klassischen“ Programmiersprachenumgebungen eine hohe Präferenz hatten. Interessant aus heutiger Sicht ist, dass Python seinerzeit nicht nachgefragt wurde. Die Schwerpunkte lagen klar bei C++, C, Java und C#, auch COM wurde genannt. Ferner wurde es als sehr wichtig angesehen, möglichst unabhängig von den benutzten Plattformen zu sein (Linux, Windows, 32 und 64 Bit).
Im Ergebnis entstand daraus die Schnittstelle der OKLABI mit folgender Struktur:
- Der Kern der Bibliothek ist in C++ geschrieben. Er enthält sämtliche Funktionalitäten und bindet auch (fast) alle eingesetzten Open Source Komponenten ein.
- Die Schnittstellen für Java, C und C# setzen auf der Kernbibliothek auf. Es werden sogenannte Fassaden für die Objekte der Kernbibliothek Eine Lebensdauerverwaltung wird unterstützt, damit die garbage collection in Java und C# funktionieren kann.
- Der Aufbau der neuen Python-Schnittstelle ist vergleichbar mit demjenigen der Java-Schnittstelle: Es gibt einen Anteil in der Sprache Python, der über eine C-Erweiterung die Kernbibliothek über das C-Interface nutzt (bei der Java-Schnittstelle gibt es einen Anteil in der Sprache Java, der über eine JNI-Brücke die Kernbibliothek über das C-Interface nutzt).
Das Bild 1 zeigt eine vereinfachte Darstellung der Abhängigkeiten der verschiedenen Schichten für die unterschiedlichen Sprachwelten in der OKLABI vor dem Einbau der Python-Schnittstelle. Die Open Source Bibliotheken werden hier aus Gründen der Übersichtlichkeit nicht dargestellt. Zum Verständnis reicht es hier, diese einfach unter der Kernbibliothek zu subsummieren.
Bild 1
Zu bemerken ist, dass diese Strukturen plattformunabhängig sind mit Ausnahme der mit „Nur für Windows“ gekennzeichneten Bestandteile. Die Unterstützung für die .NET Plattform unter Linux wäre heute zwar möglich, ist derzeit aber noch nicht umgesetzt.
3 Python und OKLABI
Ausgelöst durch das Bestreben der Landesstraßenbaubehörde Sachsen-Anhalt, ein QGIS-Plug-In für den Umgang mit OKSTRA®-Daten zu entwickeln, entstand im zweiten Halbjahr 2023 eine Python-Schnittstelle für die OKLABI.
3.1 Herstellung der Python-Schnittstelle
Die Python-Schnittstelle der OKLABI macht sich zunutze, dass Python durch C-Funktionalität erweiterbar ist. Daher lag es nahe, die C-Schnittstelle der OKLABI zu diesem Zweck zu nutzen. Ferner stand durch die Java-Anbindung bereits ein Grundgerüst von Werkzeugen zur Verfügung, mit denen die Herstellung der Python-Schnittstelle durchgeführt werden konnte. Das Unterfangen ist durchaus umfangreich einzuschätzen. Eine Zählung der Schnittstellenklassen und Methoden aus der OKLABI ergibt folgende Kennzahlen:
- Schnittstellenklassen: 130
- Ausnahmen: 36
- Aufzählungen: 23
- Interface-Klassen: 71
- Gesamtanzahl aller Methoden: ca. 1300
Allein die Klassen AnyType (157) und Fachobjekt (45) besitzen zusammen bereits mehr als 200 Methoden, die gebraucht werden, um OKSTRA®-Daten vollständig auslesen zu können.
Die große Zahl der zu implementierenden Methoden verbietet eine händische Bearbeitung. Der notwendige Code war deshalb automatisch zu generieren.
3.2 Struktur der Python-Schnittstelle
Die Sprache Python ist eine objektorientierte Programmiersprache, die u. a. Konzepte wie Vererbung, Enumerationen und Ausnahmebehandlung bereitstellt. Die in der OKLABI-Schnittstelle vorkommenden Konstrukte lassen sich in Python nachbilden. Es ist dabei jedoch zu beachten, dass es in Python-3 keine polymorphen Methoden innerhalb einer Klasse gibt (das heißt es ist nicht erlaubt, eine Methode mehrfach mit unterschiedlichen Parametern unter demselben Methodennamen zu definieren). Hier wird ein analoger Ansatz wie bei der C-Schnittstelle der OKLABI gewählt (Anpassung der Methodennamen durch laufende Nummern und Typnamen wenn nötig). Da es Schnittstellenklassen in der OKLABI gibt, die in Python abgeleitet werden können, muss die Kommunikation zwischen Python und der OKLABI in beiden Richtungen erfolgen können. Diese Anforderung ist bereits aus den Sprachschichten für Java und C# bekannt.
3.2.1 Python-Komponente
Es wird die Sprachumgebung Python-3 eingesetzt. Die Definitionen der Objektwelt aus der OKLABI-Schnittstelle werden in der Sprache Python nachgebildet. Dadurch werden die Objektklassen aus der OKLABI wie z. B. Datenbestand, Fachobjekt oder Objektart nativ in der Sprache Python verfügbar. Alle Aufzählungen der OKLABI werden als Enumerationen in Python nachgebildet und für alle Ausnahmen der OKLABI werden Ausnahmetypen in Python angelegt. Es entsteht so ein Modul oklabi.py, das in Python importiert werden kann. Dieses Modul basiert auf dem zugehörigen C++-Modul COklabimodule.cpp (siehe auch im folgenden Abschnitt), über das die OKLABI-Schnittstellen aufgerufen werden.
Python-Objekte werden in der Schnittstelle als Fassaden angelegt. Das bedeutet, es handelt sich um flache Objekthüllen, die als einzigen Inhalt einen Verweis auf die nativen Objekte der OKLABI-Kernbibliothek tragen. Dabei werden keine Pointer auf Objekte gespeichert, sondern Objektkennungen. Dieses Verfahren ist erprobt in den Interface-Wrappern für C# und Java, es wird für Python analog übernommen. Damit ergibt sich auch derselbe Referenzählungsmodus wie bei den anderen Sprachen (die OKLABI unterstützt in ihrer Schnittstelle eine Referenzzählung, was diese Vorgehensweise ermöglicht). Basisdatentypen (z. B. Strings oder numerische Datentypen) werden in der jeweiligen Repräsentierung für Python dargestellt.
3.2.2 C-Komponente für Python
Unter Nutzung der gängigen Vorgehensweise zur Erweiterung von Python durch C-Funktionen wird ein Modul mit Namen COklabimodule.cpp generiert. Darin enthalten sind die Schnittstellen, die Python benötigt, um Funktionen aus der OKLABI aufrufen zu können. Details zur Art und Weise der Implementierung können der Python-Dokumentation entnommen werden, siehe z. B. hier: https://docs.python.org/3/extending/extending.html
In einem weiteren, händisch gepflegten C-Modul py_aux.inc werden zusätzliche Schnittstellen angelegt, die allgemeine Hilfsroutinen für die Wrapperschicht enthalten.
Das Hilfsmodul py_aux.inc wird in COklabimodule.cpp per include-Anweisung eingebunden, damit es nur eine einzige Übersetzungseinheit gibt. Die Herstellung der Bibliothek für die C-Erweiterung erfolgt mit Python-Mitteln.
3.2.3 Erweiterungen in der OKLABI
Speziell für die Anbindung von Python-Objekten, die aus einer Schnittstellenklasse der OKLABI ableiten, muss analog zu C# und Java eine Erweiterung eingeführt werden, die Callbacks aus der OKLABI in die Python-Umgebung weiterleitet. Im OKLABI-Quelltext wird dabei keine explizite Abhängigkeit auf Python-Komponenten (z. B. Include von Python.h) eingebracht. Diese Erweiterung der OKLABI dient dem Zweck, die Laufzeitumgebungen von C++ und Python miteinander kommunizieren zu lassen.
Mit Einführung der Python-Schnittstelle ändert sich das Blockbild aus dem früheren Abschnitt auf die nachfolgend dargestellte Weise. Es ist zu erkennen, dass sich die neue Schnittstelle nahtlos in das vorhandene Konzept einfügt.
Bild 2
3.3 Einsatzbereiche
3.3.1 Voraussetzungen
Die Python-Schnittstelle der OKLABI steht für Windows- und Linuxumgebungen zur Verfügung. Für die jeweilige Umgebung ist die Bibliothek mit der C-Erweiterung und den OKLABI-Bibliotheken zu verteilen. Dazu gehören ebenso die Ressourcen, die für den Gebrauch der OKLABI unabdingbar sind.
3.3.2 Benutzung
Um das neue Interface der OKLABI benutzen zu können, muss in Python lediglich ein import-Befehl ausgeführt werden. Danach steht die OKLABI-Schnittstelle zur Verfügung. Wie bei den anderen Programmierschnittstellen auch wird die Lektüre des OKLABI-Handbuchs für Entwickler empfohlen.
3.3.2.1 Einbindung in QGIS unter Windows
Im Vorgriff auf den zweiten Teil des Dokuments über das für die LSBB entwickelte QGIS-Plug-In wird hier beschrieben, wie die Integration in QGIS erfolgen kann.
Damit das QGIS-Plug-In einwandfrei funktioniert, muss in der Python-Umgebung von QGIS die OKLABI-Schnittstelle integriert werden. Zurzeit geschieht das noch händisch, solange der Status des Plug-Ins prototypisch ist. Hierfür wird unter Windows ein Ordner mit Namen „oklabi“ im QGIS-Installationsbereich für Python angelegt und befüllt (ähnlicher Aufbau wie beim OKSTRA®-Werkzeug). Aufgrund dieser Struktur werden alle Bibliotheken gefunden, ebenso wie die Ressourcen für die OKLABI, ohne dass weitere Maßnahmen erforderlich sind.
3.3.2.2 Bekannte Probleme in QGIS unter Linux
Die OKLABI-Bibliotheken unter Linux basieren – wie auch unter Windows – auf einer Vielzahl von Open Source-Paketen. Beim Betrieb unter Linux stellen sich dadurch mit der Standard-Distribution der OKLABI-Bibliotheken allerdings verschiedene Probleme ein.
Eine Abhilfe ist möglich, indem eine andersartig gebaute Zusammenstellung der OKLABI-Bibliotheken erstellt wird. Diese Lösung ist noch im Testzustand und kann bisher nicht veröffentlicht werden.
4 QGIS-Plug-In
4.1 Motivation
Beim Austausch von OKSTRA®-Daten besteht regelmäßig ein Bedarf, die Daten zu visualisieren, um z. B. Plausibilitätsprüfungen zur Qualitätssicherung durchzuführen. Hierfür wird seit langem ein geeignetes flexibles Werkzeug vermisst, mit dem es für Endanwender leicht möglich ist, einen Datensatz mit frei verfügbaren Werkzeugen anzuzeigen. Die vorhandenen Mittel etwa im OKSTRA®-Werkzeug reichen hierfür nicht mehr aus, zumal die Datenumfänge die Tendenz haben, immer größer zu werden.
Die Landesstraßenbaubehörde Sachsen-Anhalt hat hier die Initiative ergriffen mit der die frei verfügbare GIS-Anwendung QGIS durch ein Plug-In für den Umgang mit OKSTRA®-Datensätzen aufgerüstet wird. Dadurch wird es möglich, OKSTRA®-Daten in QGIS einfach einzubinden, zu prüfen und mit zusätzlichen Attributen anzureichern und für den gewünschten Zweck geeignet aufzubereiten.
Hierzu gehört auch die Möglichkeit, durch den Einsatz von vordefinierten QGIS-Stildefinitionen Daten in fachlich treffender Weise zu präsentieren. Die Stildefinitionen enthalten skalierbare vektorbasierte Punkt-, Linien- und Flächensymboliken. Mit dem Plugin soll die Prüfung der OKSTRA® Bestandsmodelle ohne Medienbrüche im Büro und im Feld ermöglicht werden. In der Kommunikation mit dem Ersteller des Bestandsmodells kann das QGIS-Projekt genutzt werden um direkt auf notwendige Ergänzungen/Korrekturen zu verweisen. In der weiteren Entwicklung soll die OKLABI auch zur direkten Einbindung von PostgreSQL Datenbanken wie der OKSTRA® Bestands-DB als lokale oder zentrale Instanz ermöglicht werden. So könnten die Projektdaten nach erfolgreicher Prüfung auch direkt in eine (zentrale) Datenbank übernommen werden.
Zur technischen Realisierung des Plug-Ins wurde die OKSTRA®-Klassenbibliothek (OKLABI) mit einer Schnittstelle für die Programmiersprache Python ausgerüstet. Da diese Sprache eine sehr weite Verbreitung genießt, entsteht dadurch über das QGIS-Plug-In hinaus zusätzlich ein neuer großer Bereich von Einsatzmöglichkeiten für die OKLABI.
Eine erste Version der Python-Schnittstelle für die OKLABI ist im Sommer 2023 entstanden, und der Prototyp des QGIS-Plug-In für das OKSTRA®-Datenformat ist im vierten Quartal 2023 erstmalig in Einsatz gekommen. Das Ziel ist es, dieses Plug-In künftig der Öffentlichkeit verfügbar zu machen.
4.2 Realisierung
Die Erweiterung wird über die bereits in QGIS integrierten Wege bereitgestellt, so dass keine besonderen Nutzerkenntnisse zur Verfügung stehen müssen. Voraussetzung für die Nutzung ist, dass die OKLABI über die Python Konsole in QGIS eingebunden ist.
In der Praxis wird das Plugin über einen Schalter aufgerufen und es startet ein typischer Dialog zur Auswahl der zu öffnenden OKSTRA®-Datei. Im ersten Schritt werden die Metadaten der Projektdatei ausgelesen (editierfähige Darstellung in einer Maske). Diese sind durch den Anwender zu prüfen und mit zusätzlichen Merkmalen zu ergänzen.
- OKSTRA® Schema,
- OKSTRA® Fachbedeutungsliste,
- Referenzsystem Lage,
- Referenzsystem Höhe informativ, da es in QGIS derzeit nicht verwaltet wird),
- QGIS Symbol- und Stilbibliothek,
- Datensatz erstellt von: Auftragnehmer,
- Datensatz erstellt am: Datum/Zeit,
- Datensatz erstellt für: Auftraggeber,
- Datensatz geändert am: im Sinne von zuletzt geändert,
- Informationen zum Projekt: Bezeichnung, Kennung der Vertragsnummer,
- Projektordner/-verzeichnis als Speicherort (kann als ZIP Archiv an QField oder den Ersteller des OKSTRA® Datensatzes weitergegeben werden).
Im nächsten Schritt wird unter Verwendung der Prüfroutinen der OKLABI der Datensatz auf Datenkonformität gegen den OKSTRA®-Standard geprüft. Anzeige der Anzahl von Fehlern/ Warnungen, Fortsetzung/Abbruch des Imports nach der Auswahl einer der nachstehenden Optionen. Die Protokolldatei orientiert sich hierbei an der des OKSTRA®-Werkzeugs.
Bild 3
- Fehler im Protokoll gruppieren
- jede gefundene Fehlerart wird einmal mit ihrer Häufigkeit aufgeführt,
- Jeden Fehler protokollieren
- jeder gefundene Fehler wird im Protokoll dargestellt, und zum Projektlayer verlinkt (in der aktuellen Version als „Schwenken auf“ realisiert, bis das Hinweisfenster geschlossen ist), so dass zum Fehler gesprungen werden kann,
- Fehler im Protokoll gruppieren und abbrechen
- jede gefundene Fehlerart wird einmal mit ihrer Häufigkeit aufgeführt und Abbruch des Imports ohne Speicherung der temporär importierten Daten.
Nach der Prüfung werden die Daten in das Projekt QGIS-Projekt übernommen. Die Visualisierung wird durch eine spezielle QGIS-Symbol- und Stilbibliothek gesteuert. Für diese wurden die Symbole, Zeichen- und Darstellungsregeln, die die LSBB verwendet, umgesetzt. Da Texte keine klassische Objektklasse im GIS-Umfeld sind, wurden die Texte als zusätzlicher Punktlayer umgesetzt.
- Layer für die einzelnen Objektklassen (Punkte, Linien, Flächen, Texte),
- für Textobjekte sind Punktobjekte zu generieren, der Layer ist getrennt vom Punktlayer zu führen,
- für Fachobjekte (derzeit Baum und Böschung) Ableitung der Symbolik und Layer aus Objektbezeichnung und Attributen,
- Erstellung eines QGZ Layers mit zum OKSTRA®-Standard erweiterten Attributen, zusätzliche Attribute für Rasterbilder (Fotos) mindestens zwei, Kommentarfeld (Freitext), Bearbeiter, Datumzeit der letzten Änderung für jedes Objekt, Fehler-ID (für die nächste Version geplant),
- Visualisierung der Projektdaten maßstabsabhängig mit allen Symbolen oder vereinfacht (nur Punkte Linien, Flächen, keine Texte und sonstige Ausgestaltung); 3D-Visualisierung/ Orbit der Modelldaten (DGM und CAD).
Bild 4
Mit der Datenübernahme in das QGIS Projekt ist die Arbeit des Plug-Ins in seiner derzeitigen Ausbaustufe abgeschlossen. Für alle nachfolgenden Tätigkeiten werden die QGIS-eigenen Werkzeuge oder Erweiterungen Dritter genutzt. Durch die zusätzlichen Attribute wird eine Prüfung und Kommentierung der Daten des Bestandsmodells ermöglicht. Diese kann im Innen- und Außendienst erfolgen. Hierbei wird vollständig im digitalen Modell gearbeitet. Dies umfasst auch die Kommunikation mit dem Ersteller des Modells zur Ergänzung/Korrektur oder mit den Nutzern (Planern).
Zur Visualisierung werden die QGIS eigenen Werkzeuge verwendet. Zur Prüfung im Feld können die Daten über die Erweiterung QFieldSync ausgegeben werden. Alternativ kann auch der Projektordner als Ganzes kopiert werden. Durch die Nutzung von QFieldSync können die Möglichkeiten zur Bearbeitung der Daten im Feld eingeschränkt werden. Für eventuell notwendige zusätzliche Objekte stehen je ein leerer Punkt-, Linien- und Flächenlayer zur Verfügung. Zum Einsatz kommen QGIS-Symbole (SVG Format) und die QGIS Stildatenbank (SQL-Lite).
Im ersten Quartal 2024 soll das OKSTRA®-QGIS-Plugin in der Praxis getestet werden, so dass spätestens zum Ende des zweiten Quartals 2024 eine stabile Version veröffentlicht werden kann. Diese soll dann auch den Projektpartnern der LSBB bereitgestellt werden. Mit diesem Schritt wird es den Partnern möglich, die ausgegebenen OKSTRA®-Projektdaten unabhängig von der Autorensoftware zu visualisieren. Prüfung und Visualisierung nutzen hierbei die OKLABI bzw. das Regelwerk der LSBB und bilden somit einen Quasistandard.
4.3 Ausblick weitere Entwicklung
In der weiteren Entwicklung zeichnen sich derzeit folgende Aufgaben ab:
- Speicherung der Fehler-ID als zusätzliches Attribut im QGIS-Projekt, hierdurch bleibt die Zuordnung auch nach dem Schließen des Hinweisfensters erhalten,
- direkte Einbindung der PostgreSQL-Datenbank (OKSTRA® DB) über die OKLABI, hierdurch wird die Darstellung von Bestandsdaten aus der OKSTRA®-Bestandsdatenbank heraus sowie der direkte Import von geprüften Daten in die Datenbank ermöglicht,
- Nutzung der OKLABI zum Export von OKSTRA®-XML-Dateien aus einem QGIS-Projekt, das eröffnet die Möglichkeit der Überarbeitung des Bestandsmodells durch den Ersteller im von der LSBB geprüften/kommentierten QGIS-Projekt, ohne dass ein erneuter Import in die Autorensoftware notwendig wird.
Im Hinblick auf die technische Grundlage in der OKLABI in Zusammenarbeit mit dem QGIS-Plug-In gibt es weitere Aufgaben:
- Optimierungen bei der Laufzeit und der Reaktivität,
- Bereitstellung von Bibliotheken für das Plug-In zum Einsatz unter Linux,
Künftige Entwicklungen sind zu diskutieren, wobei Rückmeldungen von Anwendern einbezogen werden müssen, z. B.:
- Auswahl der Layer aus dem OKSTRA®-Umfeld, die in QGIS angezeigt werden,
- Bearbeitung von OKSTRA®-Daten mit QGIS,
- …
|