-
entry001125
comments
Willcom の端末が取得した位置情報を Google Map に投げてみたところ、測地系が異なることが判明。 Willcom は日本測地系(Tokyo)で、Google Map は世界測地系(WGS 1984)のようです。 こいつを変換してやりたいのだけれど、実はこれは非常に厄介な問題。 本気で取り組もうとするとこんなことになります。
多少大雑把にやろうとしてもこんな具合。
この値を足して補正してやる必要があります。 手順自体は簡単だけれど、どの値を使うかを条件式で判断するのが非常に萎える。
これらは、三角点測量の誤差の補正も行おうとしているためにこんなに複雑になっています。 次善の策として、準拠楕円体、測地座標系を数学的に変換するだけでお茶を濁すことにしました。 測定誤差は無視。 この変換にはいくつか方法があるようですが、今回は Molodensky変換というアルゴリズムを用います。
計算に必要な準拠楕円体と測地座標系の情報はここから入手。
- Geodetic Datum Overview
- Reference Ellipsoids and Geodetic Datum Transformation Parameters (Local to WGS-84) From NIMA 8350.2 4 July 1977 and MADTRAN 1 October 1996
この表を awk で変換して PHP の参照配列に突っ込んで利用しました。 で完成したライブラリがこちら。
使い方はこんな感じです。
// 測地系のインスタンス (Datum)を取得 // ここでは日本測地系 $tokyo = Datum::getInstance("Tokyo"); // 日本測地系での緯度経度に基づいて地点のインスタンス (GeoPoint) を取得 $point = $tokyo->createGeoPoint(35.677720215,139.7733459); // 変換先の測地系のインスタンスを取得 $wgs = Datum::getInstance("WGS 1984"); // Molodensky 変換 $result = Molodensky::convert($point, $wgs); // 結果取得 $lat = $result->getLat(); $lon = $result->getLon();2009-07-09 : 坂井さんからのご指摘で "Lan" を "Lat" に修正。ありがとうございます。測地系を名前で引いていますが、これは上記の "Reference Ellipsoids and Geodetic Datum Transformation Parameters (Local to WGS-84) From NIMA 8350.2 4 July 1977 and MADTRAN 1 October 1996" にある Datum の名前です。 場合によっては同じ名前のものが複数ありますが、これは "Region in use" が異なっていて、測地座標系に違いがあります。 Region も指定して測地系を取得したい場合は、Datum::getInstance の第二引数に指定してください。
// 沖縄の場合 $tokyo = Datum::getInstance("Tokyo", "Okinawa");このライブラリによって当初の問題は解決して、きちんと Google Map が使えるようになりました。 ただ、ぼくが使っている端末の場合、端末の位置ではなく基地局の位置が返るので、なんというか、多少オーバースペックなような気もしますが。
MTEntryMore
GeodeticDatumTransformer.php を使わせていただいてます。大変ありがとうございます。ただ1点だけ。
// 結果取得
$lan = $result->getLan();
こちらの $lan、Lan は $lat、Lat の typo だと思います。
坂井さん
ご指摘ありがとうございます!
修正しました。助かりましたー。