PHPで経度緯度を日本測地系から世界測地系に相互変換する方法

スポンサーリンク

じゃらんのAPIで緯度経度を使って距離計算をしようとしたら、緯度経度には複数の種類があることを知りました。

明石の135度とかいわれているのは、世界測地系でだそうです。それとは別に日本測地系というものもあり、微妙に数値が異なります。さらにそれをミリ秒単位に変換したものまであるとか・・・。全然知らなかった。

じゃらんのAPIは日本測地系のミリ秒単位でデータを持っているので、世界測地系から変換する必要がありました。この変換プログラムで少し悩んだので、解決策をシェアします。

プログラムはPHPで書いていますが、どの言語でも計算式は同じなので、流用可能です。

世界測地系→日本測地系への変換

$jy = ceil(($lat * 1.000106961 - $lng * 0.000017467 - 0.004602017) * 3600000);
$jx = ceil(($lng * 1.000083049 + $lat * 0.000046047 - 0.010041046) * 3600000);

変数の意味は以下の通りです。

  • $lat:世界測地系の緯度
  • $lng:世界測地系の経度
  • $jy:日本測地系の緯度
  • $jx:日本測地系の経度

複雑な計算を行っていますが、こうらしいです。全体の式をさらに3,600,000で掛け算しているのはミリ秒単位に変換している式です。ミリ秒単位の計算が不要の場合は3,600,000での掛け算は不要です。ceilは小数点以下を切り上げしています。

 

日本測地系→世界測地系への変換

$jy = ミリ秒単位の日本測地系の緯度 / 3600000;
$jx = ミリ秒単位の日本測地系の経度 / 3600000;
$lat = $jy - $jy * 0.00010695 + $jx * 0.000017464 + 0.0046017;
$lng = $jx - $jy * 0.000046038 - $jx * 0.000083043 + 0.010040;

ミリ秒単位の日本測地系緯度経度から世界測地系に変換する時の計算式がこちら。数値がミリ秒単位でなければ、上の2行は不要です。