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