| 1 | #!/usr/bin/perl |
|---|
| 2 | |
|---|
| 3 | print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; |
|---|
| 4 | print "<gpx version=\"1.1\" xmlns=\"http://www.topografix.com/GPX/1/1\">\n"; |
|---|
| 5 | if ($_ = <>) { |
|---|
| 6 | s/[\x00\x0d\x0a]//g; |
|---|
| 7 | @name = split /,/; |
|---|
| 8 | print "<trk>\n"; |
|---|
| 9 | print "<trkseg>\n"; |
|---|
| 10 | while (<>) { |
|---|
| 11 | s/[\x0d\x0a]//g; |
|---|
| 12 | @data = split /,/; |
|---|
| 13 | %data = (); |
|---|
| 14 | for ($i = 0; $i < @name; $i++) { |
|---|
| 15 | $data[$i] =~ s/^\x00+//; |
|---|
| 16 | $data[$i] =~ s/\x00+$//; |
|---|
| 17 | $data{$name[$i]} = $data[$i]; |
|---|
| 18 | } |
|---|
| 19 | $hdop = $data{'HDOP'}; |
|---|
| 20 | $vdop = $data{'VDOP'}; |
|---|
| 21 | $pdop = $data{'PDOP'}; |
|---|
| 22 | if ($hdop =~ /\x00/ || $vdop =~ /\x00/ || $pdop =~ /\x00/) { |
|---|
| 23 | next; |
|---|
| 24 | } |
|---|
| 25 | unless ($hdop =~ /[0-9]+(?:\.[0-9]+)?/ && $hdop > 0) { |
|---|
| 26 | next; |
|---|
| 27 | } |
|---|
| 28 | unless ($vdop =~ /[0-9]+(?:\.[0-9]+)?/ && $vdop > 0) { |
|---|
| 29 | next; |
|---|
| 30 | } |
|---|
| 31 | unless ($pdop =~ /[0-9]+(?:\.[0-9]+)?/ && $pdop > 0) { |
|---|
| 32 | next; |
|---|
| 33 | } |
|---|
| 34 | if ($hdop >= 20 || $vdop >= 20 || $pdop >= 20) { |
|---|
| 35 | next; |
|---|
| 36 | } |
|---|
| 37 | $lat = $data{'LATITUDE N/S'}; |
|---|
| 38 | $lat =~ s/^([0-9]+(?:\.[0-9]+)?)N$/$1/; |
|---|
| 39 | $lat =~ s/^([0-9]+(?:\.[0-9]+)?)S$/-$1/; |
|---|
| 40 | $lon = $data{'LONGITUDE E/W'}; |
|---|
| 41 | $lon =~ s/^([0-9]+(?:\.[0-9]+)?)E$/$1/; |
|---|
| 42 | $lon =~ s/^([0-9]+(?:\.[0-9]+)?)W$/-$1/; |
|---|
| 43 | print "<trkpt lat=\"$lat\" lon=\"$lon\">"; |
|---|
| 44 | $time = $data{'DATE'} . $data{'TIME'}; |
|---|
| 45 | if ($time =~ /([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])/) { |
|---|
| 46 | $time = "20$1-$2-$3T$4:$5:$6Z"; |
|---|
| 47 | print "<time>$time</time>"; |
|---|
| 48 | } |
|---|
| 49 | $ele = $data{'HEIGHT'}; |
|---|
| 50 | if ($ele =~ /-?[0-9]+(?:\.[0-9]+)?/) { |
|---|
| 51 | print "<ele>$ele</ele>"; |
|---|
| 52 | } |
|---|
| 53 | $course = $data{'HEADING'}; |
|---|
| 54 | if ($course =~ /[0-9]+(?:\.[0-9]+)?/) { |
|---|
| 55 | print "<course>$course</course>"; |
|---|
| 56 | } |
|---|
| 57 | $speed = $data{'SPEED'}; |
|---|
| 58 | if ($speed =~ /[0-9]+(?:\.[0-9]+)?/) { |
|---|
| 59 | $speed = sprintf "%.3f", $speed / 3.6; |
|---|
| 60 | print "<speed>$speed</speed>"; |
|---|
| 61 | } |
|---|
| 62 | $fix1 = $data{'FIX MODE'}; |
|---|
| 63 | $fix2 = $data{'VALID'}; |
|---|
| 64 | if ($fix2 == "DGPS") { |
|---|
| 65 | print "<fix>dgps</fix>"; |
|---|
| 66 | } elsif ($fix1 == "2D") { |
|---|
| 67 | print "<fix>2d</fix>"; |
|---|
| 68 | } elsif ($fix1 == "3D") { |
|---|
| 69 | print "<fix>3d</fix>"; |
|---|
| 70 | } |
|---|
| 71 | print "<hdop>$hdop</hdop>"; |
|---|
| 72 | print "<vdop>$vdop</vdop>"; |
|---|
| 73 | print "<pdop>$pdop</pdop>"; |
|---|
| 74 | print "</trkpt>\n"; |
|---|
| 75 | } |
|---|
| 76 | print "</trkseg>\n"; |
|---|
| 77 | print "</trk>\n"; |
|---|
| 78 | } |
|---|
| 79 | print "</gpx>\n"; |
|---|