たたみラボ

  • about
  • member
  • r&d
  • blog
  • tatamicast

blog

RSS

Yahoo!ローカルサーチAPIで、ジオコーディング

icon February 27, 2007 5:01 PM by funami このエントリーを含むはてなブックマーク

フナミタカオです。
ローカルサーチWebサービスがリリースされました。ローカルサーチという名称なので、何ができるのか、ピンとこなかったのですが、実は、高性能のジオコーダーなのでした。
駅名検索、ランドマーク、住所、郵便番号での検索もでき、部分一致で複数戻してくれます。そして、もうひとつ、クーポン検索機能もあります。
特定の位置から、距離順に検索をすることも可能です。
しかも、結果には、世界座標系と、日本座標系の両方が含まれるのです。
これまでのGoogleジオコーダーや、シンプルジオコーディング実験とあわせて、かなり、国内も充実してきたと思います。
ローカルサーチAPIを試せる、簡単なページ作ってみました。
yahooP.jpg
サンプルでは、PlaceEngineも使って、ちょこっと、マッシュアップしています。
※IEだと、PlaceEngine起動時にエラーになっています。 IEのかたは、http://tatamilab.jp/~funami/mashup/yahoo/search2をお試しください。

駅名検索がうれしい

ローカルサーチということで、いろいろ、うれしことがあるのですが、個人的には、現在位置を中心として、近隣の駅の緯度経度が取れるのがうれしいです。

もともと、駅に関してはシンプルジオコーディング実験のAPIでも取得できたのですが、新線対応がが遅れている場合があるのが、ちょっと気がかりでした。
Yahoo!ローカルサーチの更新頻度がどこまで新鮮かは、確認していませんが、かなり、新鮮な動機を取ってくれることを、期待しています。

GoogleGeocoderとの比較

1.検索カテゴリ

GoogleGeocoder
  検索クエリがひとつだけということで、検索対象のカテゴリを設定することはできません。

Yahoo!ローカルサーチ:
  以下の項目別に検索できます。

検索カテゴリ
* Address - 住所
* Zipcode - 郵便番号
* Landmark - 施設
* Station - 駅
* Courpon - Yahoo!クーポン

郵便番号は、GoogleGeocoderでは受け付けてくれなかったので、便利だし、駅と住所を区別できるのは、便利です。

もちろん、区別したくないときもあるのですが、Yahoo!ローカルサーチではデフォルトでaddress、zipcode、landmark、stationを対象に検索してくれます。

とくにしていしなときは、GoogleGeocoderとほぼ同じ機能になりそうです。

 

2.座標系

GoogleGeocoder
  クエリ、レスポンスともに世界座標系のみ

Yahoo!ローカルサーチ
  クエリで日本、世界を選択可能
  レスポンスには、日本、世界の両方が返る

 

3.住所レベル

レスポンスに含まれる、住所が、県レベルなのか?街レベルなのかがこのパラメーターでわかります。
この値を元に地図の縮尺をかえるとか、アイコン(マーカー)の形状をかえるようなことができるようになります。

GoogleGeocoder
1から8まで定義されているのですが、日本の地名は、すべて1のCountryが戻ってくるようです。
アメリカ国内は大丈夫なようです。また、アフリカ、ヨーロッパは国名(例:エジプト)は「0 Unknown」,都市名(例:カイロ)は「1 country」が戻るようです。
アルファベットだとまた結果が変わったりして、ちょっと、使いづらい状況ではあります。

enum GGeoAddressAccuracy
There are no symbolic constants defined for this enumeration.
Constants
Constants Description
0 Unknown location. (Since 2.59)
1 Country level accuracy. (Since 2.59)
2 Region (state, province, prefecture, etc.) level accuracy. (Since 2.59)
3 Sub-region (county, municipality, etc.) level accuracy. (Since 2.59)
4 Town (city, village) level accuracy. (Since 2.59)
5 Post code (zip code) level accuracy. (Since 2.59)
6 Street level accuracy. (Since 2.59)
7 Intersection level accuracy. (Since 2.59)
8 Address level accuracy. (Since 2.59)

Yahoo!ローカルサーチ:
日本国内だけでも、いい感じでならべてくれるので、うれしいです。
しかし問題は、東京都でクエリすると2515937件のレスポンスが返るので、絞り込むのが大変。
そのために、クエリにも住所レベルの絞り込みを渡せるようになっています。
しかし、ここで、ちょっと疑問なんですが、AddressLevel=1の結果を出すのができません
ま、住所レベルの絞込みが市町村が最高なので、都道府県レベルでは出ないということのようです
http://api.map.yahoo.co.jp/LocalSearchService/V1/LocalSearch?n=100&al=1&appid=YahooDemo&p=%E9%9D%92%E6%A3%AE
↑例:住所レベル=市町村、名称=青森

Googleのほうは、国内の地名はほぼ、一箇所しか戻してくれないのですが、Yahoo!はあるだけ出してくれるようです。

AddressLevel 住所レベル:
* 0 - 住所以外
* 1 - 都道府県レベル
* 2 - 市区町村レベル
* 3 - 町、大字レベル
* 4 - 丁目、字レベル
* 5 - 番地レベル
* 6 - 号レベル
* 7 - その他1
* 8 - その他2
4.対象エリア

GoogleGeocoder
  きちんと仕様で確認できていないのですが、日本語でのサーチだと、国内および、世界各国の国名、主要都市名、観光地(感覚地)

Yahoo!ローカルサーチ
  これは日本にみかな?地図がそうなので、予想ですが...

 

 

ジオコーダー充実ということで

マッシュアップとしては、今飲んでいる、お店から、駅までの間でのお店候補を、ホットペッパーWebサービスを掛け合わせてみるなんていう使い方もできると思います。
マッシュアップアワードのねたとして、ぜひご活用ください。

 

サンプルソース

今回はRuby on Rilesで作っています。
ソース一式
展開後、各ファイルを、controller,views,publicに振り分けてください。
スタイルシートは、Web20テーマを使わせていただいています

コントローラは以下の様になっています。

   ・yahoo_controller.rb
   
   class YahooController < ApplicationController
   require 'net/http'
   require 'rexml/document'
  API_KEY = 'ここにAPIKEYを入れてください'
     
   def search_station
   xml = get_xml(params)
   @doc = REXML::Document.new(xml).elements['LocalSearchResult'] 
   @count = @doc.elements['Count'].text.to_i
   render :layout=>false
   end
   
   def search
   xml = get_xml(params)
  if params['type'] == 'xml'
   @headers['Content-Type'] = 'text/xml; charset=utf-8'
   render :text=>xml;
   else
   doc = REXML::Document.new(xml).elements['LocalSearchResult'] 
   end
   end
   
   
   :private
   def get_xml(params)
   @query_url = make_url(params)
   res = Net::HTTP.get_response(URI.parse(@query_url))
   xml = res.body
   end
   
   def make_url(params)
   param_array = []
   params.each do |key,value|
   unless value.to_s.empty?
   param_array << "#{key}=#{CGI.escape(value)}"
   end 
   end
   param_str = param_array.join('&')
   return "http://api.map.yahoo.co.jp/LocalSearchService/V1/LocalSearch?appid=#{API_KEY}&#{param_str}"
   end
   
   def api_key
   return API_KEY
   end
   end

 

関連リンク
Yahoo!地図情報WebサービスとGoogleMapsAPIを比べてみる
Yahoo!地図情報Webサービスついに公開

GoogleMapsAPIジオコーダーの小技
YahooからREST形式でのジオコーダAPI

COMMENTS

ソースが落ちてきません

December 24, 2007 2:29 PM by 774  

どうも、すみませんでした。
RailsをWebRickで動かしていたのですが、プロセスごと落ちてました。
ソースの部分に関しては、
http://tatamilab.jp/~funami/blog/sample.lzh
よりダウンロードいただけます。

ただし、サービスのほうは見れなくなっています。

December 26, 2007 8:40 PM by フナミタカオ  

ありがとうございます

December 27, 2007 1:42 PM by 774  

POST COMMENT




(書式を変更するような一部のHTMLタグを使うことができます)

必ず利用規約に同意いただいた上で送信ください。

ページトップへ



(C) RECRUIT MEDIA COMMUNICATIONS CO., LTD.