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?
- Karten weltweit
- Frei wählbare Ausschnitte
- Routingfähig: Für Auto, aber auch für Fahrrad oder Fussgänger
- POI-Karte (ausschaltbar)
- Höhenlinien-Karte (ausschaltbar)
- Und alles sollte in einem Rutsch erstellt werden: Karte definieren, Berechnung starten und fertig. Ohne irgendeinen weiteren Handgriff oder gar Nacharbeit.
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.
- Manuell installierte Anwendungen:
- aus Repositories installierte Anwendungen
- wget
- osmosis
- phyghtmap
- java
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:
- Belgien
- Chicago-Detroit
- China
- DACH (Deutschland, Österreich, Schweiz)
- Dänemark
- Deutschland
- Finnland
- Frankreich
- Italien (mit Sizilien)
- Japan
- Jordanien
- Kroatien
- Luxemburg
- Niederlande
- Norwegen
- Österreich
- Philippinen
- Portugal
- Skandinavien (Norwegen, Schweden, Finnland und Dänemark)
- Schweiz
- Schweden
- St. Petersburg
- Spanien
- Türkei
- UK & IRL
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:
In den Einstellungen Karte wählen, dann auf Karte konfigurieren gehen und dort die Karten aktivieren |
|
|
|
|
Screenshots Kartenauswahl auf GARMIN Oregon 600 |
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