度分表記(DMM)を度分秒(DMS)に変換するコードと、日本測地系を世界測地系に変換するコードを書いてみた。
かなり適当だけど、PHPのものは無かったので一応あげてみる。
書いてる本人もよくわかってないので要注意(Perl版の移植)
かなり適当だけど、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);
}
$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);
}
コメントする