逆ジオコーディングで緯度経度から住所を取得してみる

By fukumoto - 08/11/28 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

最近、逆ジオコーディングを使ったので、
それについてちょっと書いてみたいと思います。
 

そもそも逆ジオコーディングとは、
当たり前ですが、ジオコーディングの逆のことです。
ジオコーディングが住所から緯度経度を取得するものに対して、
逆ジオコーディングは緯度経度から住所を取得するものです。
 
例えば、GPSで現在地の緯度経度をパラメータにつけて送信すると、
その場所の住所がわかったりします。
逆ジオコーディングを提供するAPIがポツポツと増えてきました。
Google Maps APIとかYahooローカルサーチAPIとか簡単に使えるもので言うとまだまだあります。
コチラでたくさん紹介されていますので参考にして下さい。
 

そこで今回は、前回せっかくYAHOOローカルサーチAPIのキーを取得しましたので、
YAHOOローカルサーチAPIから逆ジオコーディングを試してみます。
根本的な使い方は前回と同じです。リクエストURLを作ります。
 

基本となるリクエストURL
 

http://map.yahooapis.jp/LocalSearchService/V1/LocalSearch

 
このURLの後ろにパラメータを付けていきます。
前回同様、アプリケーションIDは必須です。
先ほどのリクエストURLに”?”を入れてくっつけましょう。
 
 

?appid=[ココに入力]

 
 
必須項目の部分が前回とは変わります。
「p」か「lat・lon・dist」のどちらかを必須に持ってこればいいのですが、
逆ジオコーディングなので、lat(緯度)・lon(経度)・dist(距離)を必須にします。
 

&lat=[緯度を入力]&lon=[経度を入力]&dist=[距離を入力]

 
次にカテゴリを指定します。
住所を取得したいので、「address」です。
 

&category=address

 
他にもパラメータを付けることはできますが、
説明は割愛致します。前回の記事をご参照下さい。
最後に「al」で住所レベルの絞込みを指定します。
 

住所レベルの絞り込み:
1 - 市区町村レベル
2 - 町、大字レベル
3 - 丁目、字レベル

&al=3

 
ではここまでで、できたあがったリクエストURLを見てみましょう。
そして、それを変数$urlに入れます。
 

$url = "http://map.yahooapis.jp/LocalSearchService/V1/LocalSearch?appid=[ココに入力]&lat=[緯度を入力]&lon=[経度を入力]&dist=[距離を入力]&category=address&n=1&datum=wgs&al=3";

 
入れましたら前回同様、
ファイルの内容を文字列に読み込む関数を使います。
 
 

$contents = file_get_contents($url);

 
 
そして、XML文字列をオブジェクトに代入します。
 
 

$xml = simplexml_load_string($contents);

 
中身はこれです。
 

object(SimpleXMLElement)#48 (4) { ["Count"]=>  string(2) "16" ["ViewCount"]=>  string(1) "1" ["Query"]=>  object(SimpleXMLElement)#49 (0) { } 
["Item"]=>  object(SimpleXMLElement)#50 (7) { ["Category"]=>  string(7) "Address" ["Title"]=>  string(46) "大阪府大阪市中央区博労町3丁目" 
["Address"]=>  string(46) "大阪府大阪市中央区博労町3丁目" ["AddressLevel"]=>  string(1) "4" ["DatumTky97"]=>  object(SimpleXMLElement)#51 (2) 
{ ["Lat"]=>  string(11) "34.67755194" ["Lon"]=>  string(9) "135.50198" } ["DatumWgs84"]=>  object(SimpleXMLElement)#52 (2) { ["Lat"]=>  
string(15) "34.680807321833" ["Lon"]=>  string(15) "135.49917076401" } ["Url"]=>  object(SimpleXMLElement)#53 (0) { } } } 

 
これで住所を取得できました。逆ジオコーディング完了です。
若干の誤差はありますね。ただ数値を変えれば。
数値を変えれば、もっと細かく番地まで出すことも可能です。
時間がある方は、どのAPIが一番精度が高いかを試してみるのもいいかもしれないですね。