Bei Trackaufzeichnungen stimmen manchmal die Höhenangaben nicht oder es sind
Sprünge in der Aufzeichnung (siehe Abbildung, gelber Pfeil).

Dies kann verschiedene Gründe haben:
Als Konsequenz sehen manche Höhenprofile ziemlich häßlich aus und eignen sich insbesondere
nicht für eine Veröffentlichung. Mit GPS-Babel kann man leider nur einen konstanten Wert zur
Höhe addieren.
Ich habe gerade ein kleines Perl-Skript geschrieben zur Korrektur von Höhendaten in GPS-Tracks
im GPX-Format. Der Programmcode ist unten.
Das Skript wird mit folgenden Parametern aufgerufen:
Hoehe.pl Input.gpx Output.gpx n1 n2 H1 H2
Input.gpx: GPX-Datei, die den Track enthält (und nur diesen !!!), statt "Input.gpx"
wird der Name der einzulesenden Datei angegeben.
Output.gpx: GPX-Datei, in die der korrigierte Track geschrieben wird. Dateiname ist
frei wählbar, Endung sollte .gpx sein.
n1: Nummer des ersten Trackpunkts, der verändert werden soll.
n2: Nummer des letzten Trackpunkts, der verändert werden soll.
H1: Höhe, die Trackpunkt n1 nach der Korrektur haben soll.
H2: Höhe, die Trackpunkt n2 nach der Korrektur haben soll.
Nach Aufruf des Skripts passt dieses die Höhenwerte zwischen n1 und n2 (einschließlich)
an und schreibt das Ergebnis in die Ausgabedatei. Wenn mehrere Segmente eines Tracks
geändert werden sollen, muss das Skript mehrfach aufgerufen werden und die Ausgabedatei
muss zur Eingabe verwendet werden.
Kann sein, dass noch ein paar Fehler im Skript sind, ich habe das noch nicht ausgiebig
getestet. Fehlermeldungen bitte an mich, ich setze dann eine korrigierte Version hier rein.
Viel Spaß
Jürgen
Sprünge in der Aufzeichnung (siehe Abbildung, gelber Pfeil).

Dies kann verschiedene Gründe haben:
- Die richtige Ausgangshöhe wurde nicht eingestellt.
- Das GPS-Gerät passt die Höhe während der Wanderung an.
- Der Anwender korrigiert die Höhe während der Tour.
- Durch Luftdruckänderungen werden die Höhenwerte verfälscht.
Als Konsequenz sehen manche Höhenprofile ziemlich häßlich aus und eignen sich insbesondere
nicht für eine Veröffentlichung. Mit GPS-Babel kann man leider nur einen konstanten Wert zur
Höhe addieren.
Ich habe gerade ein kleines Perl-Skript geschrieben zur Korrektur von Höhendaten in GPS-Tracks
im GPX-Format. Der Programmcode ist unten.
Das Skript wird mit folgenden Parametern aufgerufen:
Hoehe.pl Input.gpx Output.gpx n1 n2 H1 H2
Input.gpx: GPX-Datei, die den Track enthält (und nur diesen !!!), statt "Input.gpx"
wird der Name der einzulesenden Datei angegeben.
Output.gpx: GPX-Datei, in die der korrigierte Track geschrieben wird. Dateiname ist
frei wählbar, Endung sollte .gpx sein.
n1: Nummer des ersten Trackpunkts, der verändert werden soll.
n2: Nummer des letzten Trackpunkts, der verändert werden soll.
H1: Höhe, die Trackpunkt n1 nach der Korrektur haben soll.
H2: Höhe, die Trackpunkt n2 nach der Korrektur haben soll.
Nach Aufruf des Skripts passt dieses die Höhenwerte zwischen n1 und n2 (einschließlich)
an und schreibt das Ergebnis in die Ausgabedatei. Wenn mehrere Segmente eines Tracks
geändert werden sollen, muss das Skript mehrfach aufgerufen werden und die Ausgabedatei
muss zur Eingabe verwendet werden.
Kann sein, dass noch ein paar Fehler im Skript sind, ich habe das noch nicht ausgiebig
getestet. Fehlermeldungen bitte an mich, ich setze dann eine korrigierte Version hier rein.
Viel Spaß
Jürgen
Code:
#!/usr/bin/perl -w if (@ARGV != 6) { print "Hoehe.pl Input.gpx Output.gpx n1 n2 H1 H2\n"; exit 0; } $i = 0; ($n1, $n2, $H1, $H2) = ($ARGV[2], $ARGV[3], $ARGV[4], $ARGV[5]); open IN, $ARGV[0]; while ( $_ = <IN> ) { if (m/<ele>(.+)<\/ele>/i) { $i++; if ($i == $n1) { $h1 = sprintf "%f", $1; $_ = <IN>; $_ =~ m/<time>\d{4}-\d{2}-\d{2}T(\d{2}):(\d{2}):(\d{2})Z<\/time>/i; $t1 = (($1 * 60 + $2) * 60) + $3; } elsif ($i == $n2) { $h2 = sprintf "%f", $1; $_ = <IN>; $_ =~ m/<time>\d{4}-\d{2}-\d{2}T(\d{2}):(\d{2}):(\d{2})Z<\/time>/i; $t2 = (($1 * 60 + $2) * 60) + $3; } } } print "$i Trackpunkte\n"; close IN; $dt = $t2 - $t1; $m = $H2 - $H1 + $h1 - $h2; $i = 0; $flag = 0; open IN, $ARGV[0]; open OUT, '>' . $ARGV[1]; while ( $_ = <IN> ) { if (m/<ele>(.+)<\/ele>/i) { $i++; if ($i == $n1) { $flag = 1; } elsif ($i == $n2 + 1) { $flag = 0; } if ($flag == 1) { $h = sprintf "%f", $1; $_ = <IN>; $_ =~ m/<time>\d{4}-\d{2}-\d{2}T(\d{2}):(\d{2}):(\d{2})Z<\/time>/i; $t = (($1 * 60 + $2) * 60) + $3; $H = $h + $H1 - $h1 + ($t - $t1)/$dt * $m; printf OUT " <ele>%4.7f</ele>\n", $H; print OUT; } else { print OUT; } } else { print OUT; } } close IN; close OUT;
Kommentar