#!/usr/bin/perl
#
# NMEAログをGPSy拡張フォーマットに
# Nowral
# 99/9/17
#
use Time::Local;
@files = @ARGV;
foreach $oldargv (@files) {
$newargv = $oldargv . " Track";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('GPSy', 'TEXT', $newargv);
print OUT "GPSy3 Track (version 3.21)\tNUMBER\tNAME\tCOMMENT\tDATE\tLAT/NORTHING\tLON/EASTING\tZONE\tALT\tCOORD\tDATUM\tICON\tPROX\n";
$lc = 0;
open(IN, "<$oldargv");
while (<IN>) { /\$GP(GGA|RMC),/ && ++$lc; }
print OUT "#\tRecords:\t$lc\n";
($t1, $l1) = undef;
($mday, $mon, $year) = undef;
$lc = 0;
open(IN, "<$oldargv");
while (<IN>) {
chomp;
@ed = split(/,/);
if($ed[1] ne $t1) { $alt = undef; }
if($ed[0] eq "\$GPRMC") { # RMC - GPS及びTransitでの最小推奨定義データ
if($ed[2] ne "A") { next; } # データ有効 = A, データ無効 = V
$lat = &n2gdms($ed[3]);
$lon = &n2gdms($ed[5]);
$ed[9] =~ /(\d\d)(\d\d)(\d\d)/;
($mday, $mon, $year) = ($1, $2, $3+($3>80 ? 1900 : 2000)); # Y2K ?
}
elsif(! defined $mday) { next; }
elsif($ed[0] eq "\$GPGGA") { # GGA - GPS測位データ
if($ed[6] == 0) { next; } # 位置品質 : 0 = 無効
$lat = &n2gdms($ed[2]);
$lon = &n2gdms($ed[4]);
$alt = sprintf("%.01f", $ed[9]+$ed[11]); # 標高+ジオイド高=楕円体高
}
else{ next; }
if($t1 ne $ed[1]) {
++$lc;
print OUT $l1;
}
($hours, $min, $sec) = ($t1 =~ /(\d\d)(\d\d)(\d\d)/);
$t1 = $ed[1];
$l1 = sprintf( "T\t1\tTRACK\t\t%s\t%s\t%s\t-\t%s\tDMS\t<NO TRANSLATION>\t0\t0.00\n",
&formd(timelocal($sec, $min, $hours, $mday, $mon-1, $year) + 32400), # 日本時間
$lat, $lon, $alt );
}
print OUT $l1;
close(IN);
close(OUT);
print "#\tRecords:\t$lc\n";
}
&MacPerl'Quit(2);
die "The Unhappy End";
sub n2gdms {
my($sf) = @_;
my($d, $m, $s) = ($sf =~ /(\d+)(\d\d)(\.\d+)/);
$sf = int($s*600 + 0.5);
$s = int($sf/10);
$sf %= 10;
sprintf("%d。%02d\'%02d\.%d\"", $d, $m, $s, $sf);
}
sub formd { # 日付、時刻の表示形式
my($t) = @_;
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
sprintf("%02d/%02d/%04d %02d:%02d:%02d",$mon+1,$mday,$year+1900,$hour,$min,$sec);
}