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:

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
tour4_route_klein.png
Abbildung 1: Darstellung des Tracks von Route 4

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'
tour4_punkte_klein.png
Abbildung 2: Darstellung der Track-Punkte von Route 4

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.