#!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);
}