#!/usr/bin/perl
#
# 差分で修正
# Nowral
# 99/9/6
#
use Time::Local;
# 基準ファイル選択
($orgf, $relf) = $ARGV[0] =~ /^r/ ? ($ARGV[0], $ARGV[1]) : ($ARGV[1], $ARGV[0]);
$as = 1;
while($as == 1) {
($orgfn) = ($orgf =~ /([^:]*)$/);
($relfn) = ($relf =~ /([^:]*)$/);
$as = MacPerl::Answer("基準ファイル: $orgfn\n修正ファイル: $relfn",
"OK", "Exchange", "Cancel") || exit;
if($as==1) { ($orgf, $relf) = ($relf, $orgf); }
}
print "# 基準ファイル: $orgfn\n";
print "# 修正ファイル: $relfn\n";
# 原点計算
undef($zn, @t, @x, @y, @h, $n, $sx, $sy, $sh);
open(IN, $orgf);
while(<IN>){
if(/^T\t/) {
@ed = split("\t");
if($ed[9] ne "UTM") { die "Not UTM!\n"; }
$ed[7] =~ /^(\d+)/;
if(! defined $zn) { $zn = $1; }
if($1 != $zn) { die "Different Zone!"; }
++$n;
$ed[4] =~ /(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/;
push(@t, timelocal($6, $5, $4, $2, $1-1, $3-1900)); # 時刻
push(@x, $ed[5]); # 緯度
$sx += $ed[5];
push(@y, $ed[6]); # 経度
$sy += $ed[6];
push(@h, $ed[8]); # 高度
$sh += $ed[8];
}
}
($xav, $yav, $hav) = ($sx/$n, $sy/$n, $sh/$n);
printf "# 基準ファイル開始時刻: %s\n", &formd($t[0]);
printf "# 基準ファイル終了時刻: %s\n", &formd($t[$#t]);
printf "# 基準ファイルデータ数: %d\n", $n;
# 補正と出力
$newargv = $relf . ".ad";
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('GPSy', 'TEXT', $newargv);
# <どこからどこまでのデータを補正したか?
undef($i, $n);
open(IN, $relf);
# ループ
while(<IN>) {
if(/^T\t/) {
@ed = split("\t");
if($ed[9] ne "UTM") { die "Not UTM!\n"; }
$ed[7] =~ /^(\d+)/;
if($1 != $zn) { die "Different Zone!"; }
$ed[4] =~ /(\d+)\/(\d+)\/(\d+)\s+(\d+):(\d+):(\d+)/;
$t1 = timelocal($6, $5, $4, $2, $1-1, $3-1900);
if($t[$i] > $t1) { next; }
while($t[$i+1]<=$t1 && $i<$#t) { ++$i; }
if($i >= $#t) { last; }
++$n;
$u = ($t[$i+1]-$t1) / ($t[$i+1]-$t[$i]);
$ed[5] = sprintf("%7.0f", $ed[5] + $xav - $u*$x[$i] - (1-$u)*$x[$i+1]);
$ed[6] = sprintf("%7.0f", $ed[6] + $yav - $u*$y[$i] - (1-$u)*$y[$i+1]);
$ed[8] = sprintf( "%.1f", $ed[8] + $hav - $u*$h[$i] - (1-$u)*$h[$i+1]);
$_ = join("\t", @ed);
}
print OUT;
}
close(IN);
close(OUT);
print "\n";
printf "# 修正データ数: %d\n", $n;
#&MacPerl'Quit(2);
die "The Unhappy End";
sub formd { # 日付、時刻の表示形式
my($t) = @_;
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($t);
sprintf("%4d/%02d/%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
}