#!/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 "緯度:", &deg2dms($lat0), "\n";
  print "経度:", &deg2dms($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);
}