![]() |
Autor: Wolfram Eberius Version: 0.0.1 Datum: 01.04.2023 |
Preface
Der KulturpfadService ist eine Software, die zur Planung der digitalen Form der Kulturpfade verwendet werden kann. Er bietet die Möglichkeit aus einer Liste von Geokoordinaten einen Pfad zu errechnen.
Hierfür wird ein csv-Dokument mit Punkten übergeben. Hieraus wird eine Linien erstellt, die in Form von geojson Objekten ausgeliefert werden.
Die Software ist als eigenständiger Service gedacht, die es erlaubt, die notwendigen Daten für die Bereitstellung einer Oberfläche ohne Backend zu generieren.
Der Service enthält eine einfache Weboberfläche, die die Planung erleichtert.
Die Berechnung der Route erfolgt mit Hilfe von graphhopper.
1. Interfaces
Es werden folgende Interfaces unterstützt
1.1. poi
get /serivce/poi/<key>
accept application/json
returns geojson
Diese Schnittstelle liefert alle gespeicherten Points Of Interest (POI).
1.2. route
get /serivce/route/<key>
accept application/json
returns geojson
Diese Schnittstelle liefert die Route aus den übergebenen Points of Interest (POI).
1.3. data
get /serivce/data/<key>
accept application/json
returns json
Diese Schnittstelle gibt eine json mit den wichtigsten Informationen zum Routing zurück.
1.4. gpx
get /serivce/gpx/<key>
accept application/json
returns gpx
Diese Schnittstelle gibt die Route als GPX Daten zurück.
2. Daten
Es werden unterschiedliche Arten von Daten unterschieden:
-
OpenStreetMap Daten
-
Daten für das Routing
-
Daten zu Abschnitten und POI
2.1. OpenStreetMap Daten
Die Applikation benutzt die Routing-Engine von Graphhopper. Hierfür ist es notwendig die passenden OSM-Daten zur Verfügung zu stellen. Sie werden vom Server der Geofabrik bezogen. Das Kopieren erfolgt während des Bauens der Anwendung. Mit dem initialen Aufruf von mvn clean install
wird ein Datenabzug heruntergeladen, der in der pom.xml definiert ist.
<download-osm.fromFile>europe/germany/nordrhein-westfalen/koeln-regbez-latest.osm.pbf</download-osm.fromFile>
Im angegebenen Beispiel werden die Daten für den Regierungsbezirk Köln heruntergeladen
<download-osm.fromFile>europe/germany/hessen-latest.osm.pbf</download-osm.fromFile>
Im Beispiel für Hessen wird ein Abzug für das Bundesland Hessen heruntergeladen.
Wenn die Routing-Daten aktualisiert werden sollen, kann dies mit Hilfe von mvn clean install
oder mvn clean integration-test
erfolgen. mvn clean
sorgt dabei dafür, dass das Arbeitsverzeichnis gelöscht wird. mvn install
sorgt unter anderem dafür, dass frische Daten von der Geofabrik heruntergeladen werden.
Auf der Seite geofabrik.de/europe/germany [7] findet sich einen Auflistung, welche Daten von der Geofabrik bezogen werden können.
2.2. Daten für das Routing
Daten werden in Form von csv-Dateien eingelesen. Diese Dateien werden im resources
Verzeichnis hinterlegt. Die Daten sollte entsprechend der id aufgebaut sein:
b03-t06.csv
Die Struktur besteht aus vier Spalten:
id |
eindeutige id; z.B. 'b03-t06-01-0' |
name |
Name des Punktes; 'null' wenn Stützpunkt |
lat |
Breitengrad; z.B. '51' |
lng |
Längengrad; z.B. '7' |
Jeder Datensatz sollte durch die id
eindeutig identifizierbar sein. Sie sollte im Bezug auf die Kulturdaten folgendermaßen aufgebaut werden:
<bezirk>-<tour>-<nr>-<punkt>
Wichtig ist hier, dass die Werte innerhalb der ID in der weiteren Verarbeitung verwendet werden. Dafür ist es notwendig, dass die Werte durch -
von einander getrennt werden.
bezirk |
Bezirk des Kulturpfades: z.B. Lindental: b03 |
tour |
Nummer der Tour; z.B. Tour 1: t01 |
nr |
Nummer des Ankerpunktes; p01 für Ankerpunkt, s01 für Stützpunkt |
punkt |
6.1 - Ankerpunkt; 0 - Stützpunkt |
koeln-innenstadt-p01-1;Heinzelmännchenbrunnen;50.940007983370705;6.957310070072043 koeln-innenstadt-u02-2;Unter Goldschmied;50.93915927;6.95810884 koeln-innenstadt-u03-3;Theo Burauen Platz;50.93895138;6.95841998 koeln-innenstadt-s04-2;Theo Burauen Platz;50.93895138;6.95841998 koeln-innenstadt-u05-4;Römische Wasserleitung;50.93910674660413;6.958303544859174 koeln-innenstadt-u06-5;Laurenzgittergäßchen;50.93912378;6.95863724 koeln-innenstadt-u07-6;Praetorium;50.93902067;6.95895642 koeln-innenstadt-u08-7;Rathaus;50.93799641;6.95930243 koeln-innenstadt-u09-8;Altermarkt;50.93859475;6.96001858 koeln-innenstadt-s10-3;Fischmarkt;50.93828375;6.96217239 koeln-innenstadt-u10-9;Hänneschen-Theater am Eisenmarkt;50.93708368;6.96196318 koeln-innenstadt-s11-4;Altermarkt;50.93668478;6.96149647 koeln-innenstadt-u11-10;Reiterdenkmal Friedrich Wilhelm;50.93625883;6.96068645 koeln-innenstadt-u12-11;Gürzenich;50.93651913;6.95844412 koeln-innenstadt-s03-5;Gürzenich;50.93623516;6.95820272 koeln-innenstadt-s03-10;null;50.93627742;6.95804179 koeln-innenstadt-u12-12;Marsplatz, Marspfortengasse;50.93759583;6.95928901 koeln-innenstadt-u13-13;Wallraf-Richartz Museum;50.93739976;6.95843875 koeln-innenstadt-u14-14;Farina;50.93770062;6.95809275 koeln-innenstadt-u15-15;Gülichplatz;50.93757723;6.95807129 koeln-innenstadt-s15-6;Gülichplatz;50.93757723;6.95807129 koeln-innenstadt-u16-16;Fastnachtsbrunnen;50.93757385;6.95795327
Generell sollten die Sehenswürdigkeiten verwendet werden, um die Route zu berechnen. Es werden alle Sehenswürdigkeiten berücksichtigt, die in der csv-Datei mit 'p' markiert sind. Dabei kommt es immer häufiger zu Abweichungen zwischen Sehenswürdigkeit und Route, weil z.B. mehrere Sehenswürdigkeiten in unmittelbarer Nähe zueinander liegen, oder eine Sehenswürdigkeit nicht direkt an der Route liegen soll oder kann,
Durch die Markierung der Sehenswürdigkeit mit 'u' in der csv-Datei, wird die entsprechende Sehenswürdigkeit nicht mehr ins Routing einbezogen. Zusätzlich ist es möglich unsichtbare Punkte durch die Markierung 's' in der csv-Datei zu definieren. Im Ergebnis wird ggf eine Route mit nicht sehr aussagefähigen Entfernungen aber richtiger gesamter Entfernung und Laufzeit ermittelt.
In Zukunft soll das Konzept folgendermaßen geändert werden:
p |
Punkte, die einen POI kennzeichnen |
sie werden in das Routing einbezogen, aber auch auf der Oberfläche anzeigen |
s |
Punkte, die die Strecke kennzeichnen |
sie werden nur angezeigt, wenn der Name nicht 'null' ist |
u |
Punkte, die einen POI kennzeichnen |
sie werden nicht in das Routing einbezogen aber auf der Oberfläche angezeigt. Dies sollte der Normalfall für die Kennzeichnung von POI sein. |
-
p: Punkte, die einen POI kennzeichnen; sie werden in das Routing einbezogen, aber auch auf der Oberfläche anzeigen
-
s: Punkte, die die Strecke kennzeichnen; sie werden nur angezeigt, wenn der Name nicht 'null' ist
-
u: Punkte, die einen POI kennzeichnen; sie werden nicht in das Routing einbezogen aber auf der Oberfläche angezeigt. Dies sollte der Normalfall für die Kennzeichnung von POI sein.
Durch die Konzentration auf 'u' und 's' kann die Strecke vom POI getrennt werden. Die Berücksichtigung von 'p' erlaubt es rückwärtskompatibel zu bleiben. Eine eigene Nummerierung von 'u' und 's' Punkten bedeutet auch, dass de Darstellung auf der Oberfläche und die Darstellung der Route unabhängig voneinander nummeriert werden können.
Generell sollen nur Points of Interest miteinander verbunden werden. Dies sind die Ankerpunkte der Route. Es ist aber ggf notwendig Stützpunkte hinzuzufügen, die die Route so anpassen, dass nicht der direkte Weg errechnet wird. Ankerpunkte sind dadurch gekennzeichnet, dass die id mit der Ordnungszahl des Kulturpfades endet, während Stützpunkte dadurch gekennzeichnet sind, dass sie den Prefix mit dem Ankerpunkt teilen, aber die Nummer mit dem 's' verbunden sind.
Es werden allerdings auch Ankerlose Punkte untersützt. Sie sind dann notwendig, wenn ein POI nicht mit in das Routing einbezogen werden soll. Ankerlose Punkte sind durch die Zeichenkombination "-u" gekennzeichnet. Bsp.: b09-t01-u01-0.1
Weiterhin wird die zweite Spalte, die für das Feld name
steht, mit dem Wert null
gefüllt.
b03-t06-p01-6.1;Pauliplatz;50.93808;6.89794 b03-t06-s01-0;null;50.939027;6.894951 b03-t06-s02-0;null;50.936174;6.894329 b03-t06-u01-7.1;Platz;50.92808;6.88794
3. UI
Die Anwendung wird mit einer Web-Oberfläche geliefert, die es erlaubt den aktuell zu entwickelnden Pfad anzuzeigen.
Die Webanwendung ist durch folgende Eigenschaften gekennzeichnet:
-
Der Überblick zeigt den Weg und die Anzahl der Sehenswürdigkeiten entlang einer Route. Der Verlauf des Weges entspricht bestmöglich der ursprünglichen Streckenführung des Kulturpfades.
-
Die Kartenansicht zeigt Details entlang des Pfades an. Die Sehenswürdigkeiten werden durch rote Marker mit ihren Nummern angezeigt.
-
Ein modaler Dialog zeigt Informationen zu den Sehenswürdigkeiten. Die Texte sind den Heften entnommen, die für die Kulturpfade veröffentlicht wurden. Ein Foto illustriert den Eintrag.
-
Die Route wird mit einem für dieses Projekt entwickelten Routingsystem berechnet. Dadurch ist es möglich, nicht nur die Länge der Strecke, sondern auch die benötigte Zeit anzuzeigen.
-
Die Informationen im Dialog zu den Sehenswürdigkeiten enthalten den Hinweis auf die Quelle. Weitere Informationen sind verlinkt.
-
Jedem Kulturpfad ist ein Text vorangestellt, der die Besonderheiten der Route betont. Diese Texte finden sich im Menüpunkt ‚About‘.
-
Es können unterschiedliche Sprachen angezeigt werden. Eigennamen werden nicht übersetzt. Jede weitere Sprache ist mit zusätzlichem redaktionellen Aufwand verbunden.
-
Das Locate Tool ermöglicht es den Standort an den Browser zu übermitteln. Die aktuelle Position wird als blauer Punkt der auf der Karte angezeigt.
-
Mit Aufruf der Seite werden alle Daten in den Browser übertragen. Die Verarbeitung erfolgt auf dem Smartphone. Es werden keine Daten über Personen, ihr Nutzungsverhalten oder ihre Position erhoben oder gespeichert.
-
Jeder Kulturpfad hat seine eigene Seite. Die Pfade des Bezirks können über den Menüpunkt ‚About/ Links‘ gefunden werden.
-
Die Seite ‚Über das Projekt‘ beschreibt die Zusammenhänge. Hier ist es möglich Kontakt zum Entwicklungsteam aufzunehmen.
4. Test
Es werden Unit-Tests und Integrationstests unterschieden. Unit-Tests umfassen die Tests, die keinerlei Backend benötigen. Integrationstests benötigen ein eingebundenes graphhopper. Es sind keine Oberflächen Tests vorgesehen.
Die Unit-Tests können mit folgendem Kommando aufgerufen werden:
mvn test
Die Integrations-Tests werden mit folgendem Kommando aufgerufen:
mvn integration-test
Hierbei ist zu beachten, dass ein Abzug von OpenStreetMap im Classpath zur Verfügung stehen muss. Sollte die entsprechende *.pbf
Datei nicht vorhanden sein, wird sie automatisch heruntergeladen. Dadurch kann es zu langen Laufzeiten kommen, wenn die Intergrationstest mit folgendem Befehl aufgerufen werden:
mvn clean integration-test
Durch den Parameter clean
wird das temporäre target
Verzeichnis, und damit auch die *.pbf
Datei gelöscht.
4.1. maven
Zu Unterscheidung von Junit-Tests und Integrationstests wird das maven-surefire-plugin
eingestetzt. Während bei für den 'normalen' Testdurchlauf, also die Junit-Tests, alle Testklassen ausgeschlossen werden, die auf IntegrationTest
oder ApplicationTests
enden, werden diese explizit in der integration-test
phase angesprochen.
<plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <excludes> <exclude>**/*IntegrationTest</exclude> <exclude>**/*ApplicationTests</exclude> </excludes> </configuration> </plugin>
integration-test
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <executions> <execution> <phase>integration-test</phase> <goals> <goal>test</goal> </goals> <configuration> <excludes> <exclude>none</exclude> </excludes> <includes> <include>**/*IntegrationTest</include> <include>**/*ApplicationTests</include> </includes> </configuration> </execution> </executions> </plugin>
5. Dokumentation
Die Dokumentation wird in adoc unter /src/main/asciidoc
fortgeführt. Dadurch kann die Dokumentation sowohl in das pdf-Format umgewandelt werden, als auch in das html-Format. Für das Rendern des html-Codes, wird folgender Befehl auf der Kommandozeile ausgeführt:
mvn prepare-package
Um die erstellten html-Daten in das docs
Verzeichnis zu kopieren, wird folgender Befehl auf der Kommandozeile ausgeführt:
mvn process-resources
Wenn die so erstellten html-Dateien mit eingecheckt werden, wird aktuell die Dokumentation unter KulturpfadeService zur Verfügung gestellt.
Bibliography
-
[1] Build a REST API with Spring and Java Config, baeldung.com, 08.03.2022
-
[2] Spring Boot Annotations | Beginners guide springhow.com, 09.06.2021
-
[4] How to read and parse CSV file in Java, mykong.com
-
[5] BootLeaf, github.com
-
[6] JPX, github.com
-
[7] Download OSM-Daten, geofabrik.de