GPS-Spur mit OpenStreetMap rendern
Marvin Gülker · 01.01.2020
Der Beitrag baut auf dem vorigen auf und erklärt, wie man GPS-Spuren mit Mapnik in OpenStreetMap-Kartenmaterial rendert.
Kategorien: OpenStreetMap, Software
Im vorangegangenen Artikel wurde beschrieben, wie man überhaupt druckfähige Karten mit dem deutschen OpenStreetMap-Stil selbst erstellt. Hier soll der Vorteil dieser Methode ausgenutzt werden: zusätzlich zu den eigentlichen Kartendaten soll eine GPS-Spur auf der Karte dargestellt werden.
Hierfür wird eine funktionsfähige Umgebung zur Erstellung von Karten mit dem deutschen OpenStreetMap-Stil vorausgesetzt. Details dazu finden sich im erwähnten vorangegangenen Artikel Weiterhin benötigt man eine GPS-Spur im GPX-Format. Diese kann man aus den gängigen Mapping-Programmen wie OSMTracker exportieren. Der Kreis Unna beschreibt auf seiner Webseite mögliche Wandertouren und bietet dazu passende GPS-Spuren öffentlich zum Herunterladen an. Für die Zwecke dieses Beitrags kommt die GPS-Spur der vierten Tour zum Einsatz.
GPX steht für GPS Exchange Format und ist ein XML-basiertes Format, das Informationen enthält über:
- Wegpunkte
- Routen
- Tracks
Mapnik unterstützt mithilfe des OGR-Plugins alle diese Angaben. Die
Einbindung erfolgt als neues Layer innerhalb des Eingabe-XML für
Mapnik. Das OGR-Plugin nutzt OGR (Teil der GDAL-Bibliothek) und
unterstützt neben GPX noch eine ganze Reihe weiterer Formate, die nach
Mapnik als Ebenen (layer) exportiert werden. Um festzustellen,
welche Ebenen Mapniks OGR-Plugin an Mapnik exportieren wird, empfiehlt
die Dokumentation die Verwendung des Programms ogrinfo(1) (welches
unter Debian 10 im Paket gdal-bin
enthalten ist):
$ ogrinfo Tour_4.gpx INFO: Open of `Tour_4.gpx' using driver `GPX' successful. 1: waypoints (Point) 2: routes (Line String) 3: tracks (Multi Line String) 4: route_points (Point) 5: track_points (Point)
Diese GPX-Datei exportiert also fünf verschiedene Layer. Da diese
Auflistung identisch mit der im Mapnik-Wiki ist, obwohl diese
GPX-Datei gar keine Routeninformationen enthält, darf man wohl davon
ausgehen, daß das OGR-Plugin für GPX-Dateien generell diese fünf
Ebenen exportiert. Bei Verwendung der in Wirklichkeit nicht
bestehendenen Ebenen wird allerdings auch nichts auf der Karte
dargestellt. Außerdem beschwert sich Mapnik in diesem Falle mit einer
Warnung (hier für die leere Ebene route_points
):
could not determine extent, layer 'route_points' appears to have no features
Die Einbindung in Mapnik erfolgt über dessen Eingabe-XML in Form einer
neuen Ebene. Arbeitet man mit dem deutschen OpenStreetMap-Stil dann
ist die Datei openstreetmap-carto-de/osm-de.xml
nach ihrer
Erstellung mit carto
zu bearbeiten. Soll der GPS-Track dargestellt
werden, ist die o.g. Ebene tracks
zu benützen. Man fügt dazu einfach
folgendes XML an die Datei osm-de.xml
vor dem schließenden Tag
</Map>
an:
<Style name="route" filter-mode="first"> <Rule> <LineSymbolizer stroke-width="2" stroke="#ff0000" stroke-linejoin="round" stroke-linecap="round"/> </Rule> </Style> <Layer name="myroute" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"> <StyleName>route</StyleName> <Datasource> <Parameter name="type">ogr</Parameter> <Parameter name="file">Tour_4.gpx</Parameter> <Parameter name="layer">tracks</Parameter> </Datasource> </Layer>
Dies beschreibt zunächst einen neuen Stil namens route
, der Linien
mit einer Breite von 2 Pixeln und in der Farbe #ff0000
beschreibt.
Die Farbangabe ist ein Hexadezimalwert, den man etwa einfach mit dem
GIMP für die gewünschte Farbe (hier: rot) im Farbwähler bestimmen
kann. Linienübergange und -rundungen werden rund gezeichnet.
Einzelheiten dazu kann man der Mapnik-Dokumentation für LineSymbolizer
entnehmen.
Anschließend wird eine neue Mapnik-Ebene (auch layer, wobei dies mit
dem von OGR exportierten layer nicht identisch ist) namens myroute
hinzugefügt, die den soeben beschriebenen Stil route
verwendet, um
die Ebene tracks
aus der Datei Tour_4.gpx
darzustellen. Zum
Auslesen wird das erwähnte OGR-Plugin genutzt. Die Bedeutung des
Attributes srs
auf dem <Layer>
-Knoten erklärt die
Mapnik-Dokumentation.
Ist dies erledigt, kann man die Karte mit nik4
erstellen. Dabei ist
darauf zu achten, auch die Gegend anzufordern, in der die GPS-Spur
verläuft:
$ nik4 -s 20000 --ppi 600 -a 4 \ -c 7.6611 51.5949 --margin 10 \ osm-mit-track.xml tour_4.png Mapnik LOG> 2019-12-28 09:11:07: warning: unable to find face-name 'Noto Sans CJK JP Regular' in FontSet 'fontset-0' Mapnik LOG> 2019-12-28 09:11:07: warning: unable to find face-name 'Noto Sans Balinese Regular' in FontSet 'fontset-0' [...] Mapnik LOG> 2019-12-28 09:11:07: warning: unable to find face-name 'Unifont Upper Medium' in FontSet 'fontset-2' Warning 1: GPX driver only reads 2 links per element. Others will be ignored. This can be changed with the GPX_N_MAX_LINKS environment variable

Das Ergebnis entspricht Abb. 1.
Will man die einzelnen Punkte nicht zu einer Linie verbinden, sondern
bloß die einzelnen Punkte rendern, dann verwendet man statt der Ebene
tracks
die Ebene track_points
. Außerdem benötigt man statt des
LineSymbolizer einen PointSymbolizer mit einer Graphik zur Darstellung
des Punkts, welche man schnell mit dem GIMP erstellen kann. Hier kommt
ein blauer Punkt von 2x2 px Größe namens osm_punkt.png
zum Einsatz.
Es ergibt sich folgendes XML:
<Style name="route" filter-mode="first"> <Rule> <PointSymbolizer file="osm_punkt.png" allow-overlap="true"/> </Rule> </Style> <Layer name="myroute" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"> <StyleName>route</StyleName> <Datasource> <Parameter name="type">ogr</Parameter> <Parameter name="file">Tour_4.gpx</Parameter> <Parameter name="layer">track_points</Parameter> </Datasource> </Layer>
Die Karte wird genauso wie im ersten Fall erzeugt:
$ nik4 -s 20000 --ppi 600 -a 4 \ -c 7.6611 51.5949 --margin 10 \ osm-mit-track.xml tour_4.png Mapnik LOG> 2019-12-28 10:15:38: warning: unable to find face-name 'Noto Sans CJK JP Regular' in FontSet 'fontset-0' Mapnik LOG> 2019-12-28 10:15:38: warning: unable to find face-name 'Noto Sans Balinese Regular' in FontSet 'fontset-0' [...] Mapnik LOG> 2019-12-28 10:15:38: warning: unable to find face-name 'unifont Medium' in FontSet 'fontset-2' Mapnik LOG> 2019-12-28 10:15:38: warning: unable to find face-name 'Unifont Upper Medium' in FontSet 'fontset-2'

Das Ergebnis zeigt Abb. 2. Je nachdem, welche Informationen die eigenen GPX-Dateien enthalten, kann man auf diese Weise auch die anderen von OGR exportierten Ebenen darstellen. Mapnik ist auch nicht darauf beschränkt, bloß die Punkte oder den Track darzustellen, sondern kann auch beides zugleich. Dabei muß man lediglich beachten, daß die einzelnen Ebenen im Eingabe-XML in der Reihenfolge dargestellt werden, in der sie im XML auftreten, sprich: später beschriebene Ebenen verdecken früher beschriebene Ebenen.
Insgesamt zeigt sich wieder einmal die Vielseitigkeit von OpenStreetMap. Wer bereit ist, etwas Zeit in die Auseinandersetzung mit der Technik zu investieren, kann auch ungewöhnlichere Kartendarstellungen wie etwa von GPS-Spuren erzeugen.