#!perl -w
#
# MPS -> GPSy拡張形式のウェイポイント、トラックログ
# Nowral
# 01/1/12
#
$0 =~ /(.+:)/;
$cwd = $1;
$trn = 0;
$wpn = 0;
$nwr = 0;
undef %wrs;
undef @trs;
# ファイルループ
foreach $oldargv (@ARGV) {
open(IN, $oldargv) || next;
$oldargv =~ /(.+:)(.+)/;
print "\n$2\n";
# 読み込みループ
$buff = "";
while (<IN>) {
s|//.*$||; # コメント無視
s/^\s+//; # 行頭空白削除
s/\s+$//; # 行末空白削除、2行に渡るコメント?
s/\s*=\s*/=/g; # 等号前後の空白削除
$buff .= "$_ ";
next unless /;$/; # コマンド終りか
# コマンド処理
$_ = $buff;
# 点
if(/^point/i) { # 時刻、アイコン???
($b, $l) = ( /pos="(.+?),(.+?)"/ );
/str="(.+?)"/;
$pn = uc($1);
if($pn =~ /([\-0-9A-Z][ \-0-9A-Z]{0,5})/) { # 英数字以外排除
$pn = $1;
}
else {
++$wpn;
$pn = sprintf("%03d", $wpn);
}
if(exists $wrs{$pn}) {
print "# 重複ウェイポイント名:「$pn」\n";
}
else {
$wrs{$pn} = join("\t",
("Wx", "0", $pn, "", "-",
&mdms2gdms($b), &mdms2gdms($l), "-", " 0.0",
"DMS", "Tokyo", "1/0", "0.00") );
++$nwr;
}
}
# 線
elsif(/^line/i) { # 名称???
$trn++;
s/^.*?pos="//;
s/".*$/,/;
while(s/(.+?),(.+?),//) { # 経緯度切り出しループ
($b, $l) = ($1, $2);
push( @trs, join("\t",
("T", $trn, " ", "", "-",
&mdms2gdms($b), &mdms2gdms($l), "-", " 0.0",
"DMS", "Tokyo", "0", "0.00")
) );
}
}
$buff = "";
}
close(IN);
# 1ファイル終了
print " ... done\n";
}
# ウェイポイント出力
printf "\n# ウェイポイント数 : %d\n", $nwr;
if($nwr) {
$newargv = $cwd . "GPS Waypoint Data";
open(OUT, ">$newargv") || die;
MacPerl::SetFileInfo('GPSy', 'TEXT', $newargv);
print OUT "GPSy3 Waypoint (version 3.38r3)\tNUMBER\tNAME\tCOMMENT",
"\tDATE\tLAT/NORTHING\tLON/EASTING\tZONE\tALT\tCOORD\tDATUM\tICON\tPROX\n";
printf OUT "#\tRecords:\t%d\n", $nwr;
while( ($pn, $wr1) = each %wrs ) { print OUT "$wr1\n"; }
close(OUT);
}
# トラック出力
printf "# トラック数 : %d\n", $#trs+1;
if(@trs) {
$newargv = $cwd . "GPS Track Data";
open(OUT, ">$newargv") || die;
MacPerl::SetFileInfo('GPSy', 'TEXT', $newargv);
print OUT "GPSy3 Track (version 3.38r3)\tNUMBER\tNAME\tCOMMENT",
"\tDATE\tLAT/NORTHING\tLON/EASTING\tZONE\tALT\tCOORD\tDATUM\tICON\tPROX\n";
printf OUT "#\tRecords:\t%d\n", $#trs+1;
print OUT join("\n", @trs), "\n";
close(OUT);
}
MacPerl::Quit(2);
die "The Unhappy End";
sub mdms2gdms { # MPS形式の経緯度文字列をGPSy形式に変換
my($d) = @_;
my($sgn, $m, $s, $sf);
my(@ed);
$d =~ tr/\s//d;
@ed = split("/", $d); # 単位全てに対応? D、DM、DMS
if($ed[0]<0) { # 負数対応
$sgn = "-";
$ed[0] *= -1;
}
else{ $sgn = ""; }
$sf = int($ed[0]*36000 + $ed[1]*600 + $ed[2]*10 + 0.5);
$s = int($sf/10) % 60;
$m = int($sf/600) % 60;
$d = int($sf/36000);
$sf %= 10;
sprintf("%s%d。%02d\'%02d\.%d\"", $sgn, $d, $m, $s, $sf);
}