#!/usr/bin/perl -w
#
# GPSy拡張形式のトラックログ・ルートを経路データに
# Nowral
# 01/4/24
#
# 初期化
use Time::Local;
$tint = 3600; # 時刻表示、何秒おきか
$cd = 0x10000; # depth / color

undef @date; # 時刻
undef @lat; # 緯度
undef @lon; # 経度
undef @alt; # 標高
undef @strt; # トラック開始
undef @trn; # トラック名
$n = 0;
$nw = 0;

# 入力ファイルのループ
foreach $oldargv (sort @ARGV) {
  $oldargv =~ /^(.*):(.*)$/;
  $fn = $2;
  print "$fn\n";

# ファイル読み込み
  $trn = -1;
  open(IN, $oldargv) || die;
  while (<IN>) {
    @ed = split("\t");
# トラック
    if($ed[0] eq "T") {
      if ($ed[1] != $trn) {
        $trn = $ed[1];
        push(@trn, "$fn\#$trn");
        push(@strt, $n);
      }
      $b = &gdms2deg($ed[5]);
      $l = &gdms2deg($ed[6]);
      if($ed[4] =~ /(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/) {
        push(@date, timelocal($6,$5,$4,$2,$1-1,$3-1900));
      }
      else { push(@date, 0); }
      push(@lat, $b); # 緯度
      push(@lon, $l); # 経度
      push(@alt, $ed[8]+0); # 高さ <>楕円体高?
      ++$n;
    }
# ウェイポイント
    elsif($ed[0] eq "W" || $ed[0] eq "Wx" || $ed[0] eq "wx") {
      ++$nw;
    }
  }
# 1ファイル終了
  close(IN);
  print " ... done\n";
}
push(@strt, $n) if $n;
print "\n";
print "# トラックデータ数: $n\n";
print "# ウェイポイントデータ数: $nw\n";
print "\n";

# 出力ファイル準備
$0 =~ /(.+:)/;
$newargv = $1 . "UserLine.txt";
open(OUT, ">$newargv") || die;
MacPerl::SetFileInfo('NMVU', 'TEXT', $newargv); # データユティリティ
#MacPerl::SetFileInfo('NMV2', 'TEXT', $newargv); # データユティリティ 2.0

# ヘッダ出力
print OUT <<FILE_HEADER;
;数値地図ビューア ユーザ経路データ
atr8= "GPS Track Data"
atr9= "GPS Route Data"
FILE_HEADER

# グループループ
foreach $ig (0 .. $#strt-1) {
  $strt = $strt[$ig];
  $end  = $strt[$ig+1] - 1;
  $n = $end - $strt + 1; # 2未満の時の対応???

  ($t0, $t3) = ($date[$strt], $date[$end]);
  $st = $t3 - $t0;
  printf "# 開始時刻  : %s\n", &formd($t0);
  printf "# 終了時刻  : %s\n", &formd($t3);
  printf "# データ数  : %d\n", $n+1;
  printf "# 総時間    : %d:%02d:%02d\n", int($st/3600), ($st/60)%60, $st%60;
  print "\n";
#  next unless $n>1;

# グループヘッダ
  if($t0) {
    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t0);
    $trn[$ig] =~ s/^(.*)\#/sprintf("%d\/%d\#", $mon+1, $mday)/e;
    $dmc = &penprop($mday);
  }
  else {
    $dmc = &penprop($ig);
  }
  $trn[$ig] = "" if($n<3); # 線名省略
  print OUT <<LINE_HEADER;
;
Line= ( "$trn[$ig]" offset= ( 0 0 ) atr= 0 color= ( $dmc ) )
Name_Atr= (  font= "Osaka" size= 12 face= ( bold ) color= ( $dmc ) )
Comment_Atr= (  font= "Osaka" size= 10 face= ( normal ) color= ( $dmc ) )
Start_line
LINE_HEADER

# 描画パス
  $td2 = 0;
  foreach $i ($strt .. $end) { # 汎用
    $cmnt = "";
    if( $n>5 && ($date[$i]>=$td2 || $i==$end) ) { # 時刻表示のタイミング?
      $cmnt = " \"" . &formd($date[$i]) . "\" offset= ( 0 0 )";
      $td2 = int($date[$i]/$tint + 1) * $tint;
    }

#例:43.31.22.5  144.23.26.3 "始点" offset= ( 0 0 )
    print OUT &deg2vdms($lat[$i]), "  ", &deg2vdms($lon[$i]), "$cmnt\n";
  }

# ラインフッタ
  print OUT <<LINE_FOOTER;
End_line
LINE_FOOTER
}
close(OUT);

# ユーザデータユティリティ起動 > うまくいったらテキストファイル削除
MacPerl::DoAppleScript(<<END_OF_SCRIPT); # && unlink $newargv;
tell application "Finder" to open alias "$newargv"
END_OF_SCRIPT

MacPerl::Quit(2);
die "The Unhappy End";



sub formd { # 日付、時刻の表示形式
  my($t) = @_;
  my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
  return sprintf("%d:%02d", $hour,$min);
#  return sprintf("%04d/%d/%d %d:%02d:%02d", $year+1900,$mon+1,$mday,$hour,$min,$sec);
}

sub penprop { # 番号 -> 色
  my($id) = @_;
  my($cb, $cr, @cs);
  $id *= 65;
  $cb = int(($id+60) / 120);
  $cr = ($id/120-$cb) * $cd;
  $cs[$cb%3] = $cd - 1;
  ($cs[($cb+1)%3], $cs[($cb+2)%3]) = $cr>0 ? ($cr, 0) : (0, -$cr);
  return sprintf("%d %d %d", @cs);
}

sub deg2vdms { # 経緯度、度 -> dd.mm.ss.s形式
  my($d) = @_;
  my($m, $s, $sf);
  $sf = int($d*36000 + 0.5);
  $s = int($sf/10) % 60;
  $m = int($sf/600) % 60;
  $d = int($sf/36000);
  $sf %= 10;
  return sprintf("%d.%02d.%02d.%d", $d, $m, $s, $sf);
}

sub gdms2deg { # 経緯度、GPSy形式 -> 度
  my($d) = @_;
  $d =~ /(-?)(\d*\.?\d*)。?(\d*\.?\d*)'?(\d*\.?\d*)"?/ || die;
  return ($1 ? -1 : 1) * ($2 + $3/60 + $4/3600);
}