DE:All in one Garmin Map/Map generation

From OpenStreetMap Wiki
Jump to: navigation, search

Contents

Styles

Die aktuellen Styles der All in One Karte werden mit einem git repository verwaltet. Ihr könnt das Ding einfach klonen mit:

git clone git://github.com/aiomaster/aiostyles.git

Wer gerne aktiv mitarbeiten möchte und neue features, stylerules, icons hinzufügen möchte oder irgendwas anderes verbessern, der kann das gerne machen und mir zuschicken. Bei Interesse kann ich auch Schreibzugriff auf das offizielle Repository geben. Brauche dafür nur nen öffentlichen ssh schlüssel von euch. Würde mich freuen ein paar Mitstreiter zu finden, damit ich die Stylefiles nicht mehr alleine bearbeiten muss und neue features eingebaut werden können - auch, wenn ich gerade keine Zeit dafür hab.

Ihr findet übrigens neben den Styles auch mein Makefile, welches ich zur Erzeugung der ganzen Karten auf dem Server verwende.

Wenn ihr die letzten Änderungen der All in One Map sehen wollt, könnt ihr auch mal hier schaun:

http://github.com/aiomaster/aiostyles/commits/master.atom

Vorgehensweise

An dieser Stelle soll die Vorgehensweise, um sich eine routingfähige gut aussehende Garminkarte von einem Gebiet seiner Wahl zu erstellen dokumentiert werden. Als Beispiel soll hier komplett Deutschland dienen. Diese Vorgehensweise ist nicht immer ganz aktuell. Sie wird aber nach bestem Wissen und Gewissen ständig aktualisiert.

wget http://download.geofabrik.de/osm/europe/germany.osm.bz2

Diese müssen natürlich noch entpackt werden:

bunzip2 germany.osm.bz2
wget http://www.gary68.de/osm/qa/gpx/allbugs.gpx (enthält auch alle meine "Fehler", sonst bei schokokeks.org laden)

Wir bauen die GPX-Datei gleich mal mit gpsbabel in eine osm-Datei um, damit wir sie in mkgmap stecken können:

gpsbabel -i gpx -o osm allbugs.gpx bugs_germany.osm

Ich benutze an dieser Stelle noch ein bisschen sed-Gehacke, um das auf die richtige Form zu bringen:

sed 's/closed>/name>/g;s/<extensions>//g;s/<\/extensions>//g' allbugs.gpx \
  | gpsbabel -i gpx -o osm -f - -F bugs_germany.osm
svn co http://svn.parabola.me.uk/mkgmap/trunk
cd trunk/
ant
chmod 777 dist/mkgmap.jar

oder einfach die latest nehmen:

wget http://www.mkgmap.org.uk/snapshots/mkgmap-latest.tar.gz

Wir holen also den aktuellen Splitter von http://www.mkgmap.org.uk/splitter/ , z.B:

wget http://www.mkgmap.org.uk/splitter/splitter-r117.tar.gz

entpacken ihn:

tar xvf splitter-r117.tar.gz 

und machen ein neues directory:

mkdir tiles

Dahin kopieren wir das splitter.jar, das sich etwas tiefer im gerade ausgepackten Baum verbirgt. Dann:

cd tiles/

java -Xmx5000M -jar splitter.jar --mapid=63240345 --max-nodes=1000000 ../germany.osm

Es ist wichtig, dass wir nicht zu viele max-nodes einstellen. Da mein stylefile sehr viele Punkte aus OSM auswertet und darstellt, müssen wir hier weit unter 1500000 Punkte einstellen. Mittlerweile schafft der neue Tilesplitter http://svn.mkgmap.org.uk/splitter/trunk ganz Europa mit relativ wenig Speicherbedarf vernünftig zu splitten. Man sollte bei den --max-nodes=1000000 einstellen, wenn man vorhat meine Styles zu benutzen. Anderenfalls gibt es hinterher zu viele Nodes in manchen Kacheln.

Im Detail sieht das dann so aus:

Wir legen 5 verzeichnisse an mit namen: gbasemap, gaddr, gfixme, gosb, gboundary oder so ähnlich. Dann gehts los:

cd gbasemap
java -Xmx4000M -jar mkgmap.jar --max-jobs --style-file=../../aiostyles/basemap_style/ \
  --description='Openstreetmap' --country-name=europe --country-abbr=EU --family-id=4 \
  --product-id=45 --series-name='OSM-AllInOne-EU-bmap' --family-name=OSM --area-name=EU \
  --latin1 --mapname=63240345 --draw-priority=10 --add-pois-to-areas --make-all-cycleways \
  --link-pois-to-ways --remove-short-arcs --net --route --gmapsupp ../tiles/*.osm.gz \
  ../../aiostyles/basemap.TYP
cd ../gaddr
java -Xmx4000M -jar mkgmap.jar --max-jobs --style-file=../../aiostyles/addr_style/ \
  --description='Adressen' --country-name=europe --country-abbr=EU --family-id=5 \
  --product-id=40 --series-name='OSM-AllInOne-EU-Addr' --family-name=ADRESSEN \
  --area-name=EU --latin1 --mapname=63241345 --draw-priority=20 --no-poi-address \
  --no-sorted-roads --add-pois-to-areas --transparent --gmapsupp ../tiles/*.osm.gz \
  ../../aiostyles/addr.TYP
cd ../gfixme
java -Xmx4000M -jar mkgmap.jar --max-jobs --style-file=../../aiostyles/fixme_style/ \
   --description='Fixme_Layer' --country-name=europe --country-abbr=EU --family-id=3 \
   --product-id=33 --series-name='OSM-AllInOne-EU-Fixme' --family-name=FIXME \
   --area-name=EU --latin1 --mapname=63242345 --draw-priority=22 --no-poi-address \
   --no-sorted-roads --transparent --gmapsupp ../tiles/*.osm.gz ../../aiostyles/fixme.TYP
cd ../gboundary
java -Xmx4000M -jar mkgmap.jar --max-jobs --style-file=../../aiostyles/boundary_style/ \
   --description='Boundary_Layer' --country-name=europe --country-abbr=DE --family-id=6 \
   --product-id=30 --series-name='OSM-AllInOne-EU-boundary' --family-name=boundary \
   --area-name=EU --latin1  --mapname=63240625 --draw-priority=21 --no-poi-address \
   --no-sorted-roads --transparent --gmapsupp ../tiles/*.osm.gz \
   ../../aiostyles/boundary.TYP
cd ../gosb
java -Xmx4000M -jar mkgmap.jar --max-jobs --style-file=../../aiostyles/osb_style/ \
   --description='Openstreetbugs' --country-name=europe --country-abbr=EU --family-id=3 \
   --product-id=33 --series-name='OSM-AllInOne-EU-OSB' --family-name=OSB --area-name=EU \
   --latin1 --mapname=63243345 --draw-priority=23 --no-poi-address --no-sorted-roads \
   --transparent --gmapsupp bugs_germany.osm ../../aiostyles/osb.TYP


gmt -jo gmapsupp.img gbasemap/gmapsupp.img gaddr/gmapsupp.img gfixme/gmapsupp.img gosb/gmapsupp.img gboundary/gmapsupp.img

Siehe auch: OSM_Map_On_Garmin und OSM_Map_On_MapSource

Wichtige Anmerkungen

Mein aktueller Kenntnisstand (erworben durch ausprobieren) bezüglich Beschränkungen von Garmin und den genutzten Optionen von mkgmap etc. soll hier auch noch kurz dokumentiert werden.

Routable types: 0x01 - 0x13, 0x16, 0x1a, 0x1b
Das bedeutet das reicht gar nicht aus, um alle Wegtypen in OSM unterscheiden und auf ihnen routen zu können! Ursprünglich wollte ich zum Beispiel die sac_scales mit einbeziehen, aber die Wege wären dann nicht mehr routingfähig. Lässt sich nix machen...
java -Xmx512M -jar /tmp/trunk/dist/mkgmap.jar --style-file=masterstyle --description='Hoehenlinien'
--latin1 --mapname=63240023 --draw-priority=100 --transparent SRTM/sachsen/srtm.osm
gmt -f 5,25 -m HOEHE -jo gmapsupp.img Topo\ D\ SRTM/*.img

Bis es soweit ist, daß die Adress-Suche auch in dieser Karte funktioniert, habe ich folgende Zwischenlösung gefunden: Ich kopiere parallel die City Navigator Karte auf die SD-Karte und schalte sie im Menü jedoch aus. Im "Finde" Menü wird jetzt zusätzlich der Unterpunkt: "Region eingeben" aufgeführt. Die Adreess-Suche erfolgt jetzt problemlos. Natürlich könnte ich auch ausschließlich die CN anwenden, doch die Genauigkeit der OSM Karte ist unerreicht(zumindest in meinem Einzugsbeiet).Das Fahrrad- und Fußgänger Routing ist mit der CN Karte nicht zufriedenstellend. Deshalb benutze ich die OSM Karte ausschließlich, auch für das Auto-Routing.

AIO-Style Karten per Skript selber bauen

Ich Habe mal die oben angeführten Schritte in ein primitives Shell-Skript gebastelt damit der ganze Prozess beinahe automatisch geschehen kann.

An Voraussetzungen braucht das Skript in der Form:

Die restlichen benötigten Programme (mkgmap, splitter, gmt) lädt sich das skript selber runter und entpackt diese auch.

# Zuerst mal die AIO-Stylefile holen
git clone git://github.com/aiomaster/aiostyles.git 

# die ben\ufffdtigten Programme (mkgmap, splitter, gmt) downloaden
wget http://www.mkgmap.org.uk/snapshots/mkgmap-latest.tar.gz
tar -xvzf mkgmap-latest.tar.gz
ln -s mkgmap-r1670/mkgmap.jar mkgmap.jar

wget http://www.mkgmap.org.uk/splitter/splitter-r123.tar.gz
tar -xvzf splitter-r123.tar.gz
ln -s splitter-r123/splitter.jar splitter.jar

wget http://www.anpo.republika.pl/files/lgmt042a.zip
unzip lgmt042a.zip

# Die Kartendaten aus den geofabrik extrakten downloaden
wget http://download.geofabrik.de/osm/europe/germany.osm.bz2
bunzip2 germany.osm.bz2
ln -s alps.osm map.osm

# die bugs laden und mit sed bearbeiten, gpsbabel wird benoetigt falls noch nicht installiert
wget http://www.gary68.de/osm/qa/gpx/allbugs.gpx
sed 's/closed>/name>/g;s/<extensions>//g;s/<\/extensions>//g' allbugs.gpx |gpsbabel -i gpx -o osm -f - -F allbugs.osm

# Verzeichnisstruktur generieren
mkdir tiles
cd tiles
mkdir gbasemap
mkdir gaddr
mkdir gfixme
mkdir gboundary
mkdir gosb
mkdir gmaxspeed

# Die Kartendaten splitten
# Ben\ufffdtigt wird die Sun Java JRE6
# Bei 32bit System m\ufffdsste die Speicherzuteilung reduziert werden, das koennte aber bei grossen Kartenbereichen dann ungenuegend sein!
java -Xmx5000M -jar ../splitter.jar --mapid=63240345 --max-nodes=1000000 ../map.osm

cd gbasemap/
echo "Basemap"
java -Xmx4000M -jar ../../mkgmap.jar --max-jobs --style-file=../../aiostyles/basemap_style/ --description='Openstreetmap' --country-name=europe --country-abbr=EU --family-id=4 --product-id=45 --series-name='OSM-AllInOne-EU-bmap' --family-name=OSM --area-name=EU --latin1 --mapname=63240345 --draw-priority=10 --add-pois-to-areas --make-all-cycleways --link-pois-to-ways --remove-short-arcs --net --route --gmapsupp ../*.osm.gz ../../aiostyles/basemap.TYP

cd ../gaddr
echo "Adresseen"
java -Xmx4000M -jar ../../mkgmap.jar --max-jobs --style-file=../../aiostyles/addr_style/ --description='Adressen' --country-name=europe --country-abbr=EU --family-id=5 --product-id=40 --series-name='OSM-AllInOne-EU-Addr' --family-name=ADRESSEN --area-name=EU --latin1 --mapname=63241345 --draw-priority=20 --no-poi-address --no-sorted-roads --add-pois-to-areas --transparent --gmapsupp ../*.osm.gz ../../aiostyles/addr.TYP

cd ../gfixme
echo "Fixme"
java -Xmx4000M -jar ../../mkgmap.jar --max-jobs --style-file=../../aiostyles/fixme_style/ --description='Fixme_Layer' --country-name=europe --country-abbr=EU --family-id=3 --product-id=33 --series-name='OSM-AllInOne-EU-Fixme' --family-name=FIXME --area-name=EU --latin1 --mapname=63242345 --draw-priority=22 --no-poi-address --no-sorted-roads --transparent --gmapsupp ../*.osm.gz ../../aiostyles/fixme.TYP

cd ../gboundary
echo "Boundary"
java -Xmx4000M -jar ../../mkgmap.jar --max-jobs --style-file=../../aiostyles/boundary_style/ --description='Boundary_Layer' --country-name=europe --country-abbr=DE --family-id=6 --product-id=30 --series-name='OSM-AllInOne-EU-boundary' --family-name=boundary --area-name=EU --latin1  --mapname=63240625 --draw-priority=21 --no-poi-address --no-sorted-roads --transparent --gmapsupp ../*.osm.gz ../../aiostyles/boundary.TYP

cd ../gmaxspeed
echo "Maxspeed"
java -Xmx4000M -jar ../../mkgmap.jar --max-jobs --style-file=../../aiostyles/maxspeed_style/ --description='Maxspeed' --country-name=europe --country-abbr=EU --family-id=84 --product-id=15 --series-name='OSM-AllInOne-EU-Maxspeed' --family-name=MAXSPEED --area-name=EU --latin1 --mapname=63246345 --draw-priority=19 --no-poi-address --no-sorted-roads --transparent --gmapsupp ../*.osm.gz ../../aiostyles/maxspeed.TYP

cd ../gosb
echo "OSM-Bugs"
java -Xmx4000M -jar ../../mkgmap.jar --max-jobs --style-file=../../aiostyles/osb_style/ --description='Openstreetbugs' --country-name=europe --country-abbr=EU --family-id=3 --product-id=33 --series-name='OSM-AllInOne-EU-OSB' --family-name=OSB --area-name=EU --latin1 --mapname=63243345 --draw-priority=23 --no-poi-address --no-sorted-roads --transparent --gmapsupp ../../allbugs.osm ../../aiostyles/osb.TYP

# Jetzt alles zu einem gmapsupp.img
cd ../..
./gmt -jo gmapsupp.img tiles/gbasemap/gmapsupp.img tiles/gaddr/gmapsupp.img tiles/gfixme/gmapsupp.img tiles/gosb/gmapsupp.img tiles/gmaxspeed/gmapsupp.img tiles/gboundary/gmapsupp.img

--Hetzi 15:49, 2 September 2010 (BST)

Wanderweg- und Radroutenlayer

Ich hab in ähnlicher weise wie im obigen Skript auch Stylefiles und TYP-File für einen eigenen Wanderweg und Radrouten-Layer erstellt. Das Skript zur Erzeugung liegt unter: http://140.78.94.22/osm/hiking-map.tar.gz bereit. Eine generierte Deutschlandkarte mit diesen Einstellungen kann man sich unter http://140.78.94.22/osm/hiking_germany.img laden. (ca. 23MB) Die Gesamt-AIO-Karte, incl. des Wanderweg und Radroutenlayer gibt es unter http://140.78.94.22/osm/aio-germany-custom.img (über 1200MB, jetzt täglich aktualisiert) Weiters generiere ich jetzt auch täglich eine Österreichkarte mit den identischen Einstellungen unter http://140.78.94.22/osm/aio-austria-custom.img abrufbar (ca. 220MB) Im Verzeichnis http://140.78.94.22/osm/ hab ich auch noch die Polygondateien nach denen ich die Daten ausschneide und den Deutschland .osm Extrakt nach diesem Polygon ausgeschnitten, so wie ich es zur Generierung der Deutschlandkarte verwende. Es sollten dabei immer auch die benachbarten Grenzregionen rund um Deutschland mit drauf sein.

Höhenlinien

Die Höhenlinien hab ich nicht selber generiert, sondern im Netz gefunden. Runterzuladen sind sie hier: [2] Die Höhenlinien wurden in den Alpen mit den genaueren SRTM1 Daten berechnet und die Höhenlinien besitzen einen Abstand von 20 Meter.

Falls es jemand hinbekommt ne transparente Garminkarte mit Höhenlinien von ganz Europa zu erzeugen, wäre ich sehr interessiert. Ich bin schon deutschlandweit gescheitert.

Schau mal auf http://www.kleineisel.de/ralf/gps/garmin/
Mit phyghtmap ist das Erstellen der OSM-Höhenlinien-Daten (in fertigen Tiles) aus den SRTM-Daten an sich kein Problem mehr. Leider ist alleine das Höhenlinien-Image mit einer Auflösung von 20 Meter schon etwa 3 GB groß, das komplette gmapsupp mit basemap über 5 GB. Auch wenn das Garmin GPSMap 60Csx 8 GB große SDHC-Karten unterstützt, macht einem das Dateisystem (FAT32) einen Strich durch die Rechnung, denn die maximale Dateigröße beträgt dort 4 GiB. Garmin selbst ist nicht an der Weiterentwicklung der Firmware interessiert. Mit 50 Meter Höhenauflösung ist das gmapsupp derzeit noch klein genug, aber weniger nützlich.

Das Problem ist, dass srtm2osm zwar ordnungsgemäß ne OSM-Datei erzeugt, diese aber extrem groß wird. (Für Deutschland 8G) Dank dieser Größe kann mkgmap das nicht mehr alles in eine Kachel schieben und man müsste die Höhenlinien-OSM-Datei kacheln. Leider sind die Höhenlinien teilweise sehr lang und somit kommt es unglaublich oft vor, dass diese über mehrere Kacheln hinweggehen und somit weggehaun werden. Im Übrigen lässt sich der tilesplitter gar nicht verwenden, um die Höhen zu kacheln. Anscheinend wertet der die Stützpunkte der Höhenlinien gar nicht als node und somit nützt ein max-nodes gar nichts. Wenn es also irgendwer schafft solche Garminkarten zu erzeugen und sein Wissen und Ergebnis mit anderen teilen möchte, der kann dies hier gerne tun!

Mit dem mkgmap-splitter ist das durchaus möglich. Siehe auch mein HOWTO. --R kleineisel 11:45, 30 September 2009 (UTC)

Für kleinere Ausschnitte habe ich im übrigen unten beschrieben, wie man sich eigene Garminkarten mit Höhenlinien bauen kann. Das Kachelproblem tritt dabei ja nicht auf.

phyghtmap beherrscht Tiling und bietet dieselbe Funktionalität wie srtm2osm, daher lassen sich Höhenlinien-Images auch für größere Bereiche problemlos erzeugen.

Openstreetbugs

Mein Kumpel John und ich haben ein kleines Tool in C gehackt mit dem sich die Openstreetbug-SQL-Dumps in osm-xml konvertieren lassen. Diese können anschließend mit mkgmap umgewandelt und so eine Garminkarte erzeugt werden. Den source-code stellen wir natürlich zur Verfügung: http://tuxcode.org/john/osbsql2osm/osbsql2osm-latest.tar.gz Ich schreibe den Rest mal in Englisch (wird wohl für jeden verständlich sein).

What does it do?

It converts Openstreetbugs sql data dumps to a valid osm-xml format. In Detail it takes a source like that:

INSERT INTO `bugs` (`id`, `lon`, `lat`, `text`, `type`, `last_changed`, `date_created`, `nearby_place`) VALUES
(1,13.50,46.01,'This is an example with &qout;special$qout; Characters -> to show what it does & what not. <hr /> Here you can see a comment with an sql escaped Apostroph \' - funny isn't it? [master, 2009-11-13 12:56:00 MESZ]',1,'2009-11-13 12:56:00','2009-11-13 13:00:00','Dresden [DE]')

You should get an osm-xml file like this:

<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.6' generator='osbsql2osm'>
  <node id='1' timestamp='2009-11-13 13:00:00' visible='true' version='1' lat='46.01' lon='13.50'>
          <tag k='text' v='his is an example with &qout;special$qout; Characters -> to show what it does &_amp; what not. ## Here you can see a comment with an sql escaped Apostroph &apos; - funny isn't it? [master, 2009-11-13 12:56:00 MESZ]' />
          <tag k='type' v='1' />
          <tag k='last_changed' v='2009-11-13 12:56:00' />
          <tag k='date_created' v='2009-11-13 13:00:00' />
          <tag k='nearby_place' v='Dresden [DE]' />
  </node>
</osm>

How does it work?

First we get the source-code and compile it:

wget http://tuxcode.org/john/osbsql2osm/osbsql2osm-latest.tar.gz
tar xzvf osbsql2osm-latest.tar.gz
cd osbsql2osm-0.3/
./configure
make

If everything goes right we can find a binary file in osbsql2osm-0.3/src named osbsql2osm. Now we get the Database dumps from Openstreetbugs [http://openstreetbugs.schokokeks.org/dumps/]

wget http://openstreetbugs.schokokeks.org/dumps/osbdump_latest.sql.bz2

Now we use bzcat to extract this sql file and pipe it to our converter.

bzcat osbdump_latest.sql.bz2 | osbsql2osm-0.3/src/osbsql2osm > osbdump.osm

If you want to visualize it you can simply load it in JOSM. It looks like this:

Osbjosm.jpg

Personal tools
Namespaces
Variants
Actions
site
Toolbox