実行例
サンプル・プログラム
| search_address.php | サンプル・プログラム本体 |
| pahooGeoCode.php | 住所・緯度・経度に関わるクラス pahooGeoCode。 使い方は「PHPで住所・ランドマークから最寄り駅を求める」「PHPで住所・ランドマークから緯度・経度を求める」などを参照。include_path が通ったディレクトリに配置すること。 |
| pahooNormalizeText.php | テキスト正規化クラス pahooNormalizeText。 テキスト正規化クラスの使い方は「PHPで日本語テキストを正規化」を参照。include_path が通ったディレクトリに配置すること。 |
| pahooInputData.php | データ入力に関わる関数群。 使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 1.3.0 | 2025/08/30 | .pahooEnv導入, pahooInputData導入 |
| 1.2 | 2022/02/12 | PHP8対応,リファラ・チェック改良 |
| 1.1 | 2019/05/25 | No.→郵便番号に変更,1文字検索の不具合を修正,getTownsKana()追加 |
| 1.0 | 2019/05/24 | 初版 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 4.0 | 2021/11/03 | getRuby_Yahoo():subwordを格納するようにした |
| 3.91 | 2021/10/07 | getRuby_Yahoo():デバッグコードを消去 |
| 3.9 | 2021/09/26 | getRuby_Yahoo():ルビ振り(V2)に変更 |
| 3.8 | 2020/07/11 | getRuby_Yahoo(): ローマ字も取得 |
| 3.71 | 2020/06/30 | http(): each()関数をforeachで代替:PHP7.2対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 4.0 | 2021/11/03 | getRuby_Yahoo():subwordを格納するようにした |
| 3.91 | 2021/10/07 | getRuby_Yahoo():デバッグコードを消去 |
| 3.9 | 2021/09/26 | getRuby_Yahoo():ルビ振り(V2)に変更 |
| 3.8 | 2020/07/11 | getRuby_Yahoo(): ローマ字も取得 |
| 3.71 | 2020/06/30 | http(): each()関数をforeachで代替:PHP7.2対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 6.8.0 | 2025/08/10 | アクセスキーなどを ".pahooEnd" に分離 |
| 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の変更に対応 |
| バージョン | 更新日 | 内容 |
|---|---|---|
| 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() 追加 |
プログラムの流れ
なお、HeartRails Geo APIの仕様上、字名の読み仮名は取得できない。定数 GETRUBY を TRUE にすることで、gooラボ ひらがな化API を使って読み仮名を取得できるが、必ずしも正しい読み仮名という保証はできない。
キーワードは、住所の一部や、平仮名による検索もできる。
郵便番号が入力されると、郵便番号による住所検索APIを呼び出し、住所を表示する。
準備:PHP の https対応
Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dllLinuxでは --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 を利用するのであれば 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 関数群
また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。
準備:pahooNormalizeText クラス
pahooNormalizeText.php
12: class pahooNormalizeText {
13: var $items; //検索結果格納用
14: var $error; //エラーフラグ
15: var $errmsg; //エラーメッセージ
16: var $hits; //検索ヒット件数
17: var $webapi; //直前に呼び出したWebAPI URL
18:
19: //Yahoo! JAPAN Webサービス アプリケーションID
20: //https://developers.google.com/maps/documentation/javascript/get-api-key
21: var $YAHOO_APPLICATION_ID = '**********************************';
22:
23: //gooラボ アプリケーションID
24: //https://labs.goo.ne.jp/apiregister/
25: var $GOOLABS_APPLICATION_ID = '***********************************';
26:
27: //MeCabの実行プログラム;各自の環境に合わせて変更のこと
28: var $MECAB = 'C:\Program Files\MeCab\bin\mecab.exe';
29: //ユーザー辞書
30: var $FILE_UDIC_MECAB = 'C:\Program Files\MeCab\dic\user_wiki.dic';
31: //特殊変換ファイル名
32: var $FILE_SPECIAL = 'special_table.txt';
33:
34: //正規化モード
35: var $OPTION_SPC_TRIM1 = 't'; //行頭・行末の空白文字を除く
36: var $OPTION_SPC_TRIM2 = 'T'; //全角文字と隣り合う空白文字を除く
37: var $OPTION_NUM_HAN = 'n'; //数字を半角に統一
38: var $OPTION_NUM_ZEN = 'N'; //数字を全角に統一
39: var $OPTION_NUM_KAN = 'K'; //数字を漢字に統一
40: var $OPTION_ALP_HAN = 'a'; //英字を半角に統一
41: var $OPTION_ALP_ZEN = 'A'; //英字を全角に統一
42: var $OPTION_YAK_HAN = 'y'; //記号を半角に統一
43: var $OPTION_YAK_ZEN = 'Y'; //記号を全角に統一
44: var $OPTION_KATA_HAN = 'h'; //カタカナを半角に統一
45: var $OPTION_KATA_ZEN = 'H'; //カタカナを全角に統一
46: var $OPTION_SPEC_HAN = 's'; //特殊文字を半角に統一
47: var $OPTION_SPEC_ZEN = 'S'; //特殊文字を全角に統一
48:
49: //年号エスケープ記号(元号・西暦変換させない)
50: var $ESCYEAR = '\\';
クラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。
読み仮名の取得などに Yahoo!JAPAN を利用するのであれば、Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を、gooラボ を利用するのであれば、アプリケーションID が必要で、その入手方法は「gooラボ - WebAPIの登録方法」を、それぞれ参照されたい。
準備:地図サービス(WebAPI)の選択
search_address.php
57: // 地図描画サービスの選択
58: // 0:Google
59: // 2:地理院地図・OSM
60: define('MAPSERVICE', 0);
解説:初期値
解説:検索実行
search_address.php
466: // 検索実行
467: if ($query != '') {
468: $query = trim($query);
469: // 郵便番号
470: if (preg_match('/^[\-0123456789-0123456789]+$/i', $query) > 0) {
471: $q2 = mb_convert_kana($query, 'n');
472: $q2 = preg_replace('/[\-|-]/i', '', $q2);
473: $n = $pgc->searchByPostal_HeartRailsGeo($q2, $items);
474: if (GETRUBY) getTownsKana($items);
475: // 緯度・経度
476: } else if (preg_match('/E(\d+)\.(\d+)\.(\d+)\.(\d+)N(\d+)\.(\d+)\.(\d+)\.(\d+)/i', $query) > 0) {
477: list($latitude, $longitude) = $pgc->parse_geo($query);
478: $res = $pgc->getHeartRailsGeo_Address($latitude, $longitude);
479: foreach ($res as $key=>$val) $items[1][$key] = $val;
480: $items[1]['latitude'] = $latitude;
481: $items[1]['longitude'] = $longitude;
482: // キーワード
483: } else {
484: $n = $pgc->getPointsHeartRailsGeo_all($query, $items);
485: if (GETRUBY) getTownsKana($items);
486: }
487: } else if ($city != '') {
488: $n = $pgc->getTowns_HeartRailsGeo($prefecture, $city, $items);
489: if (GETRUBY) getTownsKana($items);
490: } else if ($prefecture != '') {
491: $n = $pgc->getCities_HeartRailsGeo($prefecture, $items);
492: } else {
493: $n = $pgc->getPrefectures_HeartRailsGeo($items);
494: }
495:
496: // 地図作成
497: if ($map) {
498: $jsmap = $pgc->drawJSMap(MAPID, $latitude, $longitude, DEF_TYPE, DEF_ZOOM, NULL, NULL, MAPSERVICE);
499: } else {
500: $jsmap = '';
501: }
502:
503: // 表示HTML作成
504: $HtmlBody = makeCommonBody($mode, $prefecture, $city, $query, $items, $jsmap, $pgc);
キーワード $query がある場合は、その内容(パターン)によって、郵便番号、緯度・経度、キーワード検索のいずれかに仕分ける。
解説:字名の読み仮名取得
pahooNormalizeText.php
188: /**
189: * 「gooラボ ひらがな化API」を用いて読み仮名を取得
190: * @param string $sentence 解析するテキスト
191: * @return string 読み仮名/FALSE:エラー
192: */
193: function getRuby_goo($sentence) {
194: //WebAPIにパラメータをPOST渡しする
195: $url = 'https://labs.goo.ne.jp/api/hiragana';
196: $post = array(
197: 'app_id' => $this->GOOLABS_APPLICATION_ID,
198: 'sentence' => $sentence,
199: 'output_type' => 'hiragana'
200: );
201: $cnt = 0;
202: $message = '';
203:
204: //API呼び出し
205: $this->webapi = $url;
206: $json = $this->post($url, $post);
207: if ($json == FALSE) {
208: $this->error = TRUE;
209: $this->errmsg = 'WebAPI error: ' . $url;
210: return FALSE;
211: } else {
212: $obj = json_decode($json);
213: if (isset($obj->converted)) {
214: $res = (string)$obj->converted;
215: } else {
216: $this->error = TRUE;
217: $this->errmsg = 'WebAPI error: ' . $url;
218: $res = FALSE;
219: }
220: }
221:
222: return $res;
223: }
活用例
参考サイト
- 各種WebAPIの登録方法:ぱふぅ家のホームページ
- PHPで住所・ランドマークから緯度・経度を求める:ぱふぅ家ホームページ
- 全国市区町村名・町域読み方調べ:みんなの知識 ちょっと便利帳

(2025年8月30日).pahooEnv導入, pahooInputDat導入