Tutorial
この記事の読了時間:約9分6秒
ここんとこスキや合間を見計らって、当方運営のwebサービス「フリーランサーズ パーク」をリニュってます。
フリーランサーズ パークでは、ユーザーさんが入力した郵便番号から住所や緯度経度を弾き出してるんですが、その際に使用しているのが「Google Maps API」です。
APIのバージョンが3になってからは認証キーなども必要なくなり、動作も軽快で出力形式もJSON/XMLが選べたりと、なにかと手軽に使用できるようになりました。
郵便番号のみならず、市区町村の文字列からも緯度経度を取得できますし、いわゆるジオコーディングには最適のAPIなんじゃないかと。
っちゅーコトで今回のエントリーでは、このGoogle Maps APIをPHPでゴニョゴニョして、都道府県や市区町村、緯度経度なんかを取得する方法をご紹介します☆
ざっくりと処理の流れを説明すると、まずはじめにGoogle Maps APIに郵便番号を渡して住所や緯度経度などのデータをごそっと頂きます。
んでソレを今度はPHPでごにょついて、いろんなデータから必要なモノだけを欲しいカタチにする、と。
そんな感じで上記に沿って、順を追っていきましょー。
Google Maps APIの「geocode API」を使って、郵便番号からデータを抽出します。
仕様云々の前に、まずは下記URLをクリックしてみてくださいな。
http://maps.googleapis.com/maps/api/geocode/json?address=1000001&language=ja&sensor=false
諸々ごちゃっと入ったJSONちゃんですが、要はこのURLの「address=●●●●●●●」のトコに郵便番号7桁をぶっ込めば、データをゲットできます。
URLのパラメータについての簡単な解説ですが、「http://maps.googleapis.com/maps/api/geocode/」のあとの「json」が【取得する際の形式】で、 json の他に xml と記述すれば同じ情報をXML形式で返してくれます。
で、次の「address」が【郵便番号7桁】、その後の「language」は【取得する際の言語(ここではja=日本語を指定してます。指定しないと英語で帰ってくる場合があるので)】です。
最後の「sensor」は【使用者の現在地をGPSなどセンサー機器を使って決定するかどうか】ってゆー、ちょっとなに言ってるかわからないアレなんですが、とにかくここはfalse一択で。
そんでもって次に下記も見比べてみましょー。
http://maps.googleapis.com/maps/api/geocode/json?address=9040412&language=ja&sensor=false
さっきとほぼ一緒ですが、最初のは[address_components]に5つしかなかったのに、こっちには6つ入ってます。
んで最後にエラーの場合は下記。
http://maps.googleapis.com/maps/api/geocode/json?address=0000000&language=ja&sensor=false
今度は前述の2つでは[status]が【OK】だったのに対して、こっちは【ZERO_RESULTS】となってます。
この辺をPHPでごにょついてあげる必要があるんでございますが。
APIについてはココまで知ってれば、そっから先はPHPの押しゴチになるんですが、Google Maps APIについてもっと知りたいという知的好奇心旺盛諸氏は、とりあえず本家の解説ページをどぞ。
何はともあれ、まずはPHPでこのJSONを受け取りましょう。
で、受け取るついでにJSONを解析して、使いやすいように配列化させちゃいましょ♪
<?php //郵便番号 $postNumber = '1820004'; //APIからデータを取得~配列に変換 $googleMapsApiData = json_decode(@file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?sensor=false&language=ja&address='.$postNumber), true);
これで $googleMapsApiData の中にはさっきのJSONが配列化されて入っております。
お次はこの配列から、エラーチェックしつつ必要な情報(今回は都道府県・市区町村以下・緯度・経度)を抜き出しませう。
<?php //郵便番号 $postNumber = '1820004';//調布市サイコー! //APIからデータを取得~配列に変換 $googleMapsApiData = json_decode(@file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?sensor=false&language=ja&address='.$postNumber), true); //APIから正しくデータを取得できたかチェック if($googleMapsApiData['status'] !== 'OK'){ echo 'すてーたすがOKやないで!'; exit; } //都道府県を取得 $addressArray = $googleMapsApiData['results'][0]['address_components']; unset($addressArray[0]);//郵便番号のトコを消して、、、 array_pop($addressArray);//国のトコも消して、、、 $addressArray = array_reverse($addressArray);//配列を逆さにして、、、 $tdfk = $addressArray[0]['long_name'];//コレが都道府県 unset($addressArray[0]);//市区町村の取得用に都道府県も消して、、、 //市区町村を取得 $skcsStrings = ''; foreach($addressArray as $v){ $skcsStrings .= $v['long_name'];//市区町村部分の文字列を連結させて、、、 } $skcs = $skcsStrings;//コレが市区町村以下 //緯度経度を取得 $lat = $googleMapsApiData['results'][0]['geometry']['location']['lat'];//コレが緯度 $lng = $googleMapsApiData['results'][0]['geometry']['location']['lng'];//コレが経度
どばーっと一気に行っちゃいましたが、こんな感じで情報が個別に取得できますとさ☆
っちゅーワケで、上記を関数化してみました。
7桁の郵便番号を引数に入れると、都道府県(tdfk)・市区町村以下(skcs)・緯度(lat)・経度(lng)が入った配列を、なんかおかしい場合はfalseを返します。
<?php function postNumber2Address($postNumber = NULL){ $returnArray = array(); if($postNumber === NULL || preg_match('/^\d{7}$/', $postNumber) !== 1) return false; $googleMapsApiData = json_decode(@file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?sensor=false&language=ja&address='.$postNumber), true); if($googleMapsApiData['status'] !== 'OK') return false; $addressArray = $googleMapsApiData['results'][0]['address_components']; unset($addressArray[0]); array_pop($addressArray); $addressArray = array_reverse($addressArray); $returnArray['tdfk'] = $addressArray[0]['long_name']; unset($addressArray[0]); $skcsStrings = ''; foreach($addressArray as $v) $skcsStrings .= $v['long_name']; $returnArray['skcs'] = $skcsStrings; $returnArray['lat'] = $googleMapsApiData['results'][0]['geometry']['location']['lat']; $returnArray['lng'] = $googleMapsApiData['results'][0]['geometry']['location']['lng']; return $returnArray; }
なおいちおー、GoogleさんのAPIとはいえ情報の正確さは保証しませんぜ。
それと毎度恒例ですが、ご利用は自己責任なんだからねっ///
でも個人的には一番おもしろいサービスだと思ってるので、ご存じない方は是非「フリーランサーズ パーク」をお試しあれ☆
色々挙動がアレなのは、リニューアルまでのご辛抱を。。。
関連する記事
同じカテゴリーの記事
(IP: 60.45.59.135, p24135-ipbffx02marunouchi.tokyo.ocn.ne.jp) より:
2016/11/15 11:25 AM
言葉使いが気持ち悪過ぎる
投稿者は幼稚でアタマ馬鹿だろ
名無し(IP: 60.45.59.135, p24135-ipbffx02marunouchi.tokyo.ocn.ne.jp) より:
2016/11/15 11:28 AM
言葉使いが気持ち悪過ぎる
投稿者は幼稚でアタマ馬鹿なんじゃないの
baka より:
2016/05/19 3:14 PM
解説記事になっとらんな。論文とか書いたことないだろ。