RubyでGoogle Maps Places APIを使おう

Webサービス開発

こんにちは。
この記事ではRubyを使ってGoogle Maps Places APIでスポットを検索する方法を紹介します。

このプロジェクトの完成形はmizucoffee/gmap_sampleにあります。
記事と合わせてご覧ください。

Sponsored Links

下準備

APIキーの用意

まずは、Google Cloud PlatformでAPIキーを作成していきましょう。
プロジェクトはすでにあるものを使用します。無い場合は作ってください。


Google Cloud Consoleの上の検索窓にplaceと入力し、「Places API」を選びます。


開いたページにある「有効にする」をクリックします。


API画面が表示されたら、左にある「認証情報」をクリックします。


Credentials画面は表示されたら、ページ上部にある「認証情報を作成」の中の「API キー」を選択します。


しばらくするとAPIキーが発行され、表示されるので控えておきましょう。

ライブラリの導入

まずはライブラリをインストールしましょう。
今回導入するのはGoogle Maps Places APIのライブラリであるgoogle_placesと.envファイルの読み込みをしてくれるdotenvです。
Gemfileに以下を追記します。

gem 'dotenv'
gem 'google_places'

続いて.envファイルにAPI_KEYを記述していきます。
.envフォルダをプロジェクトルートに新しく作り、以下のように書きましょう。

API_KEY=先程コピーしたAPIキー

最後にGoogle Maps Places APIを使うにあたって必要なコードを書きます。

Dotenv.load
client = GooglePlaces::Client.new ENV['API_KEY']

1行目で.envファイルを読み込み、2行目で.envに記述されているAPI_KEYを元にライブラリを初期化しています。

これでAPIを呼び出す準備は完了です!

実際にAPIを呼び出してみよう!

周辺のスポットを検索

client.spots(34.7055051, 135.4983028)

このように書くと、緯度34.7055051、経度135.4983028周辺のスポットを検索してくれます。デフォルトだと20件取得します。
この関数の結果は配列で帰ってくるので、eachなどで繰り返す事で列挙することが出来ます。

client.spots(34.7055051, 135.4983028).each do |spot| 
    puts spot.name
end

例えばこのようにスポット名をputsするようにすると

$ ruby app.rb
Osaka
Hotel Granvia Osaka
Hilton Osaka
Hotel Monterey Osaka
Hanshin Department Store Umeda Main Store
HANKYU Umeda Store
Yukinoshita Umeda honten
TORAYA Hankyu Umeda Store
LUXE Tajimaya
Osaka Umeda OS hotel
Toyoko INN Umeda Nakatsu 1
串かつ料理 活 阪急グランドビル店
IL PINOLO
Tokyu Hands Umeda
InterContinental Osaka, an IHG Hotel
Hotel Hankyu International
スカイダイニング&バーラウンジ トップサーティ
Capsule Hotel Daitoyo
ラグナヴェールプレミア
Kita Ward

といった出力になります。
現時点では英語なので、日本語に設定してみましょう。

client.spots(34.7055051, 135.4983028, :language => 'ja')

このように書く事で、日本語にすることが出来ます。先程のコードを実行して結果を見てみると

$ ruby app.rb
大阪市
ホテルグランヴィア大阪
ヒルトン大阪
ホテルモントレ大阪
阪神梅田本店
阪急うめだ本店
雪ノ下梅田本店
とらや 梅田阪急店
LUXE Tajimaya
梅田OSホテル
東横INN梅田中津1
串かつ料理 活 阪急グランドビル店
イルピノーロ 梅田
東急ハンズ 梅田店
インターコンチネンタルホテル大阪
ホテル阪急インターナショナル
スカイダイニング&バーラウンジ トップサーティ
サウナ&スパ カプセルホテル 大東洋
ラグナヴェールプレミア
北区

きちんと日本語の検索結果になりました。

タイプで絞り込む

Places APIではGoogle Mapsに登録されているタイプでフィルタリングすることが出来ます。

client.spots(34.7055051, 135.4983028, :language => 'ja', :type='cafe')

例えばこのように書くと、周辺のカフェのみが返ってきます。

$ ruby app.rb
XEX WEST(ゼックス ウエスト)
ビランチャ 梅田店
ア・ラ・カンパーニュ大阪茶屋町店
レストラン愛
プロント 新梅田食道街店
DEAN & DELUCA 大阪
cafe太陽ノ塔 GREEN WEST店
ブルーバード 梅田阪急ビルオフィスタワー店
カフェ&バー グーテ
ロカンダ
リバーヘッド【ホテルグランヴィア大阪】
KIEFEL 阪急三番街店
カフェ英國屋 阪急グランドビル店
ピピネラキッチン
蘭館珈琲ハウス 大丸梅田店
アフタヌーンティー・ティールーム 阪急うめだ本店
MARNI FLOWER CAFÉ
神戸ベル 阪急三番街店
マザーリーフ ディアモールフィオレ店
ドトールコーヒーショップ 梅田シティ店

いい感じにカフェが取得できていますね!
Place Typesページに詳しいタイプの一覧があるので一度目を通しておくと便利だと思います。

単語で検索する

Places APIではGoogle Mapsと同じように単語で検索することが出来ます。

client.spots(34.7055051, 135.4983028, :language => 'ja', :name='ラーメン')

とすると

$ ruby app.rb
総大醤
二代目はまぐりラーメン しえる
貝汁はまぐりラーメンの美味い店 上海
ラーメン大学 梅田店
らーめん Ciel
平和
セイマル中華そば
らーめん香澄 中崎町店
らーめん 弥七
らーめん亀王 阪急東通り店
麺や 輝 中津店
ペペラーメン
ラーメンまこと屋 福島店
らーめん伊藝
横浜家系ラーメン 町田商店 北新地店
ラーメン横綱 阪急三番街店
ラーメン西松家
神虎 大阪駅前ビル店
らいよはうす
こってり

このようにラーメンに関連するお店が一覧で出てきました!

情報の取得

client.spots(34.7055051, 135.4983028, :language => 'ja', :name='ラーメン').each do |spot| 
    puts spot.name
end

今まで、このコードでお店の名前を表示していました。
スポットにはもちろん名前以外の情報も入っています。ここで一通り見てみましょう。

client.spots(34.7055051, 135.4983028, :language => 'ja', :name='ラーメン')[0].inspect
#<GooglePlaces::Spot:0x0000000003575528
@json_result_object={"business_status"=>"OPERATIONAL", "geometry"=>{"location"=>{"lat"=>34.710284, "lng"=>135.507706}, "viewport"=>{"northeast"=>{"lat"=>34.71164007989272, "lng"=>135.5091096298927}, "southwest"=>{"lat"=>34.70894042010728,"lng"=>135.5064099701073}}}, "icon"=>"https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/restaurant-71.png", "name"=>"総大醤", "opening_hours"=>{"open_now"=>true}, "photos"=>[{"height"=>3000, "html_attributions"=>["<a href=\"https://maps.google.com/maps/contrib/118375267921845555309\">利之霧渡</a>"], "photo_reference"=>"ATtYBwLLMBhJ_gm3PGnzw1j4YYkZlox9oK1ul76D0fY0zaveles-27KYZmc3VpIx1fEpNL5YdE_8en8F7u_UYIEdpRQAiik49o4hyLpFGeAZDi11N9uVhCHbnlosFm7pEm-SBBGutkK2f2PoxR_ffUT1-BfHw5QLFcpJJYy_xSUGGeaMHd7C", "width"=>5333}], "place_id"=>"ChIJC2Pfw73mAGARkdMg82J6N3o", "plus_code"=>{"compound_code"=>"PG65+43 大阪市、大阪府", "global_code"=>"8Q6QPG65+43"}, "price_level"=>3, "rating"=>4.1, "reference"=>"ChIJC2Pfw73mAGARkdMg82J6N3o", "scope"=>"GOOGLE", "types"=>["restaurant", "food", "point_of_interest", "establishment"], "user_ratings_total"=>1034, "vicinity"=>"大阪市北区浮田2丁目4−16"},
@reference="ChIJC2Pfw73mAGARkdMg82J6N3o",
@place_id="ChIJC2Pfw73mAGARkdMg82J6N3o",
@vicinity="大阪市北区浮田2丁目4−16",
@lat=34.710284,
@lng=135.507706,
@viewport={"northeast"=>{"lat"=>34.71164007989272, "lng"=>135.5091096298927}, "southwest"=>{"lat"=>34.70894042010728, "lng"=>135.5064099701073}},
@name="総大醤",
@icon="https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/restaurant-71.png",
@types=["restaurant", "food", "point_of_interest", "establishment"],
@id=nil,
@formatted_phone_number=nil,
@international_phone_number=nil,
@formatted_address=nil,
@address_components=nil,
@street_number=nil,
@street=nil,
@city=nil,
@region=nil,
@postal_code=nil,
@country=nil,
@rating=4.1,
@price_level=3,
@opening_hours={"open_now"=>true},
@url=nil,
@cid=0,
@website=nil,
@zagat_reviewed=nil,
@zagat_selected=nil,
@aspects=[],
@review_summary=nil, 
@photos=[#<GooglePlaces::Photo:0x0000000003575280 @width=5333, @height=3000, @photo_reference="ATtYBwLLMBhJ_gm3PGnzw1j4YYkZlox9oK1ul76D0fY0zaveles-27KYZmc3VpIx1fEpNL5YdE_8en8F7u_UYIEdpRQAiik49o4hyLpFGeAZDi11N9uVhCHbnlosFm7pEm-SBBGutkK2f2PoxR_ffUT1-BfHw5QLFcpJJYy_xSUGGeaMHd7C", @html_attributions=["<a href=\"https://maps.google.com/maps/contrib/118375267921845555309\">利之霧渡</a>"],
@api_key="">],
@reviews=[],
@nextpagetoken=nil,
@events=[],
@utc_offset=nil,
@permanently_closed=nil>

ざっと見た感じ、店名や住所に緯度経度、★評価や現在営業しているかどうか、お店の写真を取得することができるようです!

最後に

この記事では、基本的な検索方法について紹介してきましたが、半径を指定した検索や、複数の条件を組み合わせた検索、スポットの詳細情報の取得や写真の取得などGoogle Maps Places APIはまだまだいろんな事が出来ます!
今回使用したライブラリについては公式のREADMEがわかりやすく纏まっているので、詳しく知りたい方はぜひ見てみてください!