Own products

  • 新規事業のアイディア創造機

Tutorial

2012
12/11

Google Maps APIとPHPを使って郵便番号から住所や緯度経度を取得する方法

この記事の読了時間:約96

  • このエントリーをはてなブックマークに追加

ここんとこスキや合間を見計らって、当方運営のwebサービス「フリーランサーズ パーク」をリニュってます。

フリーランサーズ パークでは、ユーザーさんが入力した郵便番号から住所緯度経度を弾き出してるんですが、その際に使用しているのが「Google Maps API」です。

APIのバージョンが3になってからは認証キーなども必要なくなり、動作も軽快で出力形式もJSON/XMLが選べたりと、なにかと手軽に使用できるようになりました。

郵便番号のみならず、市区町村の文字列からも緯度経度を取得できますし、いわゆるジオコーディングには最適のAPIなんじゃないかと。

っちゅーコトで今回のエントリーでは、このGoogle Maps APIPHPでゴニョゴニョして、都道府県市区町村緯度経度なんかを取得する方法をご紹介します☆

Google Maps APIとPHPで郵便番号からジオコーディングする方法

ざっくりと処理の流れを説明すると、まずはじめにGoogle Maps APIに郵便番号を渡して住所や緯度経度などのデータをごそっと頂きます。

んでソレを今度はPHPでごにょついて、いろんなデータから必要なモノだけを欲しいカタチにする、と。

そんな感じで上記に沿って、順を追っていきましょー。

1. Google Maps APIからJSON形式でデータを取得する

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についてもっと知りたいという知的好奇心旺盛諸氏は、とりあえず本家の解説ページをどぞ。

Google Maps API

2. JSONデータをPHPでパース~整形する

何はともあれ、まずは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'];//コレが経度

どばーっと一気に行っちゃいましたが、こんな感じで情報が個別に取得できますとさ☆

3. おまけ

っちゅーワケで、上記を関数化してみました。

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とはいえ情報の正確さは保証しませんぜ。

それと毎度恒例ですが、ご利用は自己責任なんだからねっ///

思い立ってリニューアル始めたは良いが、実は一番アクセスの少ないサービスだったりして。

でも個人的には一番おもしろいサービスだと思ってるので、ご存じない方は是非「フリーランサーズ パーク」をお試しあれ☆

色々挙動がアレなのは、リニューアルまでのご辛抱を。。。

  • このエントリーをはてなブックマークに追加

コメント一覧

3 Responses to [Google Maps APIとPHPを使って郵便番号から住所や緯度経度を取得する方法]

baka より:

2016/05/19 3:14 PM

解説記事になっとらんな。論文とか書いたことないだろ。

 (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

言葉使いが気持ち悪過ぎる
投稿者は幼稚でアタマ馬鹿なんじゃないの

コメントを投稿する

お名前

ご連絡先メールアドレス※非公開

コメント

CAPTCHA


  • このブログのRSSを購読する
  • このブログをtwitterでつぶやく
  • このブログをFacebookで共有する
  • このブログをはてなブックマークで共有する

Favorite feeds

    Contact

    お名前※必須

    ご連絡先メールアドレス

    お問い合わせ内容※必須

    CAPTCHA

    captcha

    Blog parts

    Affiliate