Check

DMM -> DMS, TKY -> WGS

| | コメント(0) | トラックバック(0)
度分表記(DMM)を度分秒(DMS)に変換するコードと、日本測地系を世界測地系に変換するコードを書いてみた。

かなり適当だけど、PHPのものは無かったので一応あげてみる。

書いてる本人もよくわかってないので要注意(Perl版の移植)
<?php

$lon = '139.450734';
$lat = '35.435357';

# 変換
$result = molodensky($lat, $lon);

echo('result    lon = '.$result[1].', lat = '.$result[0]."\n");
echo('test_data lon = 139.74882856246452, lat = 35.73476784065745'."\n");


function molodensky ($b, $l) {
$b = DMM2DMS($b);
$l = DMM2DMS($l);
$h = 0;
# データム諸元
# 変換元
# (Tokyo)
$a = 6377397.155;
$f = 1 / 299.152813;

# 変換先
# (WGS 84)
$a_ = 6378137;        # 赤道半径
$f_ = 1 / 298.257223; # 扁平率

# 並行移動量 [m]
# e.g. $x_ = $x + $dx etc.
$dx = -148;
$dy = +507;
$dz = +681;

$pi = pi();
$rd = $pi / 180;
$a = 6377397.155;
$f = 1 / 299.152813;

  $b *= $rd;
  $l *= $rd;

  $e2 = 2*$f - $f*$f; # 離心率 e^2
  $bda = 1- $f;       # 極半径 / 赤道半径 b/a
  $da = $a_-$a;
  $df = $f_-$f;
  $sb = sin($b);
  $cb = cos($b);
  $sl = sin($l);
  $cl = cos($l);

  $rn = 1 / sqrt(1 - $e2*$sb*$sb);
  $rm = $a * (1 - $e2) * $rn * $rn * $rn;
  $rn *= $a;

#ずれの計算
  $db = -$dx*$sb*$cl - $dy*$sb*$sl + $dz*$cb
   + $da*$rn*$e2*$sb*$cb/$a + $df*($rm/$bda+$rn*$bda)*$sb*$cb;
  $db /= $rm + $h;
  $dl = -$dx*$sl + $dy*$cl;
  $dl /= ($rn+$h) * $cb;
  $dh = $dx*$cb*$cl + $dy*$cb*$sl + $dz*$sb
   - $da*$a/$rn + $df*$bda*$rn*$sb*$sb;

  return array(($b+$db)/$rd, ($l+$dl)/$rd, $h+$dh);
}
function DMM2DMS ($target) {
    list($d, $fb) = split('[^0-9]', $target);

    $match = array();
    ereg('^([0-9]{2})([0-9]{2})(.+)$', $fb, $match);
    $f = $match[1];
    $b = $match[2].'.'.$match[3];
    return $d + ($f / 60) + ($b / 60 / 60);
}

トラックバック(0)

このブログ記事を参照しているブログ一覧: DMM -> DMS, TKY -> WGS

このブログ記事に対するトラックバックURL: http://0-9.sakura.ne.jp/mt/mt-tb.cgi/482

コメントする