開発環境
- Rails 8
- Ruby 3.3.6
- Postgresql 14.14
読んで欲しい人
- Google Places APIってどんな感じで使うんだろう、と軽く知りたい人
- 過去の自分
Google Places APIってなに
Places API は、位置情報に関する HTTP リクエストを受け付けるサービスです
簡単にいうと
Googleのデータベースにある、さまざまな施設情報やスポット情報を検索、取得できるAPIです
Google Places APIを使う準備
APIキーの取得
API_keyを取得します
APIキーをcredentialに保存
下記で、credentials.yml.enc
を編集します
$ EDITOR="vi" bin/rails credentials:edit
キーボードi
を押して編集モードに
google:
api_key: # 取得したapi_keyをここに保存する
esc
キーを押し、:wq
で保存して閉じます。
そうするとRails.application.credentials.google.api_key
でapi_keyを表示することができます。
gem 'google_places'をダウンロードする
gemfile
にgoogle_places
をインストールします
gem 'google_places'
gem 'google_places'ってなんのgem?
Google Place APIとやり取りをするためのRuby用のGemです
RubyコードからAPIを操作するためには必要す
これでPlace APIを使う準備ができました。
Consoleで遊んでみる
試しにrails c
コマンドで遊んでみます。
client = GooglePlaces::Client.new(Rails.application.credentials.google.api_key)
最初に、APIクライアントのインスタンスを作成してあげます
client.spots(-33.8670522, 151.1957362)
作成したインスタンスからspots
を使用して、第一引数には緯度、第二引数には経度を渡してあげます。
そうすると下記のように大量のデータが返されます
sample-app(dev)> client = GooglePlaces::Client.new(Rails.application.credentials.google.api_key)
{"geometry"=>
{"location"=>{"lat"=>-33.8688197, "lng"=>151.2092955},
"viewport"=>{"northeast"=>{"lat"=>-33.57814094522021, "lng"=>151.3430209458699}, "southwest"=>{"lat"=>-34.11834699888443, "lng"=>150.5209286026224}}},
"icon"=>"https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/geocode-71.png",
"icon_background_color"=>"#7B9EB0",
"icon_mask_base_uri"=>"https://maps.gstatic.com/mapfiles/place_api/icons/v2/generic_pinlet",
"name"=>"Sydney",
"photos"=>
[{"height"=>2922,
"html_attributions"=>["<a href=\"https://maps.google.com/maps/contrib/103312383445637053560\">Elena Gallo</a>"],
"photo_reference"=>
"AWYs27zT9yl3rip6iCEDg_Ejx1Iw01vwsaPj1oJve8UJnTQoEC2DM57q019uUgChOJ9EQvvl-6gHCy2OPM2fzfU2YV0RAt9T9vqOLg1Dx2yeveFJp-hsBVy3PIwWDx734wj1r3aZLsrKTUyRcXJPxDWC_Oryb19WyAy0hVagS7_QjknLRQg1",
"width"=>4344}],
"place_id"=>"ChIJP3Sa8ziYEmsRUKgyFmh9AQM",
"reference"=>"ChIJP3Sa8ziYEmsRUKgyFmh9AQM",
"scope"=>"GOOGLE",
"types"=>["colloquial_area", "locality", "political"],
"vicinity"=>"Sydney"},
@lat=-33.8688197,
@lng=151.2092955,
引数に現在地の緯度、経度を入れて遊んでみてください
他にも色々な遊び方があります
client.spots(-33.8670522, 151.1957362, :types => 'restaurant')
これはスポットのタイプをレストランに限定して検索をかけてくれます
client.spots_by_query('東京駅')
これは特定のキーワードや名前でスポット検索をしてくれるメソッドです
取得した情報をseeds.rbに書き込んで、DBに保存してみる
今回はshopsテーブルを作成してみました
create_table "shops", force: :cascade do |t|
t.string "name", null: false
t.string "place_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["place_id"], name: "index_shops_on_place_id", unique: true
end
※ place_id
というのはapiから返される、placeの一意のidです
seeds.rbには下記のように記述しました
client = GooglePlaces::Client.new(Rails.application.credentials.google.api_key)
spots = client.spots(任意の緯度, 任意の経度, radius: 500, types: 'restaurant', language: 'ja')
spots.each do |spot|
next unless spot
Shop.create!(
name: spot.name,
place_id: spot.place_id
)
end
-
radius
: 半径をm単位 -
language
: 言語の指定
rails db:seed
を実行してあげる、終了
感想
-
place_id
が一意って本当なんすかね、とんでもないすね - 割と簡単にAPIを利用できて楽しい
参考