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

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

(2025年8月13日).pahooEnv 導入
(2025年6月14日)GoogleMaps JavaScript APIの変更に対応した.

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

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

サンプル・プログラム

圧縮ファイルの内容
getlatlng.phpサンプル・プログラム本体
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
getlatlng.php 更新履歴
バージョン 更新日 内容
2.8.0 2025/08/13 pahooInputData.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に対応。逆ジオコーディングサービスの選択肢を増やした。
pahooGeoCode.php 更新履歴
バージョン 更新日 内容
6.8.0 2025/08/10 アクセスキーなどを ".env" に分離
6.7.1 2025/07/26 jsLine_Gmap() - bug-fix
6.7.0 2025/07/20 drawJSmap,drawGMap -- 引数 $markerLevel 追加
6.6.0 2025/07/19 drawJSmap,drawGMap,drawLeaflet -- マップ中心マーカー表示引数を追加
6.5.0 2025/06/14 GoogleMaps JavaScript APIの変更に対応
pahooInputData.php 関数/メソッド一覧
関数/メソッド 機能 詳細
pahooLoadEnv .env ファイルからデータを読み込む .env ファイルは include_path が通っているディレクトリに配置すること
execFunc 指定した関数を実行し,その戻り値を返す. phpversion関数が実装されていなければ強制終了する.
exitIfLessVersion PHP処理系が指定したバージョン未満ならメッセージを表示して強制終了する.
exitIfExceedVersion PHP処理系が指定したバージョンを超えたらメッセージを表示して強制終了する.
isCommandLine コマンドラインから起動されたかどうかを求める.
isButton HTML FORMで指定したボタンが押されたかどうかを求める. filter_input()関数および $argv を参照する.
getParam HTML FORMで指定したINPUTの内容を取り出す. filter_input()関数および $argv を参照する.
validNumber 数値バリデーションを行う. 数値が整数か小数かを指定し,最小値と最大値を指定する.
getValidNumber HTML FORMで指定したINPUTの内容を数値として取り出す(バリデーション付き) filter_input()関数および $argv を参照する.
validString 文字列バリデーションを行う. filter_input()関数および $argv を参照する. 文字列の最小長,最大長,排除または受容するパターンを指定する.
validURL URLバリデーションを行う. RFC 1738 Uniform Resource Locators にマッチするかどうかを照合する。
validEmail メールアドレス・URLバリデーションを行う. RFC 2282 Internet Message Format にマッチするかどうかを照合する。
getValidString HTML FORMで指定したINPUTの内容を文字列として取り出す(バリデーション付き) filter_input()関数および $argv を参照する.
validRegexPattern 正規表現のバリデーションを行う.
getPasswordHash パスワード・ハッシュをつくる.
verifyPassword パスワードがハッシュに合致するかどうかを求める.
roundFloat 小数を指定した桁数で丸めて文字列として返す。 与えた小数の有効桁数より指定桁数が多いときには,末尾に0をサプレスする.

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

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

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:pahooGeoCode クラス

pahooGeoCode.php

  40: class pahooGeoCode {
  41:     public $items;      // 検索結果格納用
  42:     public $error;      // エラー・フラグ
  43:     public $errmsg;     // エラー・メッセージ
  44:     public $hits;       // 検索ヒット件数
  45:     public $webapi// 直前に呼び出したWebAPI URL
  46: 
  47:     // -- 以下のデータは .env ファイルに記述可能
  48:     // Google Cloud Platform APIキー
  49:     // https://cloud.google.com/maps-platform/
  50:     // ※Google Maps APIを利用しないのなら登録不要
  51:     public $GOOGLE_API_KEY_1 = '';      // HTTPリファラ用
  52:     public $GOOGLE_API_KEY_2 = '';      // IP制限用
  53:     public $GOOGLE_MAP_ID    = '';      // GoogleMaps ID
  54: 
  55:     // Yahoo! JAPAN Webサービス アプリケーションID
  56:     // https://e.developer.yahoo.co.jp/register
  57:     // ※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
  58:     public $YAHOO_APPLICATION_ID = '';
  59: 
  60:     // OSM Nominatim Search API利用時に知らせるメールアドレス
  61:     // https://wiki.openstreetmap.org/wiki/JA:Nominatim#.E6.A4.9C.E7.B4.A2
  62:     // ※OSM Nominatim Search APIを利用しないのなら登録不要
  63:     public $NOMINATIM_EMAIL = '';
  64: 
  65:     // IP2Location.io APIキー
  66:     // https://www.ip2location.io/
  67:     // ※IP2Location.ioを利用しないのなら登録不要
  68:     public $IP2LOCATION_API_KEY = '';

GoogleマップやLeafletなどによる地図描画や住所検索を行うためのクラスが pahooGeoCode である。同梱のクラス・ファイル "pahooGeoCode.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooGeoCodeクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。
PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

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

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

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

getlatlng.php

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

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

解説:初期設定

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

getlatlng.php

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

解説:測地系変換

pahooGeoCode.php

 621: /**
 622:  * 世界測地系を日本測地系に変換する
 623:  * @param   float $long 経度(世界測地系)
 624:  * @param   float $lat  緯度(世界測地系)
 625:  * @return  float array(経度,緯度)(日本測地系)
 626: */
 627: function wgs84_tokyo($long, $lat) {
 628:     $glong = $long + $lat * 0.000046047 + $long * 0.000083049 - 0.010041;
 629:     $glat  = $lat  + $lat * 0.00010696  - $long * 0.000017467 - 0.0046020;
 630:     return array($glong, $glat);
 631: }

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

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

解説:リージョン

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

pahooGeoCode.php

 940: <script src="https://maps.googleapis.com/maps/api/js?key={$key}&loading=async&libraries=marker&callback=initMap&region=JP" async defer loading="async"></script>
 941: <script>
 942: function initMap() {

参考サイト

(この項おわり)
header