PHPでGoogleを利用して緯度・経度や住所を求める

(1/1)
今回は、「PHP で Google を利用して住所から緯度・経度を求める」と「PHP で緯度・経度から住所を求める」の 2 つをマッシュアップし、Google マップに表示されている地点の緯度・経度や住所を求めるプログラムをつくってみることにする。

2012 年(平成 24 年)1 月、Google Geocoding API V3を利用するプログラムに変更した。

サンプル・プログラムの実行例

PHPでGoogleを利用して緯度・経度や住所を求める

サンプル・プログラム

サンプル・プログラムの流れ

PHPでGoogleを利用して緯度・経度や住所を求める

解説:初期設定

表示する Google マップの縦横サイズはユーザー定数 GOOGLE_MAPS_WIDTH, GOOGLE_MAPS_HEIGHT に設定しておくこと。

0019: //GoogleMapsの表示サイズ
0020: define('GOOGLE_MAPS_WIDTH',  600);
0021: define('GOOGLE_MAPS_HEIGHT', 400);

解説:クラス

0017: // GeoCodeクラス =============================================================
0018: class pahooGeoCode {
0019:     var $items;      //検索結果格納用
0020:     var $error;      //エラーフラグ
0021:     var $hits;           //検索ヒット件数
0022:     var $webapi;     //直前に呼び出したWebAPI URL
0023: 
0024:     //Google API KEY
0025:     //https://developers.google.com/maps/web/
0026:     var $GOOGLE_API_KEY = '**************************';
0027: 
0028:     //Yahoo! JAPAN Webサービス アプリケーションID
0029:     //https://developers.google.com/maps/documentation/javascript/get-api-key
0030:     var $YAHOO_APPLICATION_ID = '*****************************';
0031: 
0032:     //ジオどすII APIキー
0033:     //http://geodosu.com/user/register
0034:     var $APIKEY_GEODOS = '*****************';

各種WebAPI を使うメソッドは、PHP のクラスを使って定義する。
クラスについては「PHP でクラスを使ってテキストの読みやすさを調べる」で解説している。

2016 年(平成 28 年)6 月頃から、Google Maps API を呼び出すにもキーが必要になった。「Google Maps APIs for Web」にアクセスし、「キーを取得」ボタンをクリックすると無料で取得できる。変数 $GOOGLE_API_KEY に設定しておく。

解説:Googleマップの表示

0129: <script type="text/javascript">
0130: <!--
0131: google.maps.event.addDomListener(window, 'load', function() {
0132:     var mapdiv = document.getElementById('gmap');
0133:     var myOptions = {
0134:         zoom: {$zm},
0135:         center: new google.maps.LatLng({$lat}, {$lng}),
0136:         mapTypeId: google.maps.MapTypeId.{$type_g},
0137:         mapTypeControl: true,
0138:         scaleControl: true,
0139:     };
0140:     var map = new google.maps.Map(mapdiv, myOptions);
0141: 
0142:     //地図情報を取得
0143:     function getPointData() {
0144:         var point = map.getCenter();
0145:         document.getElementById("lng").value = point.lng();
0146:         document.getElementById("lat").value = point.lat();
0147:         document.getElementById("zm").value  = map.getZoom();
0148: 
0149:         var type_g = map.getMapTypeId();
0150:         var types = {"roadmap":"地図", "satellite":"航空写真", "hybrid":"ハイブリッド", "terrain":"地形図" };
0151:         for (key in types) {
0152:             if (key == type_g) {
0153:                 document.getElementById("type").value = types[key];
0154:                 break;
0155:             }
0156:         }
0157:         wgs84_tokyo();
0158:     }
0159:     google.maps.event.addListener(map, 'dragend', getPointData);
0160:     google.maps.event.addListener(map, 'zoom_changed', getPointData);
0161: //  google.maps.event.addListener(map, 'maptypeid_changed', getPointData);
0162: });
0163: -->
0164: </script>

住所から緯度・経度を求める PHP スクリプトは「PHP で Google を利用して住所から緯度・経度を求める」で紹介したものと同じである。
これを受けて Google マップを表示する JavaScript の部分である。GoogleMaps API V3 を使用している。

地図の移動終了(moveend)、拡大率の変更完了(zoomend)、地図タイプの変更(maptypechanged)といったイベントが発生する都度、地図情報(ズーム値、地図タイプ)と地図中央の緯度・経度を取得し表示させるために、JavaScript のユーザー関数 getPointData を用意している。

解説:緯度・経度情報の取得と表示

0047: <script language="JavaScript">
0048: <!--
0049: //世界測地系を日本測地系に変換する
0050: function wgs84_tokyo() {
0051:     var lat = document.getElementById("lat").value * 1.0;
0052:     var lng = document.getElementById("lng").value * 1.0;
0053:     var lat_t = lat + lat * 0.00010696  - lng * 0.000017467 - 0.0046020;
0054:     var lng_t = lng + lat * 0.000046047 + lng * 0.000083049 - 0.010041;
0055:     document.getElementById("lng_t").value = lng_t;
0056:     document.getElementById("lat_t").value = lat_t;
0057: }
0058: 
0059: -->
0060: </script>

イベント GEvent 発生時に ユーザー関数 getPointData が呼び出される。
この関数は、地図情報(ズーム値、地図タイプ)と地図中央の緯度・経度を取得、表示すると共に、ユーザー関数 wgs84_tokyo を呼び出し、取得した世界測地系の緯度・経度を日本測地系に変換する。

世界測地系とに本則地形の違いについては「PHP で携帯電話の位置情報を調べる」を参照のこと。

解説:住所の取得

0240:     $n = $pgc->getPointsV3_all($query$items);
0241:     if ($n <= 0) {
0242:         $errmsg = 'この住所では検索できません';
0243:     } else {
0244:         $lat = $items[1]['latitude'];
0245:         $lng = $items[1]['longitude'];
0246:     }

「住所検索」ボタンをクリックすると、先に求めた緯度・経度(世界測地系)を使って住所を求める。

緯度・経度から住所を求める PHP スクリプトは「PHP で緯度・経度から住所を求める」で紹介したものと同じである。

解説:リージョン

Googleマップで日本海が東海と表示される件について
2017 年(平成 29 年)8 月時点で、Google Maps API を素直に呼び出すと、上図のように「日本海(東海)」と表示される。
これを回避するためには、API 呼び出しでパラメータ "region=JP" を追加してやる必要がある。気持ちが悪い方は、下記のように API 呼び出しを修正してほしい。

0046: <script type="text/javascript" src="https://maps.google.com/maps/api/js?key={$pgc->GOOGLE_API_KEY}&amp;region=JP"></script>

参考サイト

(この項おわり)
header