#!/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 °2vdms($lat[$i]), " ", °2vdms($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);
}