逆ジオコーディングによる地名の取得
緯度、経度から住所を取得することを「逆ジオコーディング」と言います。Net_UserAgent_Mobile_GPSにて取得した緯度、経度から住所を取得する際にはGoogle Maps APIの1つである「逆ジオコーディング」を使用します。
このAPIはGoogle Mapsドキュメントの英語版では「Reverse Geocoding (Address Lookup)」と呼ばれており、緯度、経度をAPIのURLに引数で渡すと住所情報をxml、kml、csv、jsonの形式で返却するというサービスです。
Google Maps APIの逆ジオコーディングの公式ドキュメントはこちらのURLになります。
APIの呼び出しは以下の形式で行います。
http://maps.google.com/maps/geo?ll=[経度],[緯度]&output=[出力形式]&key=[Google Map API key]&hl=[言語指定]&oe=UTF8";
APIから返却されるXMLについては以下の図のようになっています。

AddressDetail要素のattributesの1つであるAccuracyの値により返却される住所のレベルが指定されています。Accuracyの値と大まかな住所レベルは次のようになっています。
| Accuracyの値 | 住所レベル |
| 1 | 国名まで |
| 2 | 国名、都道府県まで |
| 3 | 国名、都道府県市まで |
| 4 | 国名、都道府県市区町村まで |
| 5 | 国名、郵便番号まで |
| 6 | 国名、都道府県市区町村丁目まで |
| 7 | 国名、都道府県市区町村丁目番地まで |
| 8 | 国名、都道府県市区町村丁目番地号まで |
さまざまな場所で逆ジオコーディングAPIを呼び出した結果、Accuracyの値が4~7では返却される住所詳細があいまいになることもありましたので、本記事ではAccuracyの値が8の住所情報を取得します。
サンプルでは取得したMaps API キーをconfig.phpに記述しています。
$google_map_key = "取得したMaps API キー";
住所取得部分ではGoogle Maps API Reverse Geocodingを呼び出してfile_get_contentsでXMLを取得した後、simplexml_load_string関数でXMLを解析してAccuracyの値が8の部分で住所情報を取得します。
function getGoogleMapAddress($lat,$lon){
// 返却する配列
$_return = array();
// 逆ジオコーディングAPI
$url = "http://maps.google.com/maps/geo?ll={$lat},{$lon}&output=xml&key=". $this->google_map_key . "&hl=ja&oe=UTF8";
$contents = file_get_contents($url);
$xml = simplexml_load_string($contents);
foreach($xml->Response->Placemark as $k=>$v){
// <AddressDetails Accuracy="8"> の部分より住所情報を取得
if($v->AddressDetails->attributes()->Accuracy == 8){
// 住所全文
$_return['address'] = strval($v->address);
// 都道府県
$_return['pref'] = strval($v->AddressDetails->Country->AdministrativeArea->AdministrativeAreaName);
// 市・群
$_return['city'] = strval($v->AddressDetails->Country->AdministrativeArea->Locality->LocalityName);
// 町村
$_return['town'] = strval($v->AddressDetails->Country->AdministrativeArea->Locality->DependentLocality->DependentLocalityName);
// 丁目・番地・号
$_return['detail'] = strval($v->AddressDetails->Country->AdministrativeArea->Locality->DependentLocality->Thoroughfare->ThoroughfareName);
break;
}
}
return $_return;
}
simplexml_load_string関数で解析した値はSimpleXMLElementオブジェクトなのでstrval関数で文字列オブジェクトに変換しています。
Google Maps API では緯度、経度は世界測地系(10進法)で扱います。Net_UserAgent_Mobile_GPSで取得できる緯度、経度は60進法での表示となっているので、これを10進法へ変換するメソッドを作成します。
function convert($val){
$s = preg_split("/\./",$val);
return $s[0] + ($s[1] / 60) + ($s[2] / 60 / 60) + ($s[3] / 60 / 60 / 1000);
}
Net_UserAgent_Mobile_GPSで取得した値は時、分、秒は60進法、秒より下の数値は10進法となっているので、分を60、秒を60x60、秒より下は1000で割って秒に直して60x60で割った値を加算して10進法にします。
