#!perl -w
#
# 高度データを補足 (50mメッシュ版)
# Nowral
# 99/10/19
#
# 入力ファイルのループ
@files = sort grep{-f} @ARGV;
foreach $oldargv (@files) {
printf "%s\n", (split(':', $oldargv))[-1];
# ファイル読み込み >経緯度から標高ファイル決定
undef @ofs;
undef %mems;
$i = 0;
open(IN, $oldargv);
while(<IN>){
next unless /^T\t/;
@ed = split("\t");
if($ed[9] ne "DMS") { die "Not DMS !"; }
# if($ed[10]!~/Tokyo/i) { die "$ed[10] Datum Not Tokyo"; }
$ed[5] =~ /(\d+)。(\d+)'(\d+\.?\d*)"/; # 緯度
$b = $1 + $2/60 + $3/3600;
$ed[6] =~ /(\d+)。(\d+)'(\d+\.?\d*)"/; # 経度
$l = $1 + $2/60 + $3/3600;
($mem1, $ofs1, $b0, $l0) = &ll2memn($b, $l);
push(@ofs, $ofs1);
push(@h, "-"); # とりあえずダミーデータ
$mems{$mem1} .= " $i";
++$i;
}
# 標高読み込み <まとめて
$n = 0;
foreach $mem (keys %mems) {
open(IN, $mem) || next;
foreach $i (split(" ", $mems{$mem})) {
seek(IN, $ofs[$i], 0) || next;
read(IN, $h1, 5);
$h[$i] = $h1 / 10;
++$n;
}
}
next if $n==0; # 一個も標高データが取得できなければ意味なし
# 出力ファイル準備
$newargv = $oldargv . '.wh';
open(OUT, ">$newargv");
&MacPerl'SetFileInfo('GPSy', 'TEXT', $newargv);
# 標高補足
$i = 0;
open(IN, $oldargv);
while(<IN>){
if(/^T\t/) {
@ed = split("\t");
$ed[8] = sprintf("%.1f", $h[$i]);
$_ = join("\t", @ed);
++$i;
}
else{ s/^(#\tRecords:\t)\d+/"$1" . ($#h+1)/ie; } # データ数は正確に
print OUT; # 書き出し
}
close(IN);
close(OUT);
# 1ファイル終了
print " ... done\n";
}
MacPerl::Quit(2);
die "The Unhappy End";
sub ll2memn { # 経緯度からmemファイル名、読み出し位置、中心経緯度を返す
my($b, $l) = @_;
my($b1, $l1, $b2, $l2, $mc1, $fn, $ofs);
# メッシュコード計算 < おかしな数値チェック?
$b *= 1.5;
$l -= 100;
($b1, $l1) = (int($b), int($l)); # 一次メッシュ
$b = ($b - $b1) * 8;
$l = ($l - $l1) * 8;
($b2, $l2) = (int($b), int($l)); # 二次メッシュ
$b = int(($b - $b2) * 200);
$l = int(($l - $l2) * 200);
# ファイル名
# 例:50M1:DATA:5939:593967.MEM
$mc1 = sprintf("%02d%02d", $b1, $l1); # 一次メッシュコード
$fn = "50M1:DATA:$mc1:$mc1$b2$l2.MEM"; # 日本Iのみ
# 読み出し位置
# レコード長 = メッシュコード + レコード番号 + 標高値*200 + 復帰・改行
# 1011 = 6 + 3 + 5 *200 + 2
# 元の式:$ofs = 1011 + (200-($b+1))*1011 + 9 + $l*5;
$ofs = 202209 - $b*1011 + $l*5;
# メッシュ中心の経緯度
$b = ( $b1 + ( $b2 + ($b+0.5)/200 )/8 )/1.5;
$l = $l1 + ( $l2 + ($l+0.5)/200 )/8 + 100;
# print join(" : ",($fn, $ofs, $b, $l)),"\n";
($fn, $ofs, $b, $l);
}