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

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

(2022年3月19日)Leafletでマップ移動時に緯度・経度を拾わない不具合を修正した。
(2021年10月10日)PHP8対応,リファラ・チェック改良など

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

PHPでマップを利用して緯度・経度や住所を求める
Googleマップ表示

サンプル・プログラム

圧縮ファイルの内容
getlatlng.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。

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

PHPでマップを利用して緯度・経度や住所を求める
プログラムの流れは、search が押下されたら「PHPで住所・ランドマークから緯度・経度を求める」で紹介したコードを、getaddress が押下されたら「PHPで緯度・経度から住所を求める」で紹介したコードを実行する。

準備:pahooGeoCode クラス

0037: class pahooGeoCode {
0038:     var $items;      //検索結果格納用
0039:     var $error;      //エラーフラグ
0040:     var $hits;       //検索ヒット件数
0041:     var $webapi; //直前に呼び出したWebAPI URL
0042: 
0043:     //Google Cloud Platform APIキー
0044:     //https://cloud.google.com/maps-platform/
0045:     //※Google Maps APIを利用しないのなら登録不要
0046:     var $GOOGLE_API_KEY_1 = '**************************';   //HTTPリファラ用
0047:     var $GOOGLE_API_KEY_2 = '**************************';   //IP制限用
0048: 
0049:     //Yahoo! JAPAN Webサービス アプリケーションID
0050:     //https://e.developer.yahoo.co.jp/register
0051:     //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
0052:     var $YAHOO_APPLICATION_ID = '*****************************';

地図描画や住所検索を行うために、クラスファイル "pahooGeoCode.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

地図や住所検索として Google を利用するのであれば、Google Cloud Platform APIキー が必要で、その入手方法は「Google Cloud Platform - WebAPIの登録方法」を、Yahoo!JAPAN を利用するのであれば、Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、それぞれ参照されたい。

準備:地図サービス(WebAPI)の選択

0033: //地図描画サービスの選択
0034: //    0:Google
0035: //    2:地理院地図・OSM
0036: define('MAPSERVICE', 2);
0037: 
0038: //住所検索サービスの選択
0039: //    0:Google
0040: //    1:Yahoo!JAPAN
0041: //   11:HeartRails Geo API
0042: //   12:OSM Nominatim Search API
0043: define('GEOSERVICE', 11);
0044: 
0045: //逆ジオコーディングサービスの選択
0046: //    0:Google
0047: //    1:Yahoo!JAPAN
0048: //   11:HeartRails Geo API
0049: //   21:簡易ジオコーディングサービス
0050: define('REVGEOSERVICE', 21);

表示する地図は、Googleマップ、[Yahoo!マップ]blue]、地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。
住所検索サービスは、GoogleYahoo!JAPANHeartRails Geo APIOSM Nominatim Search API から選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、GoogleYahoo!JAPANHeartRails Geo API簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。
PHPでマップを利用して緯度・経度や住所を求める
Yahoo!マップ表示
PHPでマップを利用して緯度・経度や住所を求める
OpenStreetMap
PHPでマップを利用して緯度・経度や住所を求める
地理院地図(淡色)

解説:初期設定

表示に関わる初期値は自由に変更できる。

0052: //マップの表示サイズ(単位:ピクセル)
0053: define('MAP_WIDTH',  600);
0054: define('MAP_HEIGHT', 400);
0055: //マップID
0056: define('MAPID', 'map_id');
0057: //初期値
0058: define('DEF_LATITUDE',  35.67);          //緯度
0059: define('DEF_LONGITUDE', 139.78);     //経度
0060: define('DEF_TYPE', 'roadmap');         //マップタイプ
0061: define('DEF_ZOOM',      8);             //ズーム
0062: define('DEF_CATEGORY',  'address');        //カテゴリ

解説:測地系変換

0586: /**
0587:  * 世界測地系を日本測地系に変換する
0588:  * @param   float $long 経度(世界測地系)
0589:  * @param   float $lat  緯度(世界測地系)
0590:  * @return  float array(経度,緯度)(日本測地系)
0591: */
0592: function wgs84_tokyo($long$lat) {
0593:     $glong = $long + $lat * 0.000046047 + $long * 0.000083049 - 0.010041;
0594:     $glat  = $lat  + $lat * 0.00010696  - $long * 0.000017467 - 0.0046020;
0595:     return array($glong$glat);
0596: }

この関数は、取得した世界測地系の緯度・経度を日本測地系に変換する。

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

解説:リージョン

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

0880: <script src="https://maps.googleapis.com/maps/api/js?key={$key}&amp;callback=initMap&amp;region=JP" async defer></script>
0881: <script>
0882: function initMap() {

参考サイト

(この項おわり)
header