Bergauf, bergab
Meine bisher letzte satellitengestützte Wanderung führte auf die nördlich der Golden Gate Bridge gelegenen Wanderwege "Coastal Trail" und "Rodeo Trail". Auf und ab ging es durch die Marin Headlands, eine malerische Hügellandschaft am Pazifischen Ozean.
Wenn ich aus den Daten, die das GPS-System über drei Stunden lang gesammelt hat, die Höhenangaben extrahiere und auf der Zeitachse auftrage, ergibt sich Abbildung 6. Kurz nach 13:00 Uhr ging die Wanderung etwa 200 Meter über dem Meerespiegel los, um nach etwa eineinhalb Stunden bei leichtem Auf und Ab bis auf Meereshöhe abzufallen. Zum Schluss folgt noch ein steiler einstündiger 200-Meter-Anstieg zurück zum Eingang des Rundwegs.
Listing 2 plottet den Graphen mit Hilfe des Moduls »RRDTool::OO«, das unter der Haube die Round-Robin-Datenbank »rrdtool« verwendet. Rrdtool kam vor allem wegen der eleganten (sprich automatischen) Datumsanzeige auf der x-Achse zum Einsatz. Zeile 7 liest die YAML-Daten ein, der darauf folgende Konstruktor »new()« erzeugt eine neue RRD-Datenbank mit einer temporären Datei als Speicher, denn die Daten werden später nicht mehr gebraucht.
|
Listing 2: |
|---|
01 #!/usr/bin/perl -w
02 use strict;
03 use YAML qw(LoadFile);
04 use RRDTool::OO;
05 use File::Temp qw(tempfile);
06
07 my $trkpts = LoadFile("tracks.yml");
08
09 my $rrd = RRDTool::OO->new(
10 file => (tempfile())[1]);
11
12 $rrd->create(
13 start => $trkpts->[0]->{time} -- 1,
14 step => 60,
15 data_source => { name => "elevation",
16 type => "GAUGE" },
17 archive => { rows => 10000 });
18
19 for my $trkpt (@$trkpts) {
20 eval { # Deal with dupes
21 $rrd->update(time => $trkpt->{time},
22 value => $trkpt->{ele});
23 };
24 }
25
26 $rrd->graph(
27 start => $trkpts->[0]->{time},
28 end => $trkpts->[-1]->{time},
29 image => "elevation.png",
30 vertical_label => 'Elevation',
31 width => 300,
32 height => 75,
33 lower_limit => 0,
34 );
|
Die Funktion »tempfile()« liefert zwei Argumente zurück, von denen »new()« nur den Namen der Temp-Datei überreicht bekommt. Die Methode »create()« definiert anschließend das Schema des Datenspeichers, der alle 60 Sekunden einen Wert erwartet. Der GPS-Empfänger liefert seine Trackdaten zwar alle paar Sekunden, doch »rrdtool« mittelt sie einfach. Die Datenbank speichert maximal 10000 gerundete Minuten-Messpunkte, das dürfte auch für die längsten Gewaltmärsche ausreichen.
Die »for«-Schleife ab Zeile 19 iteriert über alle Trackpunkte und verfüttert sie samt der zugehörigen Uhrzeit mit Hilfe der Methode »update()« an die Datenbank. Da »rrdtool« die Eigenheit hat, gleich auszurasten, wenn zum Beispiel derselbe Zeitstempel zweimal vorliegt, umrahmt ein »eval«-Block den Update-Befehl, der auf diese Weise kleine Fehler ungestraft durchlässt.
Das Zeichnen des Graphen erledigt die Methode »graph()«. Der erste Trackpunkt bestimmt die Startzeit, der Zeitstempel des letzten Messwerts das Ende - und schon liegt das ansprechend gestaltete Diagramm im PNG-Format in der Datei »elevation.png«.
Um die Zahl der abgespulten Kilometer auszurechnen, muss Listing 3 durch alle Trackpunkte iterieren, jeweils die Distanz zwischen ihnen ausrechnen und die Einzelstrecken addieren. Jeder Trackpunkt ist eine Referenz auf einen Hash, der unter dem Schlüssel »lat« den Breitengrad und unter »lon« den Längengrad führt. In » liegt während jeder Schleifeniteration (außer der ersten) der Trackpunkt des vorherigen Durchgangs. Die Strecke zwischen zwei Messpunkten bestimen ist nicht ganz trivial, da es sich um die Entfernung auf der Oberfläche eines Ellipsoids handelt. Das Modul Geo::Distance vom CPAN führt die Berechnung mit trigonometrischen Funktionen aus und bietet dafür die einfach zu bedienende Methode »distance()« an. Parameter sind die gewünschte Maßeinheit (Kilometer oder Miles) und zwei Messpunkte als Längen- und Breitenwert, zurück kommt die errechnete Strecke:
$ ./dist Total: 11.67km
|
Listing 3: |
|---|
01 #!/usr/bin/perl -w
02 use strict;
03 use YAML qw(LoadFile);
04 use Geo::Distance;
05
06 my $trkpts = LoadFile("tracks.yml");
07 my $geo = Geo::Distance->new();
08
09 my $total = 0;
10 my $last_pt;
11
12 for my $trkpt (@$trkpts) {
13 if($last_pt) {
14 my $k = $geo->distance("kilometer",
15 $last_pt->{lon}, $last_pt->{lat},
16 $trkpt->{lon}, $trkpt->{lat});
17
18 $total += $k;
19 }
20 $last_pt = $trkpt;
21 }
22
23 printf "Total: %.2fkmn", $total;
|
Landkarten aufmischen
Populär sind gerade die so genannten Mash-ups. Sie bohren Online-Landkarten mit Erweiterungen auf. Neben Google bietet auch mein Arbeitgeber Yahoo die Möglichkeit, mit einem einfachen Javascript-API skalierbare Karten dynamisch mit Markern zu versehen.
Um den zurückgelegten Weg in die Yahoo-Map einzuzeichnen, muss zunächst die Datenmenge reduziert werden. Alle 1800 Trackpunkte ergäben ein undurchdringbares Tohuwabohu. Daher schiebt Listing 4 in einer »for«-Schleife nur jene Trackpunkte hinten auf den Array »@points«, die mindestens 0,4 Kilometer voneinander entfernt sind. Geo::Distance führt auch hier die komplexen Distanzberechnungen durch.
Abbildung 7: Die fertige Mash-up-Darstellung mit den einzelnen Wegpunkten des Wanderwegs nördlich von San Francisco.
Abbildung 8: Das gleiche Mash-up, per Knopfdruck (links oben) in die hybride Satellitendarstellung geschaltet und mit dem Zoom-Meter (rechts oben) vergrößert.
|
Listing 4: |
|---|
01 #!/usr/bin/perl -w
02 use strict;
03 use YAML qw(LoadFile);
04 use Geo::Distance;
05 use Template;
06
07 my $trkpts = LoadFile("tracks.yml");
08 my $geo = Geo::Distance->new();
09
10 my $count = 0;
11 my $min = 0.4; # Minimum marker distance
12 my @points = ();
13 my $last_pt;
14
15 for my $trkpt (@$trkpts) {
16 if($last_pt) {
17 my $k = $geo->distance("kilometer",
18 $last_pt->{lon}, $last_pt->{lat},
19 $trkpt->{lon}, $trkpt->{lat});
20
21 next if $k < $min;
22 }
23 $trkpt->{count} = ++$count;
24 push @points, $trkpt;
25
26 $last_pt = $trkpt;
27 }
28
29 my $template = Template->new();
30 my $vars = { points => @points };
31
32 $template->process("map.tmpl", $vars) or
33 die $template->error();
|
Diesen Artikel als PDF kaufen
Express-Kauf als PDF
Umfang: 4,5 Heftseiten
Preis € 0,99
(inkl. 19% MwSt.)
Als digitales Abo
Weitere Produkte im Medialinx Shop »
Versandartikel
Onlineartikel
Alle Rezensionen aus dem Linux-Magazin
- Buecher/07 Bücher über 3-D-Programmierung sowie die Sprache Dart
- Buecher/06 Bücher über Map-Reduce und über die Sprache Erlang
- Buecher/05 Bücher über Scala und über Suchmaschinen-Optimierung
- Buecher/04 Bücher über Metasploit sowie über Erlang/OTP
- Buecher/03 Bücher über die LPI-Level-2-Zertifizierung
- Buecher/02 Bücher über Node.js und über nebenläufige Programmierung
- Buecher/01 Bücher über Linux-HA sowie über PHP-Webprogrammierung
- Buecher/12 Bücher über HTML-5-Apps sowie Computer Vision mit Python
- Buecher/11 Bücher über Statistik sowie über C++-Metaprogrammierung
- Buecher/10 Bücher zu PHP-Webbots sowie zur Emacs-Programmierung
Insecurity Bulletin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...





