#!/usr/bin/perl
#
# この座標の標高は?
# Nowral
# 99/10/16
#
# 経緯度
$lat = 0 + eval( MacPerl::Ask("緯度 [度]:", "40") );
$lon = 0 + eval( MacPerl::Ask("経度 [度]:", "140") );
if($lat && $lon) {
# 標高データ読み出し
($fn, $ofs, $lat0, $lon0) = &ll2memn($lat, $lon);
#$fn{$fn} .= " $i";
open(IN, $fn) || die "No MEM file : $fn";
seek(IN, $ofs, 0);
read(IN, $h, 5);
close(IN);
# 結果出力
print "緯度:", °2dms($lat0), "\n";
print "経度:", °2dms($lon0), "\n";
printf("標高: %.01f [m]\n", $h/10);
}
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);
}
sub deg2dms { # 度から度分秒への変換、精度指定あり
my($d) = @_;
my($dfe) = 3; # 小数点以下必要な桁数
my($df) = 10 ** $dfe;
my($m, $s, $sf);
$sf = int($d*3600*$df + 0.5);
$s = $sf / $df % 60;
$m = $sf / $df / 60 % 60;
$d = int($sf / $df / 3600);
$sf %= $df;
# ($d, $m, $s, $sf);
sprintf("%d。%02d\'%02d\.%0$dfe\d\"", $d, $m, $s, $sf);
}