PHPでキーワード・郵便番号から住所を検索

(1/1)
PHP で住所・ランドマークから緯度・経度を求める」を拡張し、都道府県一覧、キーワード、緯度・経度、郵便番号から住所を検索するプログラムをつくる。また、検索した住所に対応する地図を表示する。WebAPI としては、HeartRails Geo API を中心にマッシュアップする。

(2019 年 5 月 25 日)No.→郵便番号に変更,1 文字検索の不具合を修正,getTownsKana()追加。

実行例

PHPでキーワード・郵便番号から住所を検索
Google マップ表示

サンプル・プログラム

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

プログラムの流れ

初期状態では、都道府県情報取得 APIを呼び出し、都道府県を一覧表示する。
PHPでキーワード・郵便番号から住所を検索
都道府県を選択すると、市区町村情報取得 APIを呼び出し、市区町村を一覧表示する。
PHPでキーワード・郵便番号から住所を検索
市区町村を選択すると、町域情報取得情報取得 APIを呼び出し、町域を一覧表示する。
PHPでキーワード・郵便番号から住所を検索
町域を選択すると、キーワードによる住所検索APIを呼び出し、住所を表示する。
なお、HeartRails Geo APIの仕様上、字名 (あざめい) の読み仮名は取得できない。定数 GETRUBYTRUE にすることで、goo ラボ ひらがな化 API を使って読み仮名を取得できるが、必ずしも正しい読み仮名という保証はできない。
PHPでキーワード・郵便番号から住所を検索
[地図]リンクをクリックすると、当該住所の地図を表示する。
PHPでキーワード・郵便番号から住所を検索
キーワード検索では、ダイレクトに住所を検索・表示する。
キーワードは、住所の一部や、平仮名による検索もできる。
PHPでキーワード・郵便番号から住所を検索
郵便番号は、半角・全角ともに指定可能で、ハイフンの有無は問わない。
郵便番号が入力されると、郵便番号による住所検索APIを呼び出し、住所を表示する。
PHPでキーワード・郵便番号から住所を検索

準備:pahooGeoCode クラス

0035: class pahooGeoCode {
0036:     var $items;      //検索結果格納用
0037:     var $error;      //エラーフラグ
0038:     var $hits;       //検索ヒット件数
0039:     var $webapi; //直前に呼び出したWebAPI URL
0040: 
0041:     //Google Cloud Platform APIキー
0042:     //https://cloud.google.com/maps-platform/
0043:     //※Google Maps APIを利用しないのなら登録不要
0044:     var $GOOGLE_API_KEY_1 = '**************************';   //HTTPリファラ用
0045:     var $GOOGLE_API_KEY_2 = '**************************';   //IP制限用
0046: 
0047:     //Yahoo! JAPAN Webサービス アプリケーションID
0048:     //https://e.developer.yahoo.co.jp/register
0049:     //※Yahoo! JAPAN Webサービスを利用しないのなら登録不要
0050:     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が必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を、それぞれ参照されたい。

準備:pahooNormalizeText クラス

0012: class pahooNormalizeText {
0013:     var $items;      //検索結果格納用
0014:     var $error;      //エラーフラグ
0015:     var $errmsg; //エラーメッセージ
0016:     var $hits;       //検索ヒット件数
0017:     var $webapi; //直前に呼び出したWebAPI URL
0018: 
0019:     //Yahoo! JAPAN Webサービス アプリケーションID
0020:     //https://developers.google.com/maps/documentation/javascript/get-api-key
0021:     var $YAHOO_APPLICATION_ID = '**********************************';
0022: 
0023:     //gooラボ アプリケーションID
0024:     //https://labs.goo.ne.jp/apiregister/
0025:     var $GOOLABS_APPLICATION_ID = '***********************************';
0026: 
0027:     //MeCabの実行プログラム;各自の環境に合わせて変更のこと
0028:     var $MECAB = 'C:\Program Files (x86)\MeCab\bin\mecab.exe';
0029:     //ユーザー辞書
0030:     var $FILE_UDIC_MECAB =  'C:\Program Files (x86)\MeCab\dic\user_wiki.dic';
0031:     //特殊変換ファイル名
0032:     var $FILE_SPECIAL = 'special_table.txt';
0033: 
0034:     //正規化モード
0035:     var $OPTION_SPC_TRIM1 = 't';     //行頭・行末の空白文字を除く
0036:     var $OPTION_SPC_TRIM2 = 'T';     //全角文字と隣り合う空白文字を除く
0037:     var $OPTION_NUM_HAN   = 'n';     //数字を半角に統一
0038:     var $OPTION_NUM_ZEN   = 'N';     //数字を全角に統一
0039:     var $OPTION_NUM_KAN   = 'K';     //数字を漢字に統一
0040:     var $OPTION_ALP_HAN   = 'a';     //英字を半角に統一
0041:     var $OPTION_ALP_ZEN   = 'A';     //英字を全角に統一
0042:     var $OPTION_YAK_HAN   = 'y';     //記号を半角に統一
0043:     var $OPTION_YAK_ZEN   = 'Y';     //記号を全角に統一
0044:     var $OPTION_KATA_HAN  = 'h';     //カタカナを半角に統一
0045:     var $OPTION_KATA_ZEN  = 'H';     //カタカナを全角に統一
0046:     var $OPTION_SPEC_HAN  = 's';     //特殊文字を半角に統一
0047:     var $OPTION_SPEC_ZEN  = 'S';     //特殊文字を全角に統一
0048: 
0049:     //年号エスケープ記号(元号・西暦変換させない)
0050:     var $ESCYEAR = '\\';

テキストの全角・半角変換、西暦・和暦の変換、読み仮名の取得などを行うために、クラスファイル "pahooNormalizeText.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。
クラスについては「PHP でクラスを使ってテキストの読みやすさを調べる」を参照されたい。

読み仮名の取得などに Yahoo!JAPAN を利用するのであれば、Yahoo! JAPAN Web サービス アプリケーション IDが必要で、その入手方法は「Google Cloud Platform - WebAPI の登録方法」を、goo ラボ を利用するのであれば、アプリケーション ID が必要で、その入手方法は「goo ラボ - WebAPI の登録方法」を、それぞれ参照されたい。

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

0030: //地図描画サービスの選択
0031: //    0:Google
0032: //    1:Yahoo!JAPAN
0033: //    2:地理院地図・OSM
0034: define('MAPSERVICE', 1);

表示する地図は、Google マップ、[Yahoo!マップ]blue]、地理院地図・オープンストリートマップ(OSM)から選べる。あらかじめ、定数 MAPSERVIC に値を設定すること。

解説:初期値

0040: //マップの表示サイズ(単位:ピクセル)
0041: define('MAP_WIDTH',  600);
0042: define('MAP_HEIGHT', 400);
0043: //マップID
0044: define('MAPID', 'map_id');
0045: //初期値
0046: define('DEF_TYPE',     'roadmap');        //マップタイプ
0047: define('DEF_ZOOM',     13);         //ズーム
0048: 
0049: //都道府県・市区町村一覧の表示列数
0050: define('COLUMNS', 3);

各種のデフォルト・パラメータは、これらの定数によって設定されている。自由に変更できる。

解説:検索実行

0484: //検索実行
0485: if ($query != '') {
0486:     $query = trim($query);
0487:     //郵便番号
0488:     if (preg_match('/^[\-0123456789-0123456789]+$/i', $query) > 0) {
0489:         $q2 = mb_convert_kana($query, 'n');
0490:         $q2 = preg_replace('/[\-|-]/i', '', $q2);
0491:         $n = $pgc->searchByPostal_HeartRailsGeo($q2$items);
0492:         if (GETRUBY)    getTownsKana($items);
0493:     //緯度・経度
0494:     } else if (preg_match('/E(\d+)\.(\d+)\.(\d+)\.(\d+)N(\d+)\.(\d+)\.(\d+)\.(\d+)/i', $query) > 0) {
0495:         list($latitude$longitude) = $pgc->parse_geo($query);
0496:         $res = $pgc->getHeartRailsGeo_Address($latitude$longitude);
0497:         foreach ($res as $key=>$val)    $items[1][$key] = $val;
0498:         $items[1]['latitude'] = $latitude;
0499:         $items[1]['longitude'] = $longitude;
0500:     //キーワード
0501:     } else {
0502:         $n = $pgc->getPointsHeartRailsGeo_all($query$items);
0503:         if (GETRUBY)    getTownsKana($items);
0504:     }
0505: else if ($city != '') {
0506:     $n = $pgc->getTowns_HeartRailsGeo($prefecture$city$items);
0507:     if (GETRUBY)    getTownsKana($items);
0508: else if ($prefecture != '') {
0509:     $n = $pgc->getCities_HeartRailsGeo($prefecture$items);
0510: else {
0511:     $n = $pgc->getPrefectures_HeartRailsGeo($items);
0512: }
0513: 
0514: //地図作成
0515: if ($map) {
0516:     $jsmap = $pgc->drawJSMap(MAPID$latitude$longitudeDEF_TYPEDEF_ZOOMNULLNULLMAPSERVICE);
0517: else {
0518:     $jsmap = '';
0519: }
0520: 
0521: $HtmlBody = makeCommonBody($mode$prefecture$city$query$items$jsmap$pgc);

住所検索は、URL パラメータによって呼び出す WebAPI を切り替える。
キーワード $query がある場合は、その内容(パターン)によって、郵便番号、緯度・経度、キーワード検索のいずれかに仕分ける。

解説:字名の読み仮名取得

0183: /**
0184:  * 「gooラボ ひらがな化API」を用いて読み仮名を取得
0185:  * @param string $sentence 解析するテキスト
0186:  * @return string 読み仮名/FALSE:エラー
0187: */
0188: function getRuby_goo($sentence) {
0189:     //WebAPIにパラメータをPOST渡しする
0190:     $url = 'https://labs.goo.ne.jp/api/hiragana';
0191:     $post = array(
0192:         'app_id'       => $this->GOOLABS_APPLICATION_ID,
0193:         'sentence'     => $sentence,
0194:         'output_type'  => 'hiragana'
0195:     );
0196:     $cnt = 0;
0197:     $message = '';
0198: 
0199:     //API呼び出し
0200:     $this->webapi = $url;
0201:     $json = $this->post($url$post);
0202:     if ($json == FALSE) {
0203:         $this->error  = TRUE;
0204:         $this->errmsg = 'WebAPI error: ' . $url;
0205:         return FALSE;
0206:     } else {
0207:         $obj = json_decode($json);
0208:         if (isset($obj->converted)) {
0209:             $res = (string)$obj->converted;
0210:         } else {
0211:             $this->error  = TRUE;
0212:             $this->errmsg = 'WebAPI error: ' . $url;
0213:             $res = FALSE;
0214:         }
0215:     }
0216: 
0217:     return $res;
0218: }

HeartRails Geo APIの仕様上、字名 (あざめい) の読み仮名は取得できない。そこで、定数 GETRUBYTRUE にすることで、goo ラボ ひらがな化 API を使って読み仮名を取得できるようにした。コールするメソッドは getRuby_goo である。

活用例

全国市区町村名・町域読み方調べ」(みんなの知識 ちょっと便利帳)では、このサンプル・プログラムを利用しやすいようにアレンジして掲載している。ありがとうございます。

参考サイト

(この項おわり)
header