飲食店の位置情報が欲しいなー

と思ってたら、ちょうど「食べログ.com レストラン情報取得API」なるものが公開されていた。
他に飲食店位置情報を取得できる Web Services API は無いのでは。唯一?

本日、価格.com WEBサービスの第一弾として、価格.comから商品検索とアイテム情報取得用のAPIと、食べログ.comから、レストラン情報を取得するAPIを一般公開しました。
(中略) 3.食べログ.com レストラン情報取得API
緯度経度、都道府県、駅名をキーにレストラン情報を検索し、ユーザレイティングや、電話番号や住所といったレストラン情報を取得できるAPIです。

価格.com WEBサービス - 価格.com WEBサービスを公開しました!!

今のところユーザ登録も不要。実に手軽。
早速、レストラン情報取得APIを使ってみる。

API のお手軽なパラメータセット

リファレンス: 価格.com WEBサービス API マニュアル - レストラン情報取得API

とりあえず、お手軽なパラメータセットを選択していく。

Latitude=緯度
Longitude=経度
SearchRange=large
ResultSet=large

緯度経度はデフォルトでは世界測地系(現時点の Google Maps と同じ)。旧日本測地系もパラメータを指定することで利用可能。
SearchRange は検索範囲。とりあえず large を指定 (具体的にどれぐらいの範囲?)
ResultSet は検索結果の情報量。飲食店の緯度経度を取得するなら large を指定。

で、実際にレストラン情報を取得してみる

いろいろなパラメータがあるけど、とりあえずレストランの位置情報を取得するなら、これぐらいが簡単。
ウェブブラウザでアクセスしてみると、レスポンスがXML.


http://api.tabelog.com/Ver1/RestaurantSearch/
?Latitude=35.158087
&Longitude=136.910198
&SearchRange=large
&ResultSet=large

取得結果例(一部) : 名古屋 大須 付近


<RestaurantInfo>
<Item>
<RestaurantName>キッチン千代田</RestaurantName>
<TabelogUrl>http://r.tabelog.com/aichi/rstdtl/23000349/</TabelogUrl>
<TotalScore>3.68</TotalScore>
<TasteScore>3.83</TasteScore>
<ServiceScore>2.78</ServiceScore>
<MoodScore>2.67</MoodScore>
<Situation>友人・同僚と、デート、接待、家族・子供と</Situation>
<DinnerPrice>¥1,000 ~¥1,999</DinnerPrice>
<LunchPrice>¥6,000 ~¥7,999</LunchPrice>
<Category>ステーキ、しゃぶしゃぶ、オムライス</Category>
<Station>鶴舞</Station>
</Item>
<Item>
<RestaurantName>一風堂 本町通り店</RestaurantName>
<TabelogUrl>http://r.tabelog.com/aichi/rstdtl/23000174/</TabelogUrl>
<TotalScore>3.57</TotalScore>
<TasteScore>3.69</TasteScore>
<ServiceScore>3.4</ServiceScore>
<MoodScore>3.55</MoodScore>
<Situation>友人・同僚と、デート、家族・子供と、一人で</Situation>
<DinnerPrice>¥0 ~¥999</DinnerPrice>
<LunchPrice>¥0 ~¥999</LunchPrice>
<Category>ラーメン</Category>
<Station>矢場町、伏見</Station>
</Item>
(以下略)

RestaurantInfo 要素の下に Item 要素のリスト。
Item 要素1つ = レストラン1つ
Item 要素以下の要素は、たまに抜けてる。すべての情報が揃っているとは思わないほうが良さそう。

取得するコードを Java で書いてみる

Java XML DOM API を使って、レストラン情報を取得する。


import java.net.*;
import java.util.*;
import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
 
/**
 * 食べログ レストラン情報。サンプル用コード。
 */
public class Tabelog {
 
  private final String lat;
  private final String lon;
 
  public Tabelog(String lat, String lon) {
    this.lat = lat;
    this.lon = lon;
  }
 
  public POI[] getPOIs() throws Exception {
 
    final String url = "http://api.tabelog.com/Ver1/RestaurantSearch/?SearchRange=large&ResultSet=large&Latitude=" + lat + "&Longitude=" + lon;
 
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(url);
    NodeList nodes = doc.getElementsByTagName("Item");
 
    ArrayList restaurants = new ArrayList();
    for(int i=0; i<nodes.getLength(); i++){
      Node node = nodes.item(i);
      POI poi = new POI();
      poi.RestaurantName = getText(node, "RestaurantName");
      poi.TabelogUrl = getText(node, "TabelogUrl");
      poi.TotalScore = getText(node, "TotalScore");
      poi.TasteScore = getText(node, "TasteScore");
      poi.ServiceScore = getText(node, "ServiceScore");
      poi.MoodScore = getText(node, "MoodScore");
      poi.Situation = getText(node, "Situation");
      poi.DinnerPrice = getText(node, "DinnerPrice");
      poi.LunchPrice = getText(node, "LunchPrice");
      poi.Category = getText(node, "Category");
      poi.Station = getText(node, "Station");
      poi.Address = getText(node, "Address");
      poi.Tel = getText(node, "Tel");
      poi.BusinessHours = getText(node, "BusinessHours");
      poi.Holiday = getText(node, "Holiday");
      poi.Latitude = getText(node, "Latitude");
      poi.Longitude = getText(node, "Longitude");
      restaurants.add(poi);
    }
 
    return (POI[])restaurants.toArray(new POI[restaurants.size()]);
  }
 
  private static String getText(Node base, String elementName){
    NodeList nodes = ((Element)base).getElementsByTagName(elementName);
    if(nodes != null && nodes.getLength() > 0){
      Node node = nodes.item(0);
      Node textnode = node.getFirstChild();
      if(textnode != null){
        return textnode.getNodeValue();
      }
    }
    return null;
  }
(略)

Poison Maps Location の住所と連携させる

せっかくなので、もうちょっとブラッシュアップして Poison Maps Location から利用できるように実装してみた。

現在の「名古屋 大須」のレストラン情報はこんな感じ。

poisonmaps location with tabelog

APIを使うときは、価格.com WEBサービス の クレジット表示 を忘れずに。

せっかくレストランの位置情報が取得できるAPIなので、Google Maps API で地図にレストランの位置を乗せたりするところかもしれないが、面倒なのでパス。
だいたい、本家 食べログ.com が すでに Google Maps API を使って地図連携してることだし → 食べログ.com、Google Maps APIを使った口コミ情報--便利ツールも続々登場 - CNET Japan

追記: 2006-10-02

だめもとでメール送ったら載せてもらえた (ノ*゚ー゚)ノ わぁい

NI-Lab.さんが、Poison Maps Location に食べログ.com APIを利用してレストラン情報検索機能を開発されましたので、ご紹介させて頂きます。

【リンク】
http://www.nilab.info/poisonmaps/location

【サービス内容】
住所をキーワードとして検索すると、周辺地図・天気・TV番組情報、そして食べログ.com APIを使ったレストラン情報などの地域情報をまとめて表示することができます。

価格.com WEBサービス - 【サービス紹介】Poison Maps Location by NI-Lab.さん

tags: zlashdot GIS PoisonMapsLocation Tabelog WebServices

Posted by NI-Lab. (@nilab)