Einzelne Tracks aus GPX-Dateien extrahieren

Wer wie ich einen GPS-Empfänger mit Tracking(Wegaufzeichnungs)-Funktion hat und gpsbabel verwendet, der kennt vielleicht das Problem, dass die Daten zwar ohne Probleme ausgelesen und in das GPX-Format konvertiert werden können. Dann sind jedoch alle aufgezeichneten Tracks in einer Datei.

Allgemein

Leider bietet gpsbabel keine Funktion, mit der die einzelnen Tracks aus einer GPX-Datei extrahiert werden können und mir ist im Moment auch kein anderes Programm bekannt, welches das für mich macht.

Diese Funktion lässt sich jedoch sehr leicht mit einem kleinen Perl-Skript unter Linux nachrüsten.

Exportieren der Tracks

Jeder Track bekommt einen Namen

Mit gpsbabel können die einzelnen Tracks in einer GPX-Datei einzeln benannt werden. Dazu muss folgender Befehl ausgeführt werden.

$ gpsbabel -t -r -w -i gpx -f eingabe.gpx -x track,title='track-%Y%m%d-%H%M%S' -o gpx -F ausgabe.gpx

Jetzt hat jeder Track einen Namen im Format "track-JJJJMMTT-HHmmSS" bekommen.

Achtung: Die Zeit entspricht immer der GMT nicht der lokalen Zeit

Jeder Track kommt in eine eigene Datei

Jetzt, wo jeder Track einen eigenen Namen hat können diese einzeln extrahiert werden. Um das zum automatisieren habe ich ein kleines Perl Skript geschrieben, was mir diesen Vorgang abnimmt. Dabei wird jeder Track in eine Datei mit dem Namen "track-JJJJMMTT-HHmmSS.gpx" geschrieben.

An dieser Stelle das kleine Perl Skript

#!/usr/bin/perl -w

$file = $ARGV[0];
open(INFILE, $file);
@tracks = ();
while($line = ) {
        if($line =~ m/ *(track-[0-9-]*)<\/name>/i) {
                push(@tracks, $1);
        }
}
close(INFILE);
$count = 1;
$num = @tracks;
foreach(@tracks) {
        system("gpsbabel -t -r -w -i gpx -f $file -x track,name='$_' -o gpx -F $_.gpx");
        print "Track $count from $num\n";
        $count++;
}

Das Skript muss wie folgt aufgerufen werden:

$ ./export.pl eingabe.gpx

Achtung: Die Tracks müssen schon einen Namen haben.

Achtung: Anwendung auf eigene Gefahr, ich übernehme keine Haftung für eventuelle Schäden

Beides kombinieren

Um noch mehr Arbeit zu sparen kann das Perl Skript noch leicht erweitert werden und sieht jetzt wie folgt aus.

#!/usr/bin/perl -w

$file = $ARGV[0];
$tmp_file = "$file.tmp";
print "Setting track names ... ";
system("gpsbabel -t -r -w -i gpx -f $file -x track,title='track-%Y%m%d-%H%M%S' -o gpx -F $tmp_file");
print "done\n";
print "Getting track names ... ";
open(INFILE, $tmp_file);
@tracks = ();
while($line = ) {
        if($line =~ m/ *(track-[0-9-]*)<\/name>/i) {
                push(@tracks, $1);
        }
}
close(INFILE);
print "done\n";
$count = 1;
$num = @tracks;
print "Tracks found: $num\n";
print "Extracting tracks ... \n";
foreach(@tracks) {
        system("gpsbabel -t -r -w -i gpx -f $tmp_file -x track,name='$_' -o gpx -F $_.gpx");
        print "Track $count from $num\n";
        $count++;
}
print "done\n";

Das Skript wie folgt aufgerufen:

$ ./export.pl eingabe.gpx

Schritt 1 und Schritt 2 sind jetzt in einem Schritt zusammengefasst.

Achtung: Für jeden Track wird eine neue GPX-Datei angelegt

Achtung: Anwendung auf eigene Gefahr, ich übernehme keine Haftung für eventuelle Schäden

Verwandte Artikel