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

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

(2023年7月14日)検索キーの最小・最大長が指定できるようにした.
(2023年7月2日)国土地理院ジオコーディングAPIを利用できるようにした.

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

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

サンプル・プログラム

圧縮ファイルの内容
getlatlng.phpサンプル・プログラム本体
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
getlatlng.php 更新履歴
バージョン 更新日 内容
2.7.0 2023/07/16 検索キーの最小・最大長の指定
2.6.0 2023/07/02 国土地理院ジオコーディングAPIを追加
2.5 2021/10/10 PHP8対応,リファラ・チェック改良など
2.4 2020/04/18 Yahoo! JavaScriptマップ,地理院地図、OpenStreetMapに対応。逆ジオコーディングサービスの選択肢を増やした。
2.3 2017/08/23 GoogleMaps API呼び出しに region=JP 追加
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.3.3 2024/09/14 $this->NOMINATIM_EMAIL 追加
6.3.2 2024/02/14 getStaticMap() -- bug-fix
6.3.1 2023/07/09 bug-fix
6.3.0 2023/07/02 getPointsGSI()追加
6.2.0 2023/07/02 ip2address()追加
pahooInputData.php 更新履歴
バージョン 更新日 内容
1.5.0 2024/01/28 exitIfExceedVersion() 追加
1.4.2 2024/01/28 exitIfLessVersion() メッセージ修正
1.4.1 2023/09/30 コメントの訂正
1.4.0 2023/09/09 $_GET, $_POST参照をfilter_input()関数に置換
1.3.0 2023/07/11 roundFloat() 追加

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

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

準備:pahooGeoCode クラス

  37: class pahooGeoCode {
  38:     var $items;     //検索結果格納用
  39:     var $error;     //エラー・フラグ
  40:     var $errmsg;    //エラー・メッセージ
  41:     var $hits;      //検索ヒット件数
  42:     var $webapi;    //直前に呼び出したWebAPI URL
  43: 
  44:     //Google Cloud Platform APIキー
  45:     //https://cloud.google.com/maps-platform/
  46:     //※Google Maps APIを利用しないのなら登録不要
  47:     var $GOOGLE_API_KEY_1 = '**************************';   //HTTPリファラ用
  48:     var $GOOGLE_API_KEY_2 = '**************************';   //IP制限用
  49: 
  50:     //Yahoo! JAPAN Webサービス アプリケーションID
  51:     //https://e.developer.yahoo.co.jp/register
  52:     //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  53:     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)の選択

  48: //地図描画サービスの選択
  49: //    0:Google
  50: //    2:地理院地図・OSM
  51: define('MAPSERVICE', 2);
  52: 
  53: //住所検索サービスの選択
  54: //    0:Google
  55: //    1:Yahoo!JAPAN
  56: //   11:HeartRails Geo API
  57: //   12:OSM Nominatim Search API
  58: //   13:国土地理院ジオコーディングAPI
  59: define('GEOSERVICE', 12);
  60: 
  61: //逆ジオコーディングサービスの選択
  62: //    0:Google
  63: //    1:Yahoo!JAPAN
  64: //   11:HeartRails Geo API
  65: //   21:簡易ジオコーディングサービス
  66: define('REVGEOSERVICE', 21);

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

解説:初期設定

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

  68: //マップの表示サイズ(単位:ピクセル)
  69: define('MAP_WIDTH',  600);
  70: define('MAP_HEIGHT', 400);
  71: //マップID
  72: define('MAPID', 'map_id');
  73: //初期値
  74: define('DEF_LATITUDE',  35.67);         //緯度
  75: define('DEF_LONGITUDE', 139.78);        //経度
  76: define('DEF_TYPE', 'roadmap');          //マップタイプ
  77: define('DEF_ZOOM',      8);             //ズーム
  78: define('DEF_CATEGORY',  'address');     //カテゴリ
  79: 
  80: //検索キーの最小文字長
  81: define('QUERY_MIN_LEN', 3);
  82: 
  83: //検索キーの最大文字長
  84: define('QUERY_MAX_LEN', 99);

解説:測地系変換

 599: /**
 600:  * 世界測地系を日本測地系に変換する
 601:  * @param   float $long 経度(世界測地系)
 602:  * @param   float $lat  緯度(世界測地系)
 603:  * @return  float array(経度,緯度)(日本測地系)
 604: */
 605: function wgs84_tokyo($long, $lat) {
 606:     $glong = $long + $lat * 0.000046047 + $long * 0.000083049 - 0.010041;
 607:     $glat  = $lat  + $lat * 0.00010696  - $long * 0.000017467 - 0.0046020;
 608:     return array($glong, $glat);
 609: }

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

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

解説:リージョン

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

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

参考サイト

(この項おわり)
header