強火で進め

このブログではプログラム関連の記事を中心に書いてます。

日本測地系から世界測地系に変換する

地図で位置を示す、緯度と経度ですがこれは日本で主に使われているものでは
世界測地系日本測地系の2つあり(詳しくはWikipediaを参照下さい)互いに同じ位置を示したい場合は変換をかける必要があります。

今回はYahoo!地図情報(日本測地系)とGoogle マップ(世界測地系)を使ってテストします。
そしてわかりやすい位置として「東京タワー」の緯度、経度を変換してみます。

まずはYahoo!地図情報で「東京タワー」を検索

Yahoo!地図情報で「東京タワー」を検索したときのURLはこちらになります。
http://map.yahoo.co.jp/pl?p=%C5%EC%B5%FE%A5%BF%A5%EF%A1%BC&lat=35.65538&lon=139.74876111&type=&lnm=%C5%EC%B5%FE%A5%BF%A5%EF%A1%BC&idx=20

こちらから緯度、経度情報を取得しようと思います。
ざっと見ただけでとてもわかりやすいパラメータです。どう考えても lat(latitude) → 緯度、 lon(longitude) → 経度ですよね。

緯度:35.65538
経度:139.74876111

変換の計算式

今回、変換の計算式はこちらのサイトの式を使用させて貰いました。

Gpso.info 開発ブログ: 経度・緯度の表し方と変換
http://blog.gpso.info/2006/08/post_2.html

PHPの変換プログラム

以上の情報を元にプログラムを組むとこんな感じになりました。

<html>
<body>
<?php
// 日本測地系→世界測地系
function geo_japan2world(&$lat, &$lng){
	$la = $lat;
	$ln = $lng;
	$lat = $la - $la * 0.00010695 + $ln * 0.000017464 + 0.0046017;
	$lng = $ln - $la * 0.000046038 - $ln * 0.000083043 + 0.010040;
}

// 世界測地系→日本測地系
function geo_world2japan(&$lat, &$lng){
	$la = $lat;
	$ln = $lng;
	$lat = $la + $la * 0.00010696 - $ln * 0.000017467 - 0.0046020;
	$lng = $ln + $la * 0.000046047 + $ln * 0.000083049 - 0.010041;
}

// 東京タワーの座標(Yahoo!地図情報で取得)
$lat=35.65538;
$lng=139.74876111;
echo "----------------------------<br>";
echo "【Yahoo!地図情報(日本測地系)】<br>";
echo "緯度:{$lat}<br>";
echo "経度:{$lng}<br>";
echo "----------------------------<br>";

// 日本→世界
geo_japan2world($lat, $lng);
echo "【Google マップ(世界測地系)】<br>";
echo "緯度:{$lat}<br>";
echo "経度:{$lng}<br>";
echo "----------------------------<br>";

// 世界→日本
geo_world2japan($lat, $lng);
echo "【Yahoo!地図情報(日本測地系)】<br>";
echo "緯度:{$lat}<br>";
echo "経度:{$lng}<br>";
echo "----------------------------<br>";
?>
</body>
</html>

出力はこちら。

--------------------
【Yahoo!地図情報(日本測地系)】
緯度:35.65538
経度:139.74876111
--------------------
【Google マップ(世界測地系)】
緯度:35.6586089295
経度:139.745554451
--------------------
【Yahoo!地図情報(日本測地系)】
緯度:35.6553800387
経度:139.748761152
--------------------

世界測地系に変えたものを再度、日本測地系に戻してもそんなに大きな誤差は発生しないようです。

検証

それでは計算結果の検証をします。

Google マップで「東京タワー」を検索したときのURLは以下となります。
http://maps.google.co.jp/maps?f=q&hl=ja&geocode=&q=%E6%9D%B1%E4%BA%AC%E3%82%BF%E3%83%AF%E3%83%BC&sll=35.661167,139.701333&sspn=0.009658,0.03974&ie=UTF8&ll=35.661725,139.745407&spn=0.009658,0.03974&z=15&iwloc=addr

それっぽいパラメータがいくつもあってよくわかりません。

調べてみると以下のGoogle マップのヘルプに情報がありました。

緯度経度の座標の周辺のビジネスを検索することはできますか。
http://maps.google.com/support/bin/answer.py?hl=jp&answer=18539

とりあえずこんな形式で指定すれば良いらしいです。
http://maps.google.co.jp/maps?q=35.655152,+139.704444&hl=ja

この形式に今回、変換をかけた緯度経度をあてはめるとこうなります。
緯度:35.6586089295
経度:139.745554451
http://maps.google.co.jp/maps?q=35.6586089295,+139.745554451&hl=ja

表示をみるとだいたいYahoo!のものと同じ位置を指しているようです。
あと、改めてGoogle マップで「東京タワー」を検索したときのURLを見てみると ll のパラメータが緯度、経度を表していそうです。

http://maps.google.co.jp/maps?f=q&hl=ja&geocode=&q=%E6%9D%B1%E4%BA%AC%E3%82%BF%E3%83%AF%E3%83%BC&sll=35.661167,139.701333&sspn=0.009658,0.03974&ie=UTF8&ll=35.661725,139.745407&spn=0.009658,0.03974&z=15&iwloc=addr

計算で変換した値 Google マップで検索
緯度 35.6586089295 35.661725
経度 139.745554451 139.745407

よっぽど精度を気にするようなとき以外は十分に実用に足りそうです。

(2009/02/15 追記)
こちらのページ、良くまとまっていて読みやすいと思います。

位置情報を取得する仕組み − @IT
http://www.atmarkit.co.jp/fnetwork/rensai/ichijouhou01/01.html