Kartenerzeugung für GARMIN GPS-Geräte auf Basis von OSM

Worum geht es?

Wir sind viel draußen unterwegs, sei es hier zu Hause oder auch im Urlaub. Grade wenn man mal die Straßen verlässt und die Landschaft erkundet sind GPS-Geräte zur Orientierung äußerst hilfreich. Dafür haben wir GPS-Geräte von GARMIN. Anfangs haben wir noch die aufgespielten Karten benutzt, aber schnell wurde klar, dass man mit Ihnen außerhalb Europas nicht weit kommt. Es mussten neue Karten her. Auch Höhenlinien sollten sie haben. Aber woher nehmen?

Irgendwann in 2010 stolperten wir über "Open Street Map", kurz OSM. Wer es nicht kennt sollte es sich ruhig mal anschauen. OSM war genau das was wir suchten: Freie Karten, und diese weltweit. Toll!

Was aber sollten unsere Karten nun haben?

Beispiele Topokarte (mit Höhenlinien)

Beispiele Auto-Routing

Umstellung Routing Auto, Fahrrad, Fußgänger etc.

Das Routing läßt sich auch auf Fahrrad oder Fußgänger umstellen, dann werden - sofern verfügbar - andere Routen gewählt und nicht grade über die Autobahn. Im GARMIN Oregon 600 geht das folgendermaßen:

Also, genau darum geht es hier: Karten von frei wählbaren Bereichen erzeugen, und das weltweit. Und routingfähig sind sie noch dazu.

Die dafür notwendigen Schritte von den OSM-Daten zu einer fertigen Karte habe ich ein Skript gepackt, welches ich hier soweit erkläre, daß Ihr es bei Euch zum Laufen bekommen solltet und so in der Lage seid, selber Karten für Eure Geräte zu generieren.

Inhalt

Voraussetzungen für den hier beschriebenen Weg

Linux. Auf einem anderen Betriebssystem läuft das Skript nicht. Diese Programme müssen installiert sein. Und natürlich das Paket eigene_Karte.tar.gz mit dem Skript, dem zugehörigen TYP-File und den Styles. Das machen wir jetzt Schritt für Schritt.

Installation

Die manuell zu installierenden Programme splitter, mkgmap und gmaptool einfach downloaden und die Archive in ein Verzeichnis entpacken. Bei mir ist dies /usr/OSM/ - dort habe ich die entsprechenden Unterverzeichnisse erstellt und die Downloads dort entpackt.

Nun das Paket mit dem Skript und den benötigten TYP- und Styles-Dateien:

Entpackt das Paket in einen Ordern in dem ein normaler User Schreibrechte hat. Bei mir liegt alles im home-Verzeichnis, also ~/Dokumente/OSM. Wo es letztendlich liegt ist aber egal, das Skript muss halt nur in diesem Ordner Schreib- und Leserechte haben und aus diesem Ordner heraus gestartet werden, damit alles gefunden wird.

Die oben manuell installierten Programme müssen in das Skript eigene_Karte.sh eingebunden werden. Öffnet das Skript mit einem Texteditor und sucht folgenden Abschnitt:

###
# manuell installierte Anwendungen
APP_splitter="/usr/OSM/splitter/splitter.jar"
APP_mkgmap="/usr/OSM/mkgmap/mkgmap.jar"
APP_gmaptool="/usr/OSM/gmaptool/gmt"
# aus Repositories installierte Anwendungen
APP_wget=`which wget`
APP_osmosis=`which osmosis`
APP_phyghtmap=`which phyghtmap`
APP_java="/etc/alternatives/java"
Passt dort die rot markierten Pfade an Euer System an.

Die Programme wget sowie java sind auf den meisten Linux-Systemen eh schon installiert. osmosis und phyghtmap hingegen dürften noch nicht installiert sein, dies kann mit dem Befehl
apt-get install osmosis phyghtmap
schnell nachgeholt werden.

Das war die ganze Installation. Zu den Einstellungen:

Einstellungen

Diese sind denkbar einfach und leicht vorzunehmen: Öffnet das Skript eigene_Karte.sh mit einem Texteditor und geht die Einstellungen am Anfang des Skriptes durch und ändert sie bei Bedarf.

Welche Karte soll gerechnet werden?

Ganz am Anfang werden die z. Zt. möglichen Karten definiert, die aber jederzeit erweitert werden können. Diese momentan im Skript möglichen Karten haben sich bei uns im Laufe der Zeit angesammelt: Das Skript kann in einem Durchlauf nur eine Karte rechnen. Sollen mehrere Karten gerechnet werden muss das Skript mehrmals mit den entsprechend geänderten Einstellungen gestartet werden.

Wie erfolgt nun die Kartendefinition? Laßt uns das am Beispiel Deutschland im Detail durchgehen:
###
# Deutschland
KARTENNAME="Deutschland";TOP=55.2;LEFT=5.8;BOTTOM=47.2;RIGHT=15.1;MAX_NODES="800000"
ROHDATENURL="http://download.geofabrik.de/europe/germany-latest.osm.pbf"
#ROHDATENURL="http://download.geofabrik.de/europe-latest.osm.pbf";AUSSCHNEIDEN="true"
Die mit # beginnenden Zeilen werden nicht berücksichtigt, sie sind ausmaskiert.

KARTENNAME definiert den Namen der Karte. Ändert den Namen erstmal nicht, ich sage gleich warum.

Der Teil TOP=55.2;LEFT=5.8;BOTTOM=47.2;RIGHT=15.1 definiert zwei Punkte:

TOP=55.2:Nord-Koordinate des linken oberen Punktes
LEFT=5.8:Ost-Koordinate des linken oberen Punktes
BOTTOM=47.2:Nord-Koordinate des rechten unteren Punktes
RIGHT=15.1:Ost-Koordinate des rechten unteren Punktes
Die fehlenden beiden anderen Ecken - rechts oben und links unten - ermitteln die Programme selbständig. In der nachfolgenden Ansicht von Google Earth sind alle vier Punkte zu sehen.

Die grünen Marker zeigen das Viereck der Deutschlandkarte, das berechnet wird.

Die kmz-Datei OSM-Karten.kmz für Google Earth enthält die Marker für alle vorbereiteten Karten, sowohl als Viereck als auch die Polygone.

Hier wird eines deutlich: Definiert man den zu berechnenden Bereich durch ein Viereck hat man große Bereiche, die zwar nicht zu Deutschland gehören aber trotzdem mit gerechnet werden, eben weil sie innerhalb des aufgespannten Vierecks liegen. Dies betrifft alle zu rechnenden Karten (OSM, POI und SRTM). Deshalb gibt es die Polygone im Verzeichnis polygones. In diesen Dateien werden durch viele Punkte (und eben nicht nur vier) die zu berechnenden Bereiche definiert. Am Beispiel von Deutschland sieht das dann so aus:

Jetzt definieren die blauen Punkte - es sind nun 1428 und nicht mehr nur 4 - den Bereich. Man sieht direkt, dass Bereiche ausserhalb von Deutschland nicht mehr berücksichtigt werden.

Die Polygon-Dateien im Verzeichnis polygones definieren die Polygone für die verschiedenen Karten. Der Dateiname ist genau derselbe wie die Karte selbst. Findet das Skript eine poly-Datei mit dem gleichen Namen wie die Karte - hier Deutschland.poly - wird diese Datei verwendet. Ist keine Datei Deutschland.poly vorhanden werden die 4 Begrenzungspunkte TOP, LEFT, BOTTOM und RIGHT herangezogen. Deswegen sollten die Namen der Polygon-Dateien nicht geändert werden. Und wenn doch, dann muss auch der Kartenname geändert werden, ansonsten wird die Polygon-Datei nicht gefunden.

Die Polygon-Dateien sind alle von der Geofabrik, weitere Dateien finden sich auf deren Download-Server.

Zur nächsten Zeile:
###
# Deutschland
KARTENNAME="Deutschland";TOP=55.2;LEFT=5.8;BOTTOM=47.2;RIGHT=15.1;MAX_NODES="800000"
ROHDATENURL="https://download.geofabrik.de/europe/germany-latest.osm.pbf"
#ROHDATENURL="https://download.geofabrik.de/europe-latest.osm.pbf";AUSSCHNEIDEN="true"
Hier wird der Downloadlink zu den Rohdaten für Deutschland definiert.

Jetzt kommt etwas Spezielles:
###
# Deutschland
KARTENNAME="Deutschland";TOP=55.2;LEFT=5.8;BOTTOM=47.2;RIGHT=15.1;MAX_NODES="800000"
#ROHDATENURL="https://download.geofabrik.de/europe/germany-latest.osm.pbf"
ROHDATENURL="https://download.geofabrik.de/europe-latest.osm.pbf";AUSSCHNEIDEN="true"
Jetzt werden für die Deutschlandkarte die Rohdaten von ganz Europa definiert. Da Europa natürlich größer als Deutschland ist muss Deutschland aus Europa herausgeschnitten werden. Dies wird durch AUSSCHNEIDEN="true" am Ende der Zeile angegeben. Würde dies nicht angegeben werden würde die Karte für ganz Europa gerechnet werden. Die Karte wäre dann aber für Garmin-Geräte zu groß.

Die Option mit dem Rohdaten von ganz Europa ist dafür gedacht, wenn man mal einen Bereich als Karte berechnen möchte, der über mehreren Ländern liegt. Dann definiert man einfach die beiden Eckpunkte oben links und unten rechts, lädt das Europa-File und die Karte wird generiert. Möchte man hingegen die Karte eines Landes haben arbeitet man besser mit den Poly-Files.

Rohdaten downloaden oder nicht?

###
# Rohdaten neu download.geofabrik.de laden? (default=false)
#DOWNLOAD="true"
Wird diese Zeile aktiviert werden bei jedem Lauf die Rohdaten aus dem Internet geladen. Sollten lokal noch keine Rohdaten vorhanden sein werden sie aber auf jeden Fall geladen, unabhängig von der Einstellung hier. Ich empfehle den Download hier erstmal ausgeschaltet zu lassen bis die ersten Probeläufe vorbei sind.

Quelldaten für die Karte mit den Höhenlinien

###
# Zugang zu den SRTM-Daten der NASA. Ohne einen eigenen Accout geht's seit 2017 nicht mehr. Auch 
# sind die Daten nicht mehr bei der NASA direkt abrufbar, sondern bei der USGS (United States 
# Geological Survey). Hier muss man sich registrieren, damit phyghtmap Daten abrufen kann:
#
#    https://ers.cr.usgs.gov/register
#
# Macht es, meldet Euch an! Es ist kostenlos, einfach und geht recht schnell. Und registriert 
# könnt Ihr wirklich weltweit Höhenkarten erzeugen lassen.
#
# Die Anmeldedaten tragt Ihr im Skript dann hier ein:
EARTHEXPLORERUSER="USGS-user"
EARTHEXPLORERPASSWORD="USGS-password"
Das hier ist wichtig. Die Karte mit den Höhenlinien basiert auf den SRTM-Daten der NASA. SRTM steht für Shuttle Radar Topography Mission. Die Shuttle Mission STS-99 wurde im Februar 2000 von der Endeavour geflogen. Sie hatte ein SAR an Bord, mit dessen bei der Mission gewonnenen Daten ein Höhenmodell der Erde errechnet werden konnte.

Bis 2017 waren die SRTM-Daten bei der NASA frei zugänglich. Danach musste man sich registrieren, was aber auch kein wirkliches Problem war. Mittlerweile werden die Daten aber nicht mehr bei der NASA gehostet, sondern bei der USGS (United States Geological Survey). Auch dort muss man sich registrieren. Registrierungslink:

https://ers.cr.usgs.gov/register

Meine Empfehlung: Macht es! Es wird nicht viel abgefragt, geht schnell und tut auch nicht weh. Immerhin ist die USGS keine Werbeschleuder wie Facebook oder Google, und für den kostenlosen Zugriff auf die SRTM-Daten kann man auch ruhig mal eine Registrierung über sich ergehen lassen.

Die oben rot markierten Zeilen sind genau die Zugangsdaten zu Eurem USGS-Account. Der Rest geht automatisch, heißt wenn eine Karte gerechnet werden soll von der noch keine Höhendaten existieren können diese automatisch heruntergeladen werden. Ziemlich praktisch, das Ganze. Danke Panarchos (Programmierer von phyghtmap), danke NASA! :-)

Arbeitsspeicher für die JAVA-Prozesse

###
# maximaler Arbeitsspeicher für Java-Anwendungen
#MEMORY="12000M"	# dafuer sollten min.  16 GByte RAM im Rechner installiert sein
#MEMORY="20000M"	# dafuer sollten min.  32 GByte RAM im Rechner installiert sein
MEMORY="64000M"		# dafuer sollten min. 128 GByte RAM im Rechner installiert sein
Selbsterklärend: Wieviel Arbeitsspeicher wird den JAVA-Prozessen zugestanden? Je mehr desto besser. Wobei bei mir mit 128 GByte RAM selten mehr als 5 GByte benutzt wurden, soweit ich das mitbekommen habe.

Anzahl paralleler Prozesse

###
# Für splitter, mkgmap & phyghtmap: Wieviele Prozesse gleichzeitig?
MAXPROCESSES=12
Dies ist natürlich von der Zahl der CPU-Kerne abhängig. Gebt hier die Zahl Eurer CPU-Kerne ein.

Das waren die Einstellungen, wir sind durch. Laßt uns die erste Karte erzeugen!

Der erste Start des Skripts

Öffnet ein Terminalfenster und geht in das Verzeichnis, in dem Ihr das Paket eigene_Karte.tar.gz entpackt habt und das Skript eigene_Karte.sh liegt. Startet es dort mit
./eigene_Karte.sh
Sollte es nicht anlaufen prüft die Rechte. Das Skript muss ausführbar sein, und sollte natürlich dem User gehören, der es ausführen möchte. Sollten andere Dinge nicht stimmen meldet sich das Skript lautstark. Behebt die Fehler und startet es erneut.

Es werden zwei Log-Dateien erstellt:
LOG-Script.txt
LOG-PRG.txt
In LOG-Script.txt werden die Statusausgaben des Skriptes geschrieben, in LOG-PRG.txt die Ausgaben der beteiligten Programme. Wenn die Karte nicht generiert wird lohnt sich ein Blick hier rein.

Die erste selbst erzeugte Karte

Wenn das Skript durchgelaufen ist - bei der voreingestellten Karte "Deutschland" dauert das bei mir 25 mins (AMD Ryzen 9 3900XT mit 12 Kernen und 128 GByte RAM) - hat das Skript das Verzeichnis eigene_Karte_Deutschland erstellt und in ihm folgende Dateien abgelegt:
./eigene_Karte_Deutschland
    |-- Deutschland-OSM.img
    |-- Deutschland-POI.img
    |-- Deutschland-SRTM.img
    |-- LOG-PRG.txt
    |-- LOG-Script.txt

Die img-Dateien müssen nun ins GARMIN-Gerät in den Ordner garmin kopiert werden. Nach dem Neustart des Geräts Karte(n) aktivieren:
Hier sind die eigentliche Topo-Karte Deutschland OSM und die Höhenlinienkarte Deutschland SRTM aktiviert während die POI-Karte Deutschland POI deaktiviert ist und somit nicht angezeigt wird.

Download

Hier nochmal der Download-Link zum Paket mit dem Skript, der benötigten TYP-Datei und den Styles:

Autor

Dirk Schimansky

Bei Fragen einfach eine E-Mail schreiben.

Spende

Wer Lust hat: Bitte schön, auch ich trinke gerne mal ein Bier! :-)

Danke!

Quellen



09.07.2022 - Tools - Dirk Schimansky - Impressum