Skip to content

Babylonisches Sprachgenie – Teil 2: Ersatz für den Garmin POI Loader

April 20, 2009

Wenn man immer alle Caches paperless dabei haben will und dann noch mit separaten Icons für Tradis, Multis etc. , dann kommt man in der Regel nicht darum herum, diese als POIs auf das Garmin zu laden. Das geht mit dem Garmin POI Loader – oder wiederum mit dem Sprachgenie GPSBabel. Noch ein bisschen Scripting-Zauber dazu, dann geht es damit sogar wesentlich effektiver als mit dem POI Loader. Wie genau, das erläutere ich im folgenden Artikel.

So richtig schick fand ich den Garmin POI-Loader noch nie. In der Regel muss man sich mühsam durch mehrere Seiten Dialoge klicken. Am Ende fällt dann ein gpi-File raus. Besonders blöd ist dabei, dass man den Namen dieses gpi-Files nicht beeinflussen kann. Zuvor hochgeladene POIs werden also überschrieben. Dazu sind die Namen der POI-Kategorien von den Dateinamen abhängig. Will man z.B. alle Tradis, Multis, Mysteries und alle Geldautomaten der eigenen Hausbank in eigenen Files vorhalten, muss man das mit dem POILoader mehrmals durchexerzieren und nach jedem Gang das entstandene gpi-File umbenennen. *ÄTZ*

Am coolsten wäre doch einfach folgendes zu tun:

gpx2poi -t VieleTradis.gpx -m VieleMultis.gpx -y EinPaarMysteries.gpx

und am Ende würde dann ein Tradi.gpi, Multi.gpi und ein Mystery.gpi hinten rausfallen – am besten direkt auf meinem im USB-Modus laufenden GPS. Geht nicht?

Geht doch! Und zwar mit unserem Sprachgenie GPSBabel. Ein bisschen Scripting-Zauber ist aber schon noch nötig. Und das Schöne: es funktioniert unter Windos, Mac und Linux.

Die Scripte im Folgenden sind zwar für Linux geschrieben, beinhalten aber kein schlimmes Voodoo und sollten daher einfach auf batch-Dateien portierbar sein. Wenn genug Interesse besteht, kann ich mich ja mal noch an eine Windows-Version machen. Aber nur, wenn hier genug geheult wird😉

Die Basics

Das Garmin sollte in den Massenspeichermodus versetzt werden. Dann kann man die entstehenden GPI-Dateien direkt auf der Speicherkarte des Gerätes speichern. Der Vorteil: Auch wenn man unter seinem Betriebssystem Schwierigkeiten mit der Kommunikation via Garmin-Protokoll hat, der Massenspeichermodus funktioniert in der Regel immer, weil sich das Garmin dann wie ein USB-Stick benimmt.

Folgender Befehl lädt den Inhalt einer GPX-Datei als POIs auf das Garmim, wenn es unter /media/disk/ gemountet ist:

gpsbabel -i gpx -f alle_caches.gpx -o garmin_gpi,bitmap=cache.bmp,category=Geocaches 
    -F /media/disk/Garmin/Poi/alle_cache.gpi

Das bewirken die einzelnen Optionen:

  • -i: Gibt das Eingabeformat an (i wie input). In diesem Fall also gpx
  • -f: Spezifiziert die Eingabedatei (f wie file).
  • -o: Bezeichnet das Ausgabeformat (o wie output). In diesem Fall garmin_gpi, was die Bezeichnung für das POI-Format ist. Dieses Format unterstützt noch einen Schwung weiterer Optionen, die durch Komma getrennt angehängt werden:
    • bitmap: Pfad zur Datei, die als Icon benutzt werden soll. Es muss eine bmp-Datei sein und sie darf nicht größer als 24×24 Pixel sein. Magenta wird als transparente Farbe interpretiert.
    • category: Der Name der Category. Dies hilft die verschiedenen benutzerdefinierten POIs auseinanderzuhalten (siehe weiter unten)
  • -F: Legt die Ausgabedatei fest. Die kann direkt auf das Garmin gespeichert werden oder auch erst einmal woanders hin.

Das ist nun ein bisschen zu komplex, um es jedesmal eingeben zu können. Aus diesem Grund muss ein Shellscript her.

Die Kür

Auf Grund der Lesbarkeit gebe ich das Script hier nur auszugsweise wieder. Das komplette Ding findet sich dann am Ende des Artikels.

Der oben genannte Befehl wird jetzt zum Kern unseres eigentlichen Shellscripts. Wir lagern den Aufruf in eine eigene Funktion aus und parametrisieren ihn entsprechend. Dadurch können wir diese Funktionalität an mehreren Stellen im Script benutzen:

writegpi () {
    gpsbabel -s -i gpx -f "$1" -o garmin_gpi,category="$2",bitmap="$3",sleep=1
        -F "$garmin_poi_dir/$2.gpi"
}

Alles was wir dann noch machen müssen, ist die Optionen, die auf der Kommandozeile übergeben wurden, auszuwerten und die obige Funktion mehrmals mit den entsprechenden Parametern aufzurufen. Hier ein Beispiel mit Tradis:

writegpi Traditionals.gpx "Traditionals" Tradi.bmp

In der Shell-Programmierung macht man die Parameterauswertung am geschicktesten mit dem eingebauten Befehl getopt. Das war es schon.

Benutzt man jetzt den bereits erwähnten Befehl

gpx2poi -t MyTradis.gpx -m VieleMultis.gpx -y EinPaarMysteries.gpx

erhält man unter /media/disk/Garmin/Poi die drei Dateien Traditionals.gpi, Multis.gpi und Myteries.gpi. Auf dem Garmin kann man dann unter „Find -> Eigene Pois“ alle erzeugten POIs sehen. Will man jetzt nur die Tradis, dann muss man unter „Menu -> Select database“ die richtige Kategorie auswählen. Das Script erzeugt je eine Kategorie für Traditionals, Multis und Mysteries. Alle Parameter sind optional. Das heißt man kann auch „nur“ Tradis oder „nur“ Multis angeben.

Was noch nett wäre

Das ist jetzt ein Script mit Grundfunktionalität. Weitere Ideen, die mit GPSBabel prinzipiell möglich sind, für die ich momentan aber zu wenig Zeit habe (will heißen: zu faul bin), wären:

  • Unterstützung für mehrer Dateien pro Cachetyp bei gleichzeitigem Filtern von Dubletten.
  • Unterstützung von Nicht-Cache-POIs mit entsprechenden Icons.
  • Annäherungsalarme.
  • Synchronisieren ganzer Verzeichnisse voll mit diversen gpx-Files.

Wer Lust hat, kann sich ja mal daran versuchen. …oder mir ein Ohr abkauen.

Sourcecode

Wichtig: Der Quellcode hier wird veröffentlicht wie er ist. Er funktioniert bei mir einwandfrei. Ihr könnt damit tun und lassen, was Ihr wollt. Ich übernehme allerdings keine Gewährleistung dafür, dass es bei Euch ebenso ist oder der Code Eurem System keinen Schaden zufügt. So, das musste sein, schon wegen der Absicherung.

#! /bin/bash

garmin_poi_dir=/media/disk/Garmin/Poi
tradi_bmp="$0_img/tradi.bmp"
multi_bmp="$0_img/multi.bmp"
mystery_bmp="$0_img/mystery.bmp"

writegpi () {
    gpsbabel -s -i gpx -f "$1" -o garmin_gpi,category="$2",bitmap="$3",sleep=1 -F "$garmin_poi_dir/$2.gpi"
}

set -- `getopt "t:m:y:" "$@"` || {
        echo "Anwendung: `basename $0` [-t file] [-m file] [-y file] " 1>&2
        exit 1
}

tflag=0 
mflag=0 
yflag=0
tname=NONE 
mname=NONE
yname=NONE

while :
do
    case "$1" in
           -t) tflag=1; shift; tname="$1" ;;
           -m) mflag=1; shift; mname="$1" ;;
           -y) yflag=1; shift; yname="$1" ;;
           --) break ;;
    esac
      shift
done
shift

if [ $tflag == 1 ]; then
    if [ -f "$tname" ]; 
        then # Traditionals
            echo "Exporting traditionals..."
            writegpi $tname "Traditionals" $tradi_bmp
        else
            echo "$tname is not a regular file"
    fi
fi

if [ $mflag == 1 ]; then
    if [ -f "$mname" ]; 
        then # Multis
            echo "Exporting multis..."
            writegpi $mname "Multis" $multi_bmp
        else
            echo "$mname is not a regular file"
    fi
fi

if [ $yflag == 1 ]; then
    if [ -f "$yname" ]; 
        then # Mystries
            echo "Exporting mysteries..."
            writegpi $yname "Mysteries" $mystery_bmp
        else
            echo "$yname is not a regular file"
    fi
fi

Quellen, Ressourcen & Verwandte Artikel

2 Kommentare leave one →
  1. Pegasus37 permalink
    Mai 3, 2009 3:25 pm

    Na dann fang ich doch gleich mal zu heulen an: Kannst du das bitte auch für Klicki-Bunti-Maus-Schubser auf die Reihe kriegen?
    Wenn hier nicht genug Leute mitheulen, kann mich auch noch meine Sockenpuppen einladen, damit die hier ein wenig Heulerei verbreiten…
    Im Voraus bedanke ich mich sicherheitshalber nicht, aber ich werde mich auch selbst um eine Lösung für Windows bemühen.

  2. Flopp permalink
    Mai 17, 2009 9:51 pm

    Danke für das Skript! Ich habe es mir als Anregung für ein eigenes Programm genommen, das eine GPX-Datei einließt, aussagekräftige POI-Titel erzeugt (Name+Container+D/T), zu lange Hints auf mehrere POIs verteilt und schließlich eine GPI-Datei via GPSBabel für mein Legend HCX erzeugt. Das einzige was nicht richtig funktioniert, sind die Icons für die Cache-POIs. Ich habe mit GIMP 16×16-Bitmaps erzeugt, mit Magenta als Hintergrundfarbe (damit der Hintergrund nachher auf dem GPSr transparent angezeigt wird). Aber irgendwie scheint das nicht richtig zu klappen. Die Farben des Icons sehen auf dem GPSr „komisch“ aus und der magentafarbene Hintergrund ist magenta und nicht transparent. Klappt das bei dir? Könnte ich eventuell mal Deine Bitmaps zum Test haben?

    Grüße
    Flopp

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: