#!/usr/bin/perl use Data::Dumper; use Getopt::Std; my %opts; getopts('hf:a:o:', \%opts); $inBiking = 0; $inLap = 0; $inTrack = 0; $inTrackpoint = 0; sub usage() { printf "Usage\n"; printf "\t-f hst file: historic file from Garmin Training Center\n"; printf "\t-h : this help\n"; printf "\t-a +lat : latitude offset\n"; printf "\t-o +lon : longitude offset\n"; } if (!defined $opts{f}) { usage(); exit; } if (defined $opts{h}) { usage(); exit; } $lat_offset = 0.0; $lon_offset = 0.0; if (defined $opts{o}) { $lon_offset = $opts{o}; } if (defined $opts{a}) { $lat_offset = $opts{a}; } # how many points in the path $points = 0; $outFileName = ""; open INFILE, $opts{f}; while () { chomp(); if ($inBiking) { if ($inLap) { if (/<\/Lap>/) { $inLap = 0; $lapName = "unknown"; print(FD "\n\n\n\n\n"); close FD; if ($points == 0) { unlink $outFileName or die "rm"; } next; } if ($inTrack) { if ($inTrackpoint) { if (/<\/Trackpoint>/) { $inTrackpoint = 0; if ($lat > 0.0 && $lon > 0.0) { printf(FD "%f,%f,%f\n", $lon + $lon_offset, $lat + $lat_offset, $alt); $points++; } next; } if (/(.*)<\/LatitudeDegrees>/) { $lat = $1; next; } if (/(.*)<\/LongitudeDegrees>/) { $lon = $1; next; } if (/(.*)<\/AltitudeMeters>/) { $alt = $1; next; } } else { if (/<\/Track/) { $inTrack = 0; next; } if (//) { $inTrackpoint = 1; $lat = 0; $lon = 0; $alt = 0; next; } } } else { if (/ $outFileName" or die "create $outFileName"; $points = 0; print FD < Paths exported from Garmin 305 from Garmin hst file EOF ; printf FD "%s\n", $lapName; if ($lat_offset != 0.0 || $lon_offset != 0.0) { printf FD "Offset lat=%f, lon=%f", $lat_offset, $lon_offset; } print FD <#yellowLineGreenPoly 1 1 clampToGround EOF ; next; } } } else { if (/