OpenOutdoorMap

- Wie erstelle ich eigene Mapsforge Karten? -

Aktuelle Version: 30.11.2022


OpenOutdoorMap

Eigene Karten erstellen - Warum?

Seit vielen Jahren nutze ich die Karten von OpenAndroMaps. Irgendwann hat es mich dann gereizt zu verstehen, wie diese Karten erstellt werden können. Außerdem gibt es mir die Freiheit, Symbole und Darstellungen nach eigenen Bedürfnissen einzubauen und zu verändern.

Hier möchte ich meine Erfahrungen weitergeben. Denn in vielen Stunden des Probierens und Optimierens habe ich dafür ein Skript entwickelt. Es ist . . .

  • entwickelt für Windows Rechner
  • für die Erstellung von Karten von allen Gebieten der Welt geeignet
  • für topographische Karten
  • für mehrere Kartenthemen verwendbar
  • hoffentlich verständlich erklärt und
  • die fertigen Karten sind mit mehreren Apps verwendbar.

Mein Skript für die Erstellung der OpenOutdoorMap Karte ist ein Windows-Batch-Skript (.bat Datei). Zum Ausführen reicht die auf jedem Windows Rechner verfügbare Konsole (CMD). Das Skript kann mit einem einfachen Texteditor (Editor, Wordpad, notepad ...) bearbeitet werden.
Das ist notwendig, da vor dem Start einige Grundeinstellungen und spezifische Einstellungen zum jeweiligen Kartenprojekt vorgenommen werden müssen. Dazu gehören die Pfade zu den Roh-Daten, zu installierten Software-Paketen und zur Ablage von Kartenprojekten und den erstellten Karten. Für jede Karte müssen Parameter wie Name, Bereich (ein rechteckiger Bereich oder basierend auf einer .poly Polygon-Datei), ob die Karte Meeresflächen enthalten wird, usw. festgelegt werden. Ist alles richtig eingestellt, dann durchläuft das Skript die einzelnen Schritte automatisch und zeigt den Fortschritt an. Dabei wird für jede Karte automatisch ein Kartenordner angelegt, in dem sich alle Zwischen-Dateien aus den einzelnen Schritten und auch die fertige Karte befindet. Dort wird auch die Log-Datei / Error-Log-Datei gespeichert.

Je nach Größe des Kartenbereichs und der Rechner-Ausstattung dauert eine Kartenerstellung wenige Minuten bis mehrere Stunden. Zum Beispiel brauche ich für eine Karte des Nord-Alpen Bereichs (Datei-Größe der Karte ca. 1,5 GB) gut 6 Stunden (Laptop mit i7-11. Gen, 16 GB Ram, SSD). Für die ersten Versuche sollte man aber besser mit sehr kleinen Karten starten (z. B. ein Quadrat von jeweils 1 Grad).

Der Kartenbau Prozess


Kartenbauprozess'

Bis eine fertige Karte entsteht braucht es . . .

  • Daten aus verschiedenen Datenquellen
  • viele einzelne Schritte
  • mehrere installierte Software Pakete
  • und Geduld

Ich beschreibe deshalb diese einzelnen Schritte im Detail . . .

Was brauche ich? - Vorbereitung (Software Installationen)

Ich lege alles, was mit dem Kartenbau zu tun hat (bis auf die Python-Installationen) in einen Kartenbau-Ordner ab, der jeweils Unterordner für die DATEN, die Hilfssoftware (TOOLS), die abgelegtgen HÖHENDATEN usw. enthält. Auf diesem Ordner sollten volle Schreibrechte bestehen. Hier ein Vorschlag für eine Ordnerstruktur:

Es werden folgende Software Pakete benötigt:

  1. Java Umgebung (bei mir Version 8 Update 291)
  2. Perl
  3. Osmosis
  4. Mapsforge Map-Writer Plugin (für Osmosis)
  5. Osmconvert
  6. Osmfilter
  7. Phyghtmap (Python 2.7)
  8. Python 3 (für "shape2osm.py" und "parse-routes.py")
  9. ogr2ogr (GDAL und Python bindings)   optional *

* Für Karten, die keine Meeresgebiete und Küstenlinien enthalten, benötigt man die Software unter Punkt 9. nicht. Da die dafür notwendigen Installationen etwas komplizierter sind, kann man sie also für die ersten Test-Karten zunächst weglassen.

Da einige Software Pakete eine spezielle Konfiguration brauchen, gebe ich folgende Erfahrungen weiter:

1. Java Umgebung

Einfache Standard Installation (bei mir für Windows 64 Bit) ohne weitere Einstellungen.

2. Perl

Es gibt mehrere kostenlose Perl Interpreter. Ich verwende eine Standard "Strawberry Perl" Installation. Danach sollten auch die notwendigen Eintragungen in den Systemvariablen automatisch eingetragen sein.

3. Osmosis

Eine Java-Software, die nicht speziell installiert werden muss. Man entpackt die heruntergeladene Datei und schiebt den gesamten Ordner (am besten umbenannt in "osmosis") in einen "TOOLS"-Ordner (in dem man weitere Hilfssoftware und Skripte sammelt). Anschließend muss noch ein wichtiger Parameter eingestellt werden. Dazu muss folgende Zeile in die Datei ".\osmosis\bin\osmosis.bat" eingetragen werden (oberhalb der letzten 3 Zeilen, die mit "set" beginnen):

set JAVACMD_OPTIONS=-Xms8G -Xmx8G -server -Djava.io.tmpdir=XXX

Bei XXX muss ein Pfad zu einem Ordner für die temporäre Ablage von Dateien stehen. Der Ordner kann irgendwo abgelegt werden und frei benannt sein. Ansonsten enthält die Zeile noch die Angabe zur Nutzung von bis zu 8GB Arbeitsspeicher.
Wichtig! Wird die Ordnerstruktur für diese temporären Dateien verändert, dann muss dies in die Datei ".\osmosis\bin\osmosis.bat" eingetragen werden!

4. Mapsforge Map-Writer Plugin für Osmosis

Dies ist die zentrale Software, die aus den gesammelten Daten am Ende eine Karte rendert. Es ist ein Plugin für die gerade schon installierte Osmosis Software. Zunächst muss man im Ordner "osmosis" den Ordner "plugins" anlegen. Da hinein wird die entpackte .jar Datei des Mapsforge Map-Writer Plugins abgelegt. Eine weitere Installation ist nicht nötig.

5. Osmconvert

Die ".exe" Datei am besten auch in den Tools-Ordner gelegen. Es ist keine Installation erforderlich.

6. Osmfilter

Wie bei Osmconvert. Es ist keine Installation erforderlich.

7. Phyghtmap

Die korrekte Installation dieser Software für die Erstellung der Höhenlinien-Daten stellt eine gewisse Hürde da. Phyghtmap benötigt eine Python 2 Installation und mehrere zusätzliche Module, die in einer bestimmten Reihenfolge installiert werden müssen. Da ich diese Software auch für die Erstellung von Karten für Garmin-GPS Geräte benötige, habe ich dafür schon eine genaue Anleitung geschrieben.

8. Python 3

Die Python Skripte "shape2osm.py" und "parse-routes.py" laufen nur unter Python 3 und nur, wenn die entsprechenden "Python bindings" installiert sind. Man muss also neben Python 2 (für Phyghtmap) eine weitere Python Installation vornehmen. Ich habe dazu aktuell Python 3.9.9 (64bit) installiert. Wichtig ist dabei, dass bei der Installation gleich die Option "Add Python 3.9 to PATH" angewählt wird. Die notwendigen Umgebungsvariablen werden so automatisch eingetragen. Die Skripte selber ("shape2osm.py" und "parse-routes.py") sollten wieder in den "TOOLS" Ordner abgelegt werden.
Ich habe die Skripte für die hier beschriebene Kartenerstellung der OpenOutdoorMap angepasst. Deshalb sollte jeweils nur folgende Variante verwendet werden:

  

Für das Skript "parse-routes.py" wird PyOsmium (eine "Python bindings to Osmium Library") benötigt. Diese lässt sich in einer Kommandozeile über diesen Befehl installieren:

pip install osmium

9. ogr2ogr (GDAL und Python bindings)   

optional, siehe oben *

"ogr2ogr" ist Teil einer GDAL Installation. Passend zur installierten Python Version 3.9 (siehe vorheriger Abschnitt) habe ich diese GDAL core-Version heruntergeladen. Nach einer Standard Installation von GDAL 3.3.3 müssen noch folgende Umgebungsvariablen (jeweils als Systemvariable) eingetragen werden:

Variable GDAL_DATA Wert C:\Program Files\GDAL\gdal-data (Wenn GDAL in den Ordner C:\Program Files\GDAL installiert wurde)

Variable GDAL_DRIVER_PATH Wert C:\Program Files\GDAL\gdalplugins

Variable PROJ_LIB Wert C:\Program Files\GDAL\projlib

Und in der Variable PATH der Eintrag C:\Program Files\GDAL

Die "Python bindings" kann man am leichtesten über die Datei "GDAL 3.3.3 Python 3.9 binding (für 64 bit Rechner)" installieren: Dazu in diesem Verzeichnis die Datei "GDAL-3.3.3-cp39-cp39-win_amd64.whl" suchen und herunterladen. Nach dem Download wird die Datei in den Ordner der Python Installation gelegt (bei mir C:\Python39\) und in der Kommandozeile über diesen Befehl installiert:

py -m pip install GDAL-3.3.3-cp39-cp39-win_amd64.whl

Eine erfolgreiche Installation kann man prüfen, in dem man z. B. in seinem Kartenbauordner die Kommandozeile aufruft und den Befehl "ogr2ogr" eingibt. Es sollten dann die "usage" und die "advanced options" aufgelistet werden.

Woher kommen die Daten? - Datenquellen

Openstreetmap Daten

Grundlage einer jeden Karte sind die Daten der OpenStreetMap Datenbank. Man muss also einen Ausschnitt, der mindestens so gross ist, wir der Bereich, für den man eine Karte erstellen kann, von OpenStreetMap herunterladen. Hier 3 Datenquellen als Beispiel:

  • Die aktuellsten Datenauszüge (nach Ländern oder Regionen) bekommt man bei der Geofabrik -> hier
  • Bei BBBike kann man spezielle Bereiche nach eigenen Wünschen erhalten (am besten im PBF Format) -> hier
  • Eine weitere Möglichkeit bietet Protomaps. Auch hier kann die Daten über ein Rechteck oder Polygon auf einer Karte eingrenzen -> hier

Kartengrenzen (.poly Dateien)

Die passenden Polygon Dateien (nach Ländern oder Regionen) bekommt man ebenfalls bei der Geofabrik. Sie sind im Download Bereich für einen Kartenbereich unter "Other Formats" verlinkt.
Wenn man eigene Polygone zeichnen will, dann bekommt man hier zumindest die entsprechenden Koordinaten gelistet und kann mit einem Texteditor eine .poly-Datei leicht anpassen.
Für eine rechteckige Karte benötigt man die 4 Eckkordinaten. Diese kann man z. B. hier sehr leicht ermitteln (rechts unter "CD" findet man die Koordinaten).

Daten für Höhenlinien

Die Daten für die Erstellung der Höhenlinien werden von der Software Phyghtmap automatisch heruntergeladen, wenn sie nicht für eine Kartenerstellung schon einmal geladen worden sind. Die .hgt Dateien werden dabei in einen Ordner abgelegt, der in den Einstellungen des Kartenbauskripts festgelegt wird.

Daten für Gipfel- und Pass Optimierungen

Nicht jeder Gipfel ist gleich "wichtig". Deshalb macht es Sinn, Gipfel auf Grund ihres horizontalen Abstands und ihres Höhenunterschieds zu anderen Gipfeln unterschiedlich darzustellen bzw. früher oder später in der Karte anzuzeigen (Hintergrund dazu ). Dafür wird für jeden Gipfel der Tag "peak dominance" (pd_1-5) eingebaut. Die Daten für die Höhe eines Gipfels sind in OpenStreetMap enthalten. Die Daten für den horizontalen Abstand ("isolation") werden hier (ca. 28 MB) zur Verfügung gestellt.

Bei einem Passübergang im Gebirge kann man die Darstellung in einer Karte verbessern, in dem das Symbol für den Pass senkrecht zur gedachten Verbindungslinie der den Pass eingrenzenden Anhöhen ausgerichtet wird. Für diese gewinkelte Darstellung werden hier (ca. 2 MB) die notwendigen Daten zur Verfügung gestellt.

Beide Downloads enthalten Datensätze für die gesamte Welt. Damit die entsprechenden Werte bei der Kartenerstellung berücksichtigt werden können, müssen sie vorher prozessiert werden. Für EUROPA habe ich dazu ein Batch-Skript erstellt, dass zusammen mit einem Perl-Skript eine OpenStreetMap-Datei (.osm) erzeugt. Diese muss für alle Karten in der Region Europa nur einmal erstellt werden. Aus dieser Datei werden bei der Kartenerstellung dann die jeweiligen Gipfel- und Pass-Daten eingebaut.

Die fertig prozessierten "Peak-Saddle"-Daten für EUROPA können hier geladen werden

   Stand: 12-2021

Landpolygone (coastline Daten)

Wenn ein Kartenbereich Meeresflächen enthält, dann müssen die Küstenlinien (am Festland und um die Inseln) in einem extra Schritt erstellt werden und über den Hintergrund der Meeresfläche gelegt werden. Da sich die dafür benötigten "land polygons" Daten im Normalfall nicht wirklich verändern, müssen sie nur einmal heruntergeladen werden: -> hier Ich verwende dabei diese Version: "Large polygons are split, Projection: WGS84". Die geladenen Daten (enthält die komplette Welt) werden in einen Ordner entpackt und bei der späteren Kartenerstellung entsprechend zugeschnitten und in das .osm Format konvertiert. So erreicht man die durchgängige Darstellung des Meeres und aller Inseln und Küstenlinien.

Routen (Fahrrad, Mountainbike, Wandern, Schlitten, Skitour)

Fahrrad-, Mountainbike und Wanderrouten und teils auch Schlittenbahnen und Skitourenrouten werden in Openstreetmap oft als sogenannte "relations" eingetragen. Darin wird festgehalten, welche "ways" zusammengenommen eine Route bilden. Routennamen und Referenznummern werden dann zu diesen "relations" eingetragen. Da aber leider der "Mapsforge Map-Writer" bisher nicht mit "relations" umgehen kann und diese deshalb nicht in der Karte enthalten wären, muss man sich einen kleinen Trick zunutze machen. Dazu habe ich ein Python Script entwickelt, dass für jeden Weg einer "relation" einen neuen Weg anlegt, der mit den notwendigsten Tags (=Infos aus Openstreetmap) versehen ist. Diese speziellen Routen-Wege können dann in der Karte mit einem geeigneten Kartenthema entsprechend dargestellt werden (z. B. farbige Linien neben den eigentlichen Wegen mit Informationen über die Referenznummer und den Namen). Für diesen Prozess benötigt man keine weiteren Daten (es werden die vorhandenen Openstreetmap Daten verwendet). Der gesamte Routenprozess ist im "OpenOutdoorMap Skript" enthalten und wird automatisch mit ausgeführt.

Wie erstelle ich die Karte? - Das Skript

Wenn alle Software erfolgreich installiert und die notwendigen Roh-Daten heruntergeladen wurden, dann kann die Kartenerstellung beginnen. Alle oben im "Kartenbau Prozess" gezeigten Schritte sind in einem Windows Batch-Skript ("OpenOutdoorMap_SKRIPT.bat") zusammengestellt. Dieses kann über die Kommandozeile aufgerufen werden. Bevor man das Skript startet, sollten aber einige Einstellungen vorgenommen werden. Die grundlegenden Einstellungen (alles, was sich für die einzelnen Karten normalerweise nicht unterscheidet, z. B. Pfade) werden im Skript selber vorgenommen. Dazu kann man das Skript in einem beliebigen Texteditor öffnen und entsprechend anpassen.

Diese allgemeinen Einstellungen sind (nur beim ersten Mal einzutragen):

  • Der Pfad für das Kartenbau Verzeichnis
  • Die Pfade für Projekte, Daten, Poly-Dateien, Tools (installierte Hilfs-Software), Peaks, Hgt-Dateien (Höhendaten), Landpolygone
  • Der Pfad für temporäre Dateien (wird während der Kartenerstellung genutzt und dann automatisch gelöscht)
  • Java Speichermenge in MB
  • Die Standard-Höhenlinien Abstufung

Alle Karten-spezifischen Einstellungen werden in einer eigenen Konfigurationsdatei eingetragen:

  • Karten-Name
  • Der Name der Openstreetmap Daten-Datei
  • Die in der Karte verwendeten Sprachen
  • Kartenbereichs-Typ: Für ein Rechteck "corners", für ein Polygon "poly"
  • Kartenbereich: Für ein Rechteck die Werte minLat, maxLat, minLon, maxLon (Gradzahlen der Latitude und Longitude) oder eine Polygon-Datei (.poly), die den Kartenumriss beschreibt
  • Ob die Karte Meeresflächen enthalten wird
  • Ob die entsprechenden Höhendaten schon vorhanden (sinnvoll, wenn man nur die Openstreetmap Daten aktualiseren will)

  

Das Skript besteht aus bis zu 13 Schritten, die als jeweiliger Startpunkt angewählt werden können. Das "XXX" ist der Platzhalter für den Kartennamen. Die Schritte 8-10 sind dabei nur nötig, wenn die Karte einen Meeres-Bereich enthält. Dies kann im Skript in der Zeile 61 (set sea=no) voreingestellt werden.

# Schritt Benötigte Software Entstehende Datei
1 Ausschneiden der OSM-Daten (nach Koordination-Rechteck oder nach Polygon Grenzen) OSMCONVERT 01_XXX_osmdata_raw.pbf
2 Osmosis Tag-Transform OSMOSIS 02_XXX_data_transformed.pbf
3 Nodes von Polygonen erzeugen OSMCONVERT 03_XXX_polygon_nodes.o5m
4 Polygon Nodes ausfiltern OSMFILTER 04_XXX_polygon_filtered.osm
5 Ausschneiden der preproceed Peak/Saddle Daten (peak dominanz, saddle direction) OSMCONVERT 05_XXX_peakdata.osm
6 Laden der Hoehendaten (nach Koordination-Rechteck oder nach Polygon Grenzen) PHYGHTMAP 06_XXX_eledata.o5m
7 Kartengrenzen erzeugen das SKRIPT, Perl 07_XXX_boundary.osm
8 Meerflaeche (Hintergrund) generieren  optional * das SKRIPT 08_XXX_sea.osm
9 Landpolygone (Hintergrund) generieren  optional * GDAL, SHAPE2OSM 09_XXX_land1.osm
10 Meer und Land (Hintergrund) kombinieren  optional * OSMOSIS 10_XXX_sea_land.osm
11 Routen prozessieren (bike,mtb,hike,sled,skitour) Python Script 11_XXX_routes.osm
12 Kombinieren aller Daten (OSM, Polygon, Peaks, Hoehendaten, Routen) OSMCONVERT 12_XXX_all_data.pbf
13 Rendern der Karte mit osmosis mapsforge map-writer OSMOSIS XXX.map

* Die Schritte 8,9,10 werden nur für Karten benötigt, die Meeresflächen und Küstenlinien enthalten.


Wichtige Hinweise:

>> Für die hier vorgestellte OpenOutdoorMap werden im Skript-Ablauf die Openstreetmap Daten vorprozessiert ("tagtransform"). Dabei erhalten ausgewählte Tags spezielle Bezeichnungen, die dann im letzten Schritt der Kartenerstellung (Mapsforge-mapwriter) zusammen mit einem spezifischen "tagmapping") verwendet werden können, um erweiterte Darstellungen zu ermöglichen. Dies muss dann z. B. im Locus-App Karten-Theme entsprechend berücksichtigt werden. Deshalb sollte für eine OpenOutdoorMap immer die komplette Kombination aus "tagtransform", "tagmapping" und "theme" verwendet werden.

>> Ab November 2022 werden die Karten in der "mapsforge V5" Version geschrieben.
Für die korrekte Darstellung wird ein V5 kompatibles Kartenthema benötigt.

Hinweise zu einzelnen Kartenbau-Schritten

Schritt 2 - "tagtransform" - Openstreetmap Daten transformieren

Mit dem sogenannten osmosis-tagtransform können viele kleine Fehler in den Openstreetmap Daten korrigiert werden, Tags können vereinheitlicht werden, aber auch neue Tags können an Hand von Regeln erstellt werden. Die dafür benötigte tagtransform.xml Datei kann leicht ausgelesen werden. Die dort hinterlegten Regeln sind wichtig und für die Erstellung der OpenOutdoorMap essentiell. Nach dem Download muss die Datei entpackt und in den Ordner "TOOLS" ablegt werden.

Schritt 7 - Kartengrenzen erzeugen

Wenn ein Kartenbereich nicht auf einem Rechteck mit den 4 Eckkordination basieren soll, sondern an Hand einer .poly Datei definiert ist, dann wird ein Perl-Skript benötigt, dass aus der .poly Datei ein .osm Datei erzeugt. Diese kann dann im weiteren Ablauf des OpenOutdoorMap_SKRIPT mit den restlichen Daten zu einer Karte hinzugefügt werden. Nach dem Download müssen sie entpackt und in den Ordner "TOOLS" ablegt werden.

Schritt 11 - Routen prozessieren

Dieser Schritt ist komplex. In Schritt 11 entstehen temporäre Dateien, die am Ende wieder automatisch entfernt werden. Zusätzlich werden nach dem Zusammenführen aller Daten (Schritt 12) aus der entstandenen "_all_data.pbf"-Datei nicht benötigte Routendaten wieder entfernt. Auch hier werden die temporären Dateien wieder gelöscht.

Schritt 13 - "tagmapping" - Inhalt und Zoom-level festlegen

Bei der Kartenerstellung durch den "mapsforge map-writer" kann in der "tagmapping" Datei festgelegt werden, welche Elemente ab welchem Zoom-level und ob überhaupt dargestellt werden. Ohne dies würde die Kartendatei unnötig groß und wahrscheinlich auch langsamer werden.
Die Version "tagmapping-desert" sollte für Kartenbereiche aus weniger dicht besiedelten und weniger gut kartierten Bereichen verwendet werden. Sie ist abgestimmt mit dem Karten-Thema "desert".

   

Abschluss

Update Novemberr 2022: Es wird nun automatisch eine "Aufräum"-Datei generiert (Verzeichnis_aufraeumen.bat). Löst man diese aus, dann wird das Kartenprojekt-Verzeichnis aufgeräumt und alle Dateien, außer die fertige Karte (.map) und die Datei mit den Höhendaten (denn diese kann man beim nächsten Karten-Update ja wieder verwenden), gelöscht.

OpenOutdoorMap - Beispiel

Das "richtige" Karten Theme für die Locus App

Für die OpenOutdoorMap wird ein spezielles Karten-Theme benötigt. Durch das Zusammenspiel von "tagtransform", "tagmapping" und "theme" können alle in der OpenOutdoorMap enthaltenen Details optimal dargestellt werden. Das Karten Theme wird am Endgerät für die entsprechende Karten-App (z. B. Locus) benötigt.

Hat alles geklappt, dann erhält man eine Karte, die ungefähr so aussehen sollte (die Schattierung wird von der Locus App generiert).
Beispiel-Karte: OpenOutdoorMaps Ausschnitt aus "Oberbayern"

OpenOutdoorMap
OpenOutdoorMap

Ich freue mich auf euer Feedback (Fragen, Anregungen, Verbesserungen, gefundene Fehler ...).
Bitte nutzt dazu das Kontaktformular -> hier

OpenOutdoorMap - Karten

Einige mit dem beschriebenen Skript erzeugte Karten gibt es hier zum Download: Achtung: Ab November 2022 im V5 Format!

Name Dateigröße (MB) Stand
TEST (Ausschnitt Bayern) 9 20.11.2022
BAYERN 614 20.11.2022
BADEN-WÜRTTEMBERG 441 20.11.2022
ÖSTERREICH 968 20.11.2022
SCHWEIZ 559 20.11.2022

Spenden willkommen . . .

Wenn dir mein OpenOutdoorMap Skript und die dazugehörigen Karten-Themen gefallen, freue ich mich sehr über ein kleine Spende. Es ist eine Wertschätzung meiner Arbeit und spornt mich an, weitere Verbesserungen zu entwickeln.