Seiten

Posts mit dem Label GPX werden angezeigt. Alle Posts anzeigen
Posts mit dem Label GPX werden angezeigt. Alle Posts anzeigen

Montag, 1. Juni 2015

Skript mit grafischer Oberfläche automatisch starten, wenn USB-Gerät angeschlossen wird - Automatischer PQ-Download

Da mir es langsam auf den Keks geht, dass ich die erstellen Pocket Queries (PQ) von der Geocaching-Seite alle einzeln herunterladen und entpacken muss, wollte ich das ganze skripten.
Da der Download aber mit der neuen GC-API nicht mehr per wget möglich ist, brauch ich dazu Software, die mit der API kommunizieren kann, die fand ich schnell: http://geo.rkkda.com/ - hier das Untertool geo-pqdownload. 
Das passende Skript, das die PQ herunter lädt, entpackt und aufs Garmin kopiert, war auch schnell geschrieben; um das ganze hab ich noch ne grafische Oberfläche gepackt, damit ich weiß, dass der Vorgang noch läuft.

Nun soll das Skript immer dann starten, wenn ich mein Garmin an den Laptop anschließe und zwar ohne ein Passwort eingegeben zu müssen. Das stellte mich vor das Problem, dass das Skript so als root und nicht mit dem angemeldeten Benutzer gestartet wird, so dass ich weder Dateiberechtigungen, noch eine grafische Oberfläche bekomme.

Lösungsweg:

1. Als erstes muss man Details zum eingebundenen Gerät einholen. Dabei hilft dieser Befehl:
sudo blkid -o list -w /dev/null 
Beispiel-Ausgabe:
device                 fs_type        label             mount point                           UUID
--------------------------------------------------------------------------------------------------------------------------
/dev/sda1            vfat                                  /boot/efi                             43F4-DFAE
/dev/sda2            ext2                                 /boot                                   56acf68d-2c5b-4b69
/dev/sdd              vfat             GARMIN        /media/<user>/GARMIN         abcd-1234

2.  Als nächstes muss das entsprechende Gerät in /etc/fstab definiert werden:
UUID=abcd-1234       /media/<user>/GARMIN     vfat noauto,users,noatime,rw,sync    0       0

3. Um nun das ganze Skript automatisch auszuführen muss man eine udev-Regel erstellen.
3a) Dazu muss man vorbereitend die Geräteinformationen ermitteln:
lsusb
Beispiel-Ausgabe:
Bus 003 Device 006: ID abcd:1234 Garmin International

3b) Detailinformationen zum Gerät ermitteln:
sudo lsusb -vs  003:006 
So erhält man u.a. den Eintrag zur Seriennummer:
iSerial                  xxxxxyyyy1234
3c) Nun kann man im Verzeichnis: /etc/udev/rules.d eine neue Regel erstellen, z.B.: Garmin.rules
KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{serial}=="xxxxxyyyy1234", SYMLINK+="GARMIN", ACTION=="add", RUN+="/home/<user>/Skripte/UpdatePQ_Helper.sh"
Wobei hier ein Gerät mit
  • Kernel-Einhängepunkt: /dev/sd?1
  • vom Typ: USB
  • mit der Seriennummer: xxxxxyyyy1234
  • Dateisystem-Einhängepunkt: GARMIN
  • Aktion: Hinzufühen (ADD)
gesucht wird. Sind alle Bedingungen erfüllt wird mit RUN das angegebene Skript gestartet - bei mir ein Hilfsskript.

4. Skriptaufruf
Ein Direktaufruf des Skripts ist nicht möglich, da so die grafische Oberfläche nicht sichtbar ist und wie o.e. nur mit root-Rechten ausgeführt wird.

Im Hilfsskript ist der Inhalt hier nur:
#!/bin/bash
#UpdatePQ_Helper.sh
DISPLAY=:0 LANG=de_DE.UTF-8 su -c /home/<user>/Skripte/UpdatePQ.sh <user>
DISPLAY=:0 LANG=de_DE.UTF-8 braucht man zwingend für die grafische Oberfläche.
Der zweite Teil lässt das eigentliche Skript mit einem bestimmten Benutzer ausführen.

Das Hilfsskript und das eigentliche Skript müssen noch ausführbar gemacht werden:
chmod a+x ~/Skripte/UpdatePQ.sh ~/Skripte/UpdatePQ_Helper.sh

5. Gerät anschließen
Schließt man nun das Gerät an, wird dieses automatisch eingehängt, das Skript gestartet und am Ende wieder ausgehängt.

Färtsch.

P.S. Um das alles herauszufinden, war doch ein wenig Google-Hilfe nötig, daher auch der Blogeintrag, sonst muss ich das wieder alles einzeln ermitteln, wenn ich mein System das nächste Mal neu aufsetze.

Sonntag, 22. März 2015

Wie wandle ich GPX-Dateien in eine Blog-fähige Karte um?

Die Frage stellte mich vor eine Aufgabe, die ich so nicht erwartet hätte. Anscheinend ist mein Anliegen so ungewöhnlich, dass es von anderen Nutzern kaum gewollt ist.
Wie bekomme ich nun meine im Urlaub mitgetrackten Daten in eine Karte, die sich nicht nur scrollbar in meinen Blog einbinden lässt, sondern auch noch alle Wegpunkte händeln kann?
Zugegeben, hab ich mir das sehr viel leichter vorgestellt, als es eigentlich ist. So ging ich davon aus, dass ich die erstellten Dateien einfach bei Google Maps hochladen kann und mir eine Karte mit meiner Wegstrecke angezeigt wird, und diese Karte einfach in meinen Blog einbinden kann. *Haha* ... wenn es denn so einfach wäre!

Erstmal die Fakten:
  • 47 .gpx-Dateien
  • mit 90k+ Wegpunkten
Steine, die mir in den Weg gelegt wurden:
  • Der Import bei GMaps verlangt eine CSV, XLSX oder KML-Datei.
  • Selbst wenn man eine KML-Datei importieren will, ist die Grenze hier bei 5MB pro Datei, mit max. 2k Wegpunkten.
  • Google akzeptiert maximal 10 Ebenen, damit 10 KML-Dateien. Sprich insgesamt 20k Wegpunkte.
  • Verschiedene Seiten im Netz, z.B. die, oder die können nur eine GPX verarbeiten.
  • In Google Earth, lassen sich zwar alle importieren, aber nicht als GMaps-Karte exportieren.
  • Nach Import aller Daten in Google Earth ist Spaß in der CPU angesagt, denn 100% werden von Google Earth veranschlagt und auf dem Rechner geht nicht mehr viel.
  • Versucht man hier den Export als KML-Datei, wird eine 97MB-Datei erzeugt.
  • In OpenStreetMaps lassen sich zwar die Wegpunkte importieren, eine Karte mit einer Strecke bekommt man aber nicht und muss diese händig erstellen.
  • Garmin "BaseCamp" ließ sich unter Linux (mittels Wine) nicht installieren.
  • QLandkarteQT lässt den Import aller Dateien zu, allerdings nicht den Export als KML-Datei(en).

Auf der Suche, wie ich nun aus meinen 47 Dateien eine KML-Datei erstellen kann, fand ich GPSBabel. Mittels Befehl:
gpsbabel -i gpx `for i in *.gpx; do echo -n " -f $i "; done` -o gpx -F AllGPX.gpx
lassen sich alle GPX-Dateien in eine GPX-Datei umwandeln.
(Beachte: Keine Leerzeichen im Dateinamen - Garmin-Geräte erzeugen Dateien standardmäßig mit Leerzeichen.)

Nun kann man die entstandene Datei noch ausdünnen und ähnliche Wegpunkte (in diesem Fall alle Wegpunkte, die weniger als einen Meter entfernt liegen) entfernen. Weitere Informationen dazu gibt es hier.
gpsbabel -i gpx -f AllGPX.gpx -x simplify,crosstrack,error=0.001k -o gpx -F simple.gpx
So verbleiben von 90k+ Wegpunkten immerhin noch 55k+ Wegpunkte.

Versucht man nun die entstandene ausgedünnte Datei in eine KML-Datei umzuwandeln, entsteht eine 97MB (ohne Ausdünnung 230MB) große Datei. Diese ist auf Grund ihrer Größe ebenfalls unnütz für GMaps.

Dann versuchte ich Openstreetmaps, das zwar mit der Datenmenge erstmal keine Probleme hatte, aber mir eine Karte mit Strecke verweigerte, so dass ich die Strecke händig nachmalen muss. Nicht gerade das, was ich will, denn ich will den bequemen Weg.

Nachdem mir nun langsam die Suchbegriffe ausgingen und ich sogar schon die zweite Ergebnisseite bei Google aufrufen musste, fand ich endlich GPSies, die Seite kann zwar meine zusammengefassten originalen 90k+ Wegpunkte auch nicht händeln - da die Dateigröße mit 10MB zu groß ist (max. 8MB zugelassen) - ist aber in der Lage die ausgedünnte GPX-Datei (mit 6,xMB) zu verarbeiten.

Die Seite hab ich nun genutzt, zeigt alle Wegpunkte gut an und lässt sich bequem per iframe-Tag in meinen Blog einbinden. Da es aber selbst-betitelt ein "Hobby-Projekt" ist, ahne ich schon, dass dies keine unendliche Lösung ist, aber immerhin schon mal ein Anfang und falls die Seite irgendwann den Dienst einstellen sollte, hoffe ich, dass es neue Lösungen gibt, die mir ein ähnlich einfachen Weg zur Verfügung stellen.