Ciąg dlaszy wpisu Rejestrowanie wysokości przez odbiorniki GPS
Ciąg dalszy bo ,,ciąg technologiczny'' FIT →TCX →GPX →srtm.py →lepszy_GPX→Endomondo/Strava pozbawia niestety przesyłany plik GPX danych, które nie są wspierane przez format GPX (takie jak tętno dla przykładu).
Problem można rozwiązać dodając do pliku TCX poprawione wysokości z pliku lepszy_GPX:
#!/usr/bin/perl use XML::LibXML; use XML::LibXML::XPathContext; use Getopt::Long; binmode(STDOUT, ":utf8"); my $Gpx_file; my $Tcx_file; ## gpx -- plik GPX z poprawionymi wysokościami ## tcx -- oryginalny plik TCX (w którym mają być poprawione wysokości) GetOptions( "gpx=s" => \$Gpx_file, "tcx=s" => \$Tcx_file, ) ; my $parser = XML::LibXML->new(); for my $file2parse ("$Gpx_file") { my $doc = $parser->parse_file($file2parse); my $root = $doc->documentElement(); my $xc = XML::LibXML::XPathContext->new( $root ); $xc->registerNs('gpx', 'http://www.topografix.com/GPX/1/0'); foreach my $t ($xc->findnodes('//gpx:trkpt')) { my $xpe = XML::LibXML::XPathContext->new( $t ); $xpe->registerNs('gpx', 'http://www.topografix.com/GPX/1/0'); $node++; $gmttime = ($xpe->findnodes('gpx:time'))[0]->textContent(); $altitude = ($xpe->findnodes('gpx:ele'))[0]->textContent(); $GpxPoints{"$gmttime"} = $altitude; } } ## for $e (keys %GpxPoints) { print "$e => $GpxPoints{$e}\n"; } for my $file2parse ("$Tcx_file") { # http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 my $doc = $parser->parse_file($file2parse); my $root = $doc->documentElement(); my $xc = XML::LibXML::XPathContext->new( $root ); $xc->registerNs('tcx', 'http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2'); foreach my $t ($xc->findnodes('//tcx:Trackpoint')) { my $xpe = XML::LibXML::XPathContext->new( $t ); $xpe->registerNs('tcx', 'http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2'); $gmttime = ($xpe->findnodes('tcx:Time'))[0]->textContent(); foreach my $xpa ( $xpe->findnodes('tcx:AltitudeMeters') ) { $oldAltitude = $xpa->textContent(); ## jeżeli istnieje w pliku GPX punkt z tym samym stemplem ## czasu zmień zawartość elementu tcx:AltitudeMeters if (exists $GpxPoints{$gmttime} ) { ## replace content of tcx:AltitudeMeters $xpa->removeChildNodes(); $xpa->appendText("$GpxPoints{$gmttime}"); $changedNodesNo++; } else { ## jeżeli nie istnieje usuń cały węzeł my $parent = $t->parentNode; $parent->removeChild( $t ); $droppedNodes .= "$gmttime;"; $droppedNodesNo++; } } } ### ### print "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>\n"; print $root->toString; ### ### } print STDERR "Zmieniono: $changedNodesNo / Usunięto: $droppedNodesNo\n"; print STDERR "($droppedNodes)\n";
Ponieważ skrypt srtm.py
nie tworzy pliku GPX zawierającego wszystkie punkty z pliku TCX (z jakiś powodów niewielka część jest pomijana); warunek exists $GpxPoints{$gmttime}
sprawdza czy istnieje w pliku GPX punkt z podanym stemplem czasowym. Jeżeli istnieje zmieniana jest wysokość, jeżeli nie to punkt jest usuwany.
Super ciekawy wpis
OdpowiedzUsuń