PHPで携帯電話の位置情報を調べる

(2/2)
サンプル・プログラム

プログラムをダウンロードする

サンプル・プログラムの流れ
このプログラムは NTT DoCoMo の GPS レシーバ搭載携帯電話専用である。前述の情報を使えば、簡単に他社キャリアに対応できる。
SVG-W3C ※上図を見るにはSVGビューワが必要です。
Corel SVG Viewer
携帯電話の識別
プライバシー保護の観点から、あらかじめ設定された携帯電話の情報だけ拾うことにした。
そのために、携帯電話のシリアル番号判定を行うユーザー関数 isCellPhone を用意した。判定ロジックは、「PHP でユーザー・アクセス情報を表示する」を参照のこと。
また、あらかじめ登録しておく携帯電話のシリアル番号(HTTP USER AGENT で示される文字列)は、グローバル変数 $CellSerials に配列の形で用意しておく。

0013: /**
0014:  * 登録携帯電話のシリアル番号リスト
0015:  * @global bool $CellSerials
0016: */
0017: $CellSerials = array(
0018:     'DoCoMo/2.0 xxx(xxxxx)'
0019: );
0020: 
0021: /**
0022:  * 登録している携帯電話以外かどうかを調べる
0023:  * @param string $serials シリアル番号テーブル
0024:  * @return bool TRUE/FALSE
0025: */
0026: function isCellPhone($serials) {
0027:     //登録シリアルがなければ無条件でTRUE
0028:     if (count($serials) == 0)       return TRUE;
0029: 
0030:     //登録シリアルと合致するかどうかチェック
0031:     foreach ($serials as $val) {
0032:         if ($_SERVER['HTTP_USER_AGENT'] == $val)   return TRUE;
0033:     }
0034:     return FALSE;
0035: }

測地系の違い
携帯電話が返す緯度・経度には 2種類の座標系がある。いわゆる「日本測地系」と「世界測地系」である。同じ地点でも、測地系が違うと、緯度・経度にして 12秒ほど異なる。これは大きな違いだ。
そこで今回は、表示する緯度・経度を世界測地系(WGS-84)に統一することにした。
space
明治初期、当時の東京天文台(東京都港区麻布台 2-18-1)で行った観測によって日本経緯度原点が定められた。ここを基準にした三角測量によって全国の緯度・経度が測定された。これが日本測地系である。
一方、GPS衛星で測量している世界測地系の一種を WGS-84 と呼ぶ。
日本測地系では、1841 年に定められたベッセル楕円体の地球の長半径(6,377,397.155m)を用いてきた。一方の世界措置系では、1980 年に定められたGRS80 地球楕円体の長半径(6,378,137m)を利用している。同じ地点でも、測地系が違うと、緯度・経度にして 12秒の差が生じするのである。
space
携帯電話が日本測地系を返す場合には、ユーザー関数 tokyo_wgs84 によって世界測地系に変換する。
今回は使わないが、世界測地系を日本測地系に変換するユーザー関数 wgs84_tokyo も用意した。
いずれも近似式なので、日本以外で使うと誤差が発生することがある。

0046: /**
0047:  * 日本測地系を世界測地系に変換する
0048:  * @param double $long 経度(日本測地系)
0049:  * @param double $lat  緯度(日本測地系)
0050:  * @return double array(経度,緯度)(世界測地系)
0051: */
0052: function tokyo_wgs84($long$lat) {
0053:     $glong = $long - $lat * 0.000046038 - $long * 0.000083043 + 0.010040;
0054:     $glat  = $lat  - $lat * 0.00010695  + $long * 0.000017464 + 0.0046017;
0055:     return array($glong$glat);
0056: }
0057: 
0058: /**
0059:  * 世界測地系を日本測地系に変換する
0060:  * @param double $long 経度(世界測地系)
0061:  * @param double $lat  緯度(世界測地系)
0062:  * @return double array(経度,緯度)(日本測地系)
0063: */
0064: function wgs84_tokyo($long$lat) {
0065:     $glong = $long + $lat * 0.000046047 + $long * 0.000083049 - 0.010041;
0066:     $glat  = $lat  + $lat * 0.00010696  - $long * 0.000017467 - 0.0046020;
0067:     return array($glong$glat);
0068: }

参考サイト
(この項おわり)
header