Open Source im professionellen Einsatz
Linux-Magazin 07/2006
© The Vorck Project

© The Vorck Project

GPS-Daten mit Perl auswerten und online in Karten einblenden

Hinterm Horizont

Der naturverbundene Perl-Hacker erforscht die Bergwelt selbstverständlich mit einem Navigationssystem. Dass er anschließend seine erbrachte Wanderleistung grafisch auswertet, ist Ehrensache.

805

Mit einem tragbaren Navigationssystem wandern macht gleich viel mehr Spaß. Der GPS-Empfänger teilt dem Wanderer nicht nur ständig die aktuelle Position mit, sondern auch seine Höhe über dem Meeresspiegel oder seine Entfernung zu einprogrammierten Objekten. Auch von der Wandergeschwindigkeit, der bisher zurückgelegten Wegstrecke und der wahrscheinlich noch benötigten Zeit bis zum Ziel weiß das System stets zu berichten. Nach abgeschlossener Wanderung lässt sich das Gerät an den heimischen PC anschließen, um die unterwegs gesammelten GPS-Daten herunterzuladen und auszuwerten.

Der GPS-Empfänger Etrex von Garmin [7] ist nur ein Einsteigermodell, eignet sich aber hervorragend für den sporadischen Wanderer. Er ist ab etwa 120 Euro zu haben, handlich, wasserfest und so robust, dass er auch leichte Stürze überlebt (Abbildung 1). Um den Empfänger nach der Wanderung an den heimischen PC anzuschließen, ist ein Spezialkabel erforderlich, das den Etrex mit der seriellen Schnittstelle des Rechners verbindet. Das Original ist überteuert (ab 25 Euro), weswegen es unter [3] ein Selbstbau-Projekt gibt. Mein Lötkolben blieb dieses Mal kalt, ich habe das Teil einfach gekauft (Abbildung 2),

Listing 1:
»tracks2yml«

01 #!/usr/bin/perl -w
02 use strict;
03 use Sysadm::Install qw(:all);
05 use XML::Twig;
06 use Date::Parse;
07 use YAML qw(DumpFile);
08
09 my $twig= XML::Twig->new(
10     TwigHandlers => {
11         "trkpt" => &handler,
12     }
13 );
14 my @points = ();
15 $twig->parsefile("tracks.xml");
16 DumpFile("tracks.yml", @points);
17
18 ###########################################
19 sub handler {
20 ###########################################
21     my($t, $trkpt)= @_;
22     my $lat     = $trkpt->att('lat');
23     my $lon     = $trkpt->att('lon');
24     my $ele     = $trkpt->first_child(
25                             'ele')->text();
26     my $isotime = $trkpt->first_child(
27                            'time')->text();
28     my $time    = str2time($isotime);
29     push @points, {
30         lat => $lat, lon => $lon,
31         ele => $ele, time => $time,
32         isotime => $isotime,
33     };
34 }

Abbildung 1: Der mobile GPS-Empfänger Etrex von Garmin, ein preiswertes Gerät der Einsteigerklasse.

Abbildung 2: Ein Spezialkabel verbindet den Etrex mit der seriellen Schnittstelle des Rechners.

Babylonische Verwirrung

GPS-Empfänger arbeiten leider mit unterschiedlichen Koordinaten-Formaten. Diese Sprachverwirrung babylonischen Ausmaßes bekämpft das Freeware-Programm »gpsbabel« [4]. Es beherrscht nicht nur Dutzende Datenformate, sondern liest unter Linux auch die Daten von einem am seriellen Port hängenden Garmin Etrex aus. Im Speicher des GPS-Empfängers liegen gesammelte Waypoints (auf Knopfdruck festgehaltene Ortspunkte), Routes (Wegpunkte geplanter Routen) und Tracks (Spuren, automatisch alle paar Sekunden aufgezeichnete Ortspunkte).

Wer vor dem Start seinen Trackspeicher löscht und am Ziel auf den Rechner herunterlädt, erhält eine digitale Aufzeichnung der Wanderstrecke. Nun kann er die Positionsdaten kreativ auswerten. Hängt der Garmin etwa an der zweiten seriellen Schnittstelle, lädt »gpsbabel -t -i garmin -f /dev/ttyS1 -o gpx -F tracks.txt« die Trackdaten (»-t«) im Garmin-Format (»-i garmin«) von der Schnittstelle »/dev/ttyS1« und speichert sie im GPX-Format (»-o gpx«) in »tracks.txt« (»-F tracks.txt«).

Damit der Prozess, der den Garmin ansteuert, nicht mit Root-Rechten laufen muss, macht der folgende Befehl den Device-Eintrag für die serielle Schnittstelle einfach für alle beschreibbar:

> chmod a+rw /dev/ttyS1
> ls -l /dev/ttyS1
crw-rw-rw- 1 root uucp 4, 65 Feb 10 22:47 /dev/ttyS1


Nach geraumer Weile (serielle Schnittstellen stammen aus dem vergangenen Jahrhundert) kehrt das »gpsbabel«-Kommando zurück und in »tracks.txt« liegen die Daten im XML-Format (Abbildung 3). Damit die folgenden Auswertungen diese XML-Daten nicht parsen müssen, transformiert sie das Skript »tracks2yml« in das augenfreundliche YAML-Format, das sich zudem in einem Rutsch in eine Perl-Datenstruktur verwandeln lässt. Abbildung 4 zeigt die YAML-Daten.

Abbildung 3: Dieses nicht leicht lesbare Format haben die frisch vom Garmin heruntergeladenen GPX-Streckendaten vor der Konvertierung.

Abbildung 4: Die gleichen Track-Daten wie in Abbildung 3 jetzt im YAML-Format nach der Umwandlung durch »track2yml«.

Koordinaten-Objekt

Das Skript »tracks2yml« in Listing 1 nutzt das Modul »XML::Twig«, das - wie in [5] schon gezeigt - einen Handler definiert, den der Twig-Tänzer bei jedem Trkpt-Tag anspringt. Das dem Handler übergebene Objekt vom Typ »XML::Twig::Elt« repräsentiert das gefundene Trkpt-Tag mit allen Unter-Tags.

Das Attribut »lat« (Latitude, Breite) gibt die geographische Breite des Wegpunkts in Dezimalschreibweise an. Nördliche Breitengrade sind positiv, südliche negativ. Das Attribut »lon« (Longitude, Länge) benennt die geographische Länge, wobei westliche Längengrade negativ, östliche hingegen positiv sind. Das Unterelement »ele« (Elevation, Höhe) legt die Höhe des Trackpunkts über dem Meeresspiegel in Metern fest. Im Tag »time« liegt die UTC-Uhrzeit (GMT-Zeitzone) in ISO-8601-Schreibweise.

Die Funktion »str2time()« aus dem Modul Date::Parse vom CPAN macht daraus die Zeitzonen-unabhängige Unix-Zeit in Sekunden für spätere Berechnungen. »handler()« ab Zeile 19 packt alle gefundenen Daten in einen Hash und speichert eine Referenz darauf als Element im globalen Array »@points« ab. Die abschließend aufgerufene Methode »DumpFile()« des Moduls »YAML« speichert den gesamten Array mit den darin enthaltenen Hashreferenzen gut lesbar in der Datei »tracks.yml«. Von dort wird der Array in den folgenden Skripten wieder mit einem einfachen »LoadFile()« eingelesen.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4,5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Handgeräte für die Navigation weisen den Weg und schreiben bei Wanderungen laufend die aktuelle Position mit. Mit einigen Skripten unter Linux bereitet Extrembergsteiger Michael Schilli die Daten seiner waghalsigen Erstbesteigungen optisch ansprechend auf.

  • Perl-Snapshot

    Michael Schilli ist gut zu Fuß: Mit einem kleinen GPS-Empfänger am Arm durchfegt der Perl-Athlet (nicht nur) in diesem Monat das Umland von San Francisco. Wieder zu Hause bereitet er keuchend die gesammelten Laufdaten mit Perl-Skripten grafisch auf.

  • Tooltipps

    Jsonwatch 0.1.1, Mkgmap r3116, Flat File Extractor 0.3.4, Flom 0.3.1, Synctool 6.0 sowie Malheur 0.5.4.

  • Datenfischer

    XML ist ein nicht überall heiß geliebtes, aber viel genutztes Austauschformat. Für Perl gibt es sehr viele Erweiterungen, um bequem in diesem Datenmeer zu fischen. Der heutige Snapshot diskutiert Vor- und Nachteile der gängigen XML-Module — das jeweils zweckmäßigste ist dann schnell gefunden.

  • Kostenlose Karten fürs Navi mit Openstreetmap

    Die Hersteller von GPS-Systemen verlangen saftige Preise für aktuelles Kartenmaterial, aber mit freier Software und Kartendiensten wie Openstreetmap lässt sich viel Geld sparen. Gpsbabel, Openstreetmap, Googlemaps und Qlandkarte, sind Tools mit denen Linux-Benutzer ihr an USB angeschlossenes GPS überreden können, kostenlose Karten zu nutzen und die abgelaufenen Wege oder gefahrenen Routen auf dem Linux-Desktop anzuzeigen. Linux-Magazin Online hat sich die Tools angeschaut.

comments powered by Disqus

Ausgabe 01/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.