読者です 読者をやめる 読者になる 読者になる

lxyuma BLOG

開発関係のメモ

GooglePlaceApiを使ってみるメモ。

GooglePlaceApi使ってみた。

ちょっと、まとまりなく、断片的な内容で、本当にメモ程度の記事。

GooglePlaceApiとは

Googleが提供する位置情報のAPI

GoogleMapでもできるじゃんと思うかもしれないが、

GoogleMapの検索でひっかかる場所は殆ど地名。

細かな店舗/有名スポット等々はGoogleMapではひっかからない。

そこでGooglePlaceAPIを使う。

2013年10月現在、まだ試験版なので注意。

参考

手順

概要

  • プレイス検索:要するに4sqみたいな、場所×キーワードで検索
  • テキスト検索:Googleで「新宿 ラーメン」でスポットがひっかかるようなイメージ。キーワードだけでスポットを検索する。コレが出来るのがこのAPIの強み。
  • プレイス詳細:その通り、プレイスの詳細

勿論、他にスポット追加等色々あった。

ここでは、この3つ試してみる。

プレイス検索

とりあえず、プレイス検索してみる。

緯度経度と食べ物屋で検索してみる。

  • 渋谷周辺の検索

https://maps.googleapis.com/maps/api/place/search/json?location=35.664035,139.698212&radius=500&types=food&sensor=false&key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(メモしたkey)

  • 上記のデータよりphoto/referenceを取得してみる

https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=CtQB0AAAAEakmmHyexAu5trTV-qyQSOEyVg_VML5wVVga2JGqQ38NcM-hrxY34KrEUxXKjLn9vvWbnqP-tHIzsF0VXghC1vYmD0pnpMY0dqubZ2OS5akPA_H70fzIMyVll6q1xERGyvBXF5iCfWu8RXpclJGwkVVT4I-rfHxQ3IhVCim9csqsN0sUzv02InEnevk8qCfao1HderflzEZB8XES9oLPLbPGGe_g_78M_6rMiEhgo7V3huRpgHrSRESmbmRnZmXosvRQNpJTyYIfS1_91X_3voSENwSj3s7dDobrw8PuH1EQN0aFKyAZNmm4syESmsR3TbuKGmqA3lQ&sensor=true&key=XXXXXXXXXXXXXXXXXXXXXXXXXX(メモしたkey)

テキスト検索

Googleで「新宿 ラーメン」で検索しているのと同じイメージ

https://maps.googleapis.com/maps/api/place/textsearch/json?query=cafe&sensor=false&key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

詳細検索

https://maps.googleapis.com/maps/api/place/details/json?reference=CoQBdAAAACPxi_2HyanjUTuialYvvz7otmIYjunnTa9NuSYhTej0xDXKIQRR34oZGgw-Px0Sal23OCgBZ9GXb-YPqHpWCJu8cJxcYSdsEt46KRQ9Pk33qtN2cG5WhsawF5WztLxmxyfM294IhG4hsrZ51l3vhca3Tw3ckRTbfOwYjct9tybCEhB6wCNiL8Z35jyLMYllIexJGhRWPPqtLN6-Y-M23WW5fJfDuVtLGA&sensor=true&key=XXXXXXXXXXXXXXXXXXXXXXXXXX

使ってみて気になった事

検索APIで、nameを指定しても、nameにひっかからない事が多数ある様子(特に全角が怪しい)

代わりに、keywordで同じ語を指定すると、精度が上がった。(こちらは全角でもちゃんとひっかかる)

ただ、それでも、1件目に本当に欲しい店舗がひっかかるかと言うと、そうでもないみたい。

例えば、渋谷の松屋を検索してるのに、ファミレスが一件目にひっかかったりする。

ruby gem

rubyの方はこちら。作ってる人がいた。

https://github.com/marceldegraaf/google_places

@client = GooglePlaces::Client.new(XXXXXXXXXXXXXXX) # XXXXXXXXXXXXXXXX = your key! @client.spots_by_query("渋谷 ラーメン") @client.spots(reference)

レスポンス

text searchの結果はこんな感じ。

データは名前・緯度・住所・ジャンル(type)等。

ここまでは普通だが、面白いのは、評価と価格LVがある。

※以下、面倒くさそうな所は******で伏せてる

{
   "debug_info" : [],
   "html_attributions" : [],
   "next_page_token" : "*********************************",
   "results" : [
      {
         "formatted_address" : "日本, 東京都渋谷区神南1丁目*****",
         "geometry" : {
            "location" : {
               "lat" : 35.663574,
               "lng" : 139.699362
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/cafe-71.png",
         "id" : "c8f2e67090179c886318c8439990d828b18c3872",
         "name" : "カフェ ********",
         "price_level" : 2,
         "rating" : 3.9,
         "reference" : "CoQBeQAAACpzvbxMwKDC1NKwRAD3HVSw0nTReNSFwJgkCjkbjwOS5hXy-7WVzDHlxAbdIkHQIVwWHt22YRDKJAuk_zABPZMKXvC2-g16j3z4KVYPuJ7xgZuDdezT9si0TKBeZ2lS7wNT4dXeJ1abt-oOv06w1YlscMKig3L4G6Vbwz9ehaY7EhA9yXxRw_Fyx3Iv9y4ryXJYGhTJUN7n61MzhJmyqnkOw2x7U6F-yw",
         "types" : [ "cafe", "food", "establishment" ]
      },
      {
         "formatted_address" : "日本, 東京都渋谷区宇田川町**********",
         "geometry" : {
            "location" : {
               "lat" : 35.662249,
               "lng" : 139.69551
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/cafe-71.png",
         "id" : "54a323cfcaab07e75269324942da33604434d1b2",
         "name" : "カフエ ***** 渋谷店",
         "opening_hours" : {
            "open_now" : true
         },
         "photos" : [
            {
               "height" : 853,
               "html_attributions" : [],
               "photo_reference" : "CoQC-wAAANaUZDFBM1vcgeD7Nz3Qm668CFbQwbsxHe4TOlKipHCTrCc-e0Uu6eELescVdV57X5KhuL6n5s-BH3ViF4-KL7V_C5VW-4mpfNU-swDQpvPDkgvfFzKCKvrBF8_8rcL6wkHv2bC8E7nN6O0mYhZpjXyO5fxNLsHKJmjEBS0YnqFGKJKY04lsnvOHKhXBzNGVWZpf1QM4seRsV97o4EuINKQ_TZ5Hx-rPS4sIt-7K7yis0AGJvGj8EHI_48mTjvmCKcZuH6AhXiDsbxqu2j2t8i0hvPmHYOXcTL17-Q40rRiIAiQFIvavK2IIa2NVCCQVe_Hj65ATLfpZuOcSQltuAUwSEKNi8fLqeiFWtgEbqmHk0_saFBclFLUDPM2yWQt6i57yzm_slVmL",
               "width" : 1280
            }
         ],
         "rating" : 4.1,
         "reference" : "CoQBfQAAAGkUh8-vFldUs6xEA1tFyuF9sk49Xxos_h7FqARyVaBJ1gtiwRyA-wfDxNJVgN0pmOHkNe1LgJq4Tx-8Q-1duO5zz3E8YWCtNGxPuMwKxrVPYczzEEXWYu46Z0r2KfncdxF-UFu_ej1w24MW9vX7LGHZv3VDwy0CsOMs9MMOOVvlEhClHH6RaYTNHngU3_fZ0SBTGhRXY5c2vjgHze0Kk3KSoz36FqTaAw",
         "types" : [ "cafe", "food", "establishment" ]
      },

詳細

以下が、スポット詳細のレスポンス。

結構、口コミが入ってる。

{
   "debug_info" : [],
   "html_attributions" : [],
   "result" : {
      "address_components" : [
         {
            "long_name" : "************",
            "short_name" : "****************",
            "types" : [ "street_number" ]
         },
         {
            "long_name" : "吉祥寺本町",
            "short_name" : "吉祥寺本町",
            "types" : [ "sublocality", "political" ]
         },
         {
            "long_name" : "武蔵野市",
            "short_name" : "武蔵野市",
            "types" : [ "locality", "political" ]
         },
         {
            "long_name" : "東京都",
            "short_name" : "東京都",
            "types" : [ "administrative_area_level_1", "political" ]
         },
         {
            "long_name" : "JP",
            "short_name" : "JP",
            "types" : [ "country", "political" ]
         },
         {
            "long_name" : "180-0004",
            "short_name" : "180-0004",
            "types" : [ "postal_code" ]
         }
      ],
      "formatted_address" : "日本, 東京都武蔵野市吉祥寺本町******* 吉祥寺*************ビルB1",
      "formatted_phone_number" : "****-**-****",
      "geometry" : {
         "location" : {
            "lat" : 35.704155,
            "lng" : 139.580957
         }
      },
      "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png",
      "id" : "6db8f62cc9dc7dba17f116dc2d4e293287d1c9ad",
      "international_phone_number" : "+81 422-23-8186",
      "name" : "******* 吉祥寺店",
      "opening_hours" : {
         "open_now" : true,
         "periods" : [
            {
               "close" : {
                  "day" : 1,
                  "time" : "0400"
               },
               "open" : {
                  "day" : 0,
                  "time" : "1100"
               }
            },
・・・略・・・・
         ]
      },
      "photos" : [
         {
            "height" : 1280,
            "html_attributions" : [],
            "photo_reference" : "CvQB5gAAADqSlV9t5qcineEXNlM_l9g8QL2pXytf04kS_39AUmWyv07OI7dPwJMiW-2kLU6JuDRJRn1v4sOGOL8bVeVxs1gVssLDxL5G7XR3c9wNBGR2aUlJqZ6WqZUZDZDhZ-f57GnfvzHrZVofHH80rvXsz-DXwO-8EfVYHgx1peO5MVakwtktLDqjo0ZziTeeXdmxdBHrbdxDp9PdPnTxEqrn36I2pxP0SK6L0sB1j-wUxQKRDbQz_Pd9AuG141lc8_ripH38CcltIeMN7OYkHaMduMsdpF9zrUSidukRnsIzaPS7wQvm_6UcpvrsUiqkwbb6HhIQzdIh8EwdByLz8Sekmp3wYxoUyiywg67HD-XRIDvHoNNQRPUD22Y",
            "width" : 853
         },
・・・略・・・・
      ],
      "price_level" : 1,
      "rating" : 3.7,
      "reference" : "CoQBdAAAAFiU51mR7ZPeCxa_13OUoLtgW49WW6MH81a-4UoTLK6hexnEuoaKqYjGosDIHgyvaiewSd5csp73yn7Bzln5ZQsvgrJw6prhvYw9shgak1lqDrn59KgP8YUhIy3u9ONnL2ULlD1omomYJ9l7DYtF4hAdoxsO2bPrIq-hizNWqcYgEhC_t8Q99QQ39iC61-TetPiIGhSPJvCtv3lJCqYEKVMBBOYXSUhxvA",
      "reviews" : [
         {
            "aspects" : [
               {
                  "rating" : 3,
                  "type" : "food"
               },
               {
                  "rating" : 2,
                  "type" : "decor"
               },
               {
                  "rating" : 2,
                  "type" : "service"
               }
            ],
            "author_name" : "*********",
            "author_url" : "https://plus.google.com/********************",
            "text" : "*************************このお店のラーメンはハマる。",
            "time" : 1370669370
         },
・・・略・・・・
      ],
      "types" : [ "restaurant", "food", "establishment" ],
      "url" : "https://plus.google.com/**************************/about?hl=ja",
      "utc_offset" : 540,
      "vicinity" : "武蔵野市吉祥寺本町*************** 吉祥寺**********ビルB1",
      "website" : "http://*******************"
   },
   "status" : "OK"