0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

`rails db:seed`でGoogle Places APIを使用して、取得したレストラン一覧をDBに保存する方法

Posted at

開発環境

  • Rails 8
  • Ruby 3.3.6
  • Postgresql 14.14

読んで欲しい人

  • Google Places APIってどんな感じで使うんだろう、と軽く知りたい人
  • 過去の自分

Google Places APIってなに

Places API は、位置情報に関する HTTP リクエストを受け付けるサービスです

概要  |  Places API  |

簡単にいうと

Googleのデータベースにある、さまざまな施設情報やスポット情報を検索、取得できるAPIです

Google Places APIを使う準備

APIキーの取得

API_keyを取得します

https://developers.google.com/maps/documentation/places/web-service/get-api-key?hl=ja&_gl=1*1xjo822*_up*MQ..*_ga*MTg0MTcyMTc5OS4xNzM2MjQ4Mjgx*_ga_NRWSTWS78N*MTczNjI0ODI4MC4xLjEuMTczNjI0ODI4MS4wLjAuMA..

APIキーをcredentialに保存

下記で、credentials.yml.encを編集します

$ EDITOR="vi" bin/rails credentials:edit

キーボードiを押して編集モードに

credentials.yml.enc
google:
  api_key: # 取得したapi_keyをここに保存する

escキーを押し、:wqで保存して閉じます。

そうするとRails.application.credentials.google.api_keyでapi_keyを表示することができます。

gem 'google_places'をダウンロードする

gemfilegoogle_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,

引数に現在地の緯度、経度を入れて遊んでみてください

現在地の緯度と経度を出してくれるWebサイト

他にも色々な遊び方があります

client.spots(-33.8670522, 151.1957362, :types => 'restaurant')

これはスポットのタイプをレストランに限定して検索をかけてくれます

client.spots_by_query('東京駅')

これは特定のキーワードや名前でスポット検索をしてくれるメソッドです

取得した情報をseeds.rbに書き込んで、DBに保存してみる

今回はshopsテーブルを作成してみました

schema.rb
  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には下記のように記述しました

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を利用できて楽しい

参考

https://developers.google.com/maps?hl=ja&_gl=1*qcw7yl*_up*MQ..*_ga*MTYyNDg1MTgzNi4xNzM2MjQ5MTM0*_ga_NRWSTWS78N*MTczNjI1MTEyMC4yLjEuMTczNjI1MTEzMS4wLjAuMA..

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?