逆ジオコーディングによる地名の取得
緯度、経度から住所を取得することを「逆ジオコーディング」と言います。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進法にします。