PHPでIPアドレスやホスト名から住所を求める

(1/1)
IP2Location.io は、IPアドレスから住所を求めることができるWebサービスだ。サイトへの訪問者の地理的位置を特定するために利用されている。
これと、Googleや地理院地図、オープンストリートマップの地図サービスをクラウド連携することで、アクセスしているIPアドレスやホスト名から住所を求めるPHPプログラムを作ってみることにする。

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

目次

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

PHPでIPアドレスやホスト名から住所を求める
Googleマップ表示

サンプル・プログラムのダウンロード

圧縮ファイルの内容
ip2address.phpサンプル・プログラム本体。
pahooGeoCode.php住所・緯度・経度に関わるクラス pahooGeoCode。
使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
ip2address.php 更新履歴
バージョン 更新日 内容
1.1.0 2025/08/13 .pahooEnv 導入
1.0.0 2022/12/31 初版
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 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

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

PHPでIPアドレスやホスト名から住所を求める

準備:PHP の https対応

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

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

これで準備は完了だ。

準備: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でクラスを使ってテキストの読みやすさを調べる」を参照されたい。

準備:pahooInputData 関数群

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

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

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

ip2address.php

  59: // 地図描画サービスの選択
  60: //    0:Google
  61: //    2:地理院地図・OSM
  62: define('MAPSERVICE', 0);
  63: 
  64: // 逆ジオコーディングサービスの選択
  65: //    0:Google
  66: //    1:Yahoo!JAPAN
  67: //   11:HeartRails Geo API
  68: //   21:簡易ジオコーディングサービス
  69: define('REVGEOSERVICE', 0);

表示する地図は、Googleマップ地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。
住所検索サービスは、GoogleYahoo!JAPANHeartRails Geo APIから選べる。あらかじめ、定数 GEOSERVICE に値を設定すること。
逆ジオコーディングサービスは、GoogleYahoo!JAPANHeartRails Geo API簡易ジオコーディングサービスから選べる。あらかじめ、定数 REVGEOSERVICE に値を設定すること。

解説:IP2Location.io による位置情報取得

IP2LOCATION.IO IP GEOLOCATION API」は、入力パラメータ(IN)は GET 渡しで、出力結果(OUT)は JSON などで戻すという形である。今回使う入力パラメータと出力結果のデータ構造を以下に示す。得られる緯度・経度は世界測地系(wgs84)であることに留意されたい。
WebAPI
URL
https://api.ip2location.io/
入力パラメータ
フィールド名 要否 内  容
key 必須 IP2LOCATION.IO IP GEOLOCATION APIを利用するためのアプリケーション・キー
ip 必須 検索するIPアドレス(IPv4またはIPv6)
format 省略可能 出力書式。jsonまたはxml
lang 省略可能 言語。ISO639-1による。日本なら ja
応答データ(json) ip IPアドレス(IPv4またはIPv6) country_code 国コード(ISO639-1) country_name 国名 region_name 地域名 city_name 市区町村名 latitude 緯度(10進小数) longitude 経度(10進小数) zip_code 郵便番号 time_zone タイムゾーン as AS番号 asn AS名 isp ISP名 is_proxy プロキシ経由かどうか(true/false)

解説:IP2LOCATION.IO IP GEOLOCATION APIの呼び出し

pahooGeoCode.php

2640: /**
2641:  * IP2Location.ioを用いてIPアドレスから緯度・経度を求める
2642:  * @param   string $ip IPアドレス
2643:  * @return  array($latitude, $longitude) 緯度, 経度(世界測地系,10進数の度表記)
2644: */
2645: function ip2address($ip) {
2646:     $res = FALSE;
2647: 
2648:     // IP2Location.io呼び出し
2649:     $url = 'https://api.ip2location.io/?key=' . $this->IP2LOCATION_API_KEY . '&ip=' . $ip . '&format=json';
2650:     $this->webapi = $url;
2651:     $json = @file_get_contents($url, FALSE);
2652: 
2653:     // レスポンス・チェック
2654:     if ($json == FALSE) {
2655:         $this->error = TRUE;
2656:         $this->errmsg = 'ip2locationにアクセスできません';
2657:     } else {
2658:         // APIからの応答取得
2659:         if ($this->isphp7over()) {
2660:             $arr = @json_decode($json, FALSE, 512, JSON_BIGINT_AS_STRING);
2661:         } else {
2662:             $arr = @json_decode($json, FALSE, 512);
2663:         }
2664:         if (isset($arr->latitude&& isset($arr->longitude)) {
2665:             $res = array((double)$arr->latitude, (double)$arr->longitude);
2666:         } else {
2667:             $this->error = TRUE;
2668:             $this->errmsg = 'IPアドレスが見つかりません';
2669:         }
2670:     }
2671: 
2672:     return $res;
2673: }

ip2address は、IP2LOCATION.IO IP GEOLOCATION API を呼び出して、緯度、経度のみを返すメソッドである。

解説:メイン・プログラム

メイン・プログラムは、これまで説明してきたクラウド連携・プログラムとほぼ同じである。

ip2address.php

 295: // IPアドレスはREMOTE_ADDRから取得
 296: $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR': '';
 297: if (is_ipadr($ip) == FALSE)     $ip = '';
 298: if ($ip == '')  $ip = DEF_QUERY;

初期値として使うIPアドレスは、「PHPでユーザー・アクセス情報を表示する」で紹介したプログラムを利用し、端末がインターネットにアクセスしているIPアドレス($_SERVER['REMOTE_ADDR'])を参照している。

ip2address.php

 322: // ホスト名→IPアドレス変換を実行する
 323: if (($host = is_host($query)) !FALSE) {
 324:     $ip = gethostbyname($host);
 325: else {
 326:     $ip = $query;
 327: }

検索キーとして、IPアドレスだけでなくホスト名(ドメイン名を含む)の入力も許可した。そこで、「IPアドレスとドメイン名を相互変換する」で紹介したプログラムを利用し、入力値がホスト名だったらIPアドレスに変換する処理を加えた。

ip2address.php

 337:     // エラーがなければ緯度・経度に代入
 338:     if ($res !FALSE) {
 339:         $latitude  = $res[0];
 340:         $longitude = $res[1];
 341:         // 緯度・経度から住所を取得
 342:         $arr = $pgc->getAddress3($latitude, $longitude, REVGEOSERVICE);
 343:         if ($arr !FALSE) {
 344:             // 住所は都道府県+市町村
 345:             $address = $arr['prefecture'. $arr['city'];
 346:             // マップに表示する情報ウィンドウの内容
 347:             $description = "IPアドレス:{$ip}<br />住所:{$address}<br />緯度:{$latitude},経度:{$longitude}";
 348:             $items[1] = array(
 349:                 'latitude'    => $latitude,
 350:                 'longitude'   => $longitude,
 351:                 'title'       => '',
 352:                 'description' => $description
 353:             );
 354:         }
 355:     } else {
 356:         $errmsg = $pgc->geterror();
 357:     }

ip2address から受け取った緯度・経度を、「PHPで緯度・経度から住所を求める」で紹介したメソッド getAddress3 を使って住所に変換する。
ここでは IP2Location.io の無償ライセンスを利用していることから位置情報の精度が低いため、住所として市町村名まで取得するようにした。

参考サイト

(この項おわり)
header