LoginSignup
1
3

More than 5 years have passed since last update.

Google Places API Web Serviceのプレイス詳細リクエストから情報を取り出す

Last updated at Posted at 2017-03-20

概要

事前準備

  • ruby: 2.3.1(digメソッドを使っているため、2.3以上必須)
  • Google Places API Web Serviceにアクセス出来るAPIキーを取得済みである
  • Gem: httpclientを導入済みである

使い方

  • irbを使って説明します。
  1. google_placeid_detail.rbをloadで読み込む

    • 文末のgoogle_placeid_detail.rbのコードをカレントディレクトリに保存している事を想定しています
    $ irb
    > load './google_placeid_detail.rb' 
    
  2. オブジェクト作成

    > placeid_info = GooglePlaceidDetail.new
    
  3. apikeyを設定

    • YOUR_API_KEYは自分のAPIKEYを入力してください
    > placeid_info.apikey = 'YOUR_API_KEY'
    
    • apikeyは、こちらの文末の「キーを取得」をクリックして取得してください。
  4. place_idデータ取得

    • place_idを引数としてplace_idデータを取得する

      > placeid_info.create('ChIJDZcTCXeLGGARU7MVy39Gw8w')
      
    • place_idがわからない場合は、こちらから検索してください。

  5. キーに対応する値を取り出す

    • キーを引数として値を取り出す

      > placeid_info.get('status')
      => "OK" 
      > placeid_info.get('name')
      => "グーグル合同会社"
      > placeid_info.get('formatted_address')
      => "日本, 〒106-6126 東京都港区六本木6丁目10−1 六本木ヒルズ森タワー"
      
    • prefectureとcityというキーは存在しませんが、対応する値にアクセス出来るようにしています。

      > placeid_info.get('prefecture')
      => "東京都"
      > placeid_info.get('city')
      => "港区"
      
    • lat(lngも同様)は3種類ありますが、location_latやviewport_northeast_latやviewport_southwest_latとすることでアクセス出来ます。

      > placeid_info.get('location_lat')
      => 35.660411
      > placeid_info.get('viewport_northeast_lat')
      => 35.6617599802915
      > placeid_info.get('viewport_southwest_lat')
      => 35.6590620197085
      
    • なおlat, lngは、location_latとlocation_lngと同じです。

      > placeid_info.get('location_lat')
      => 35.660411
      > placeid_info.get('lat')
      => 35.660411
      > placeid_info.get('location_lng')
      => 139.729265
      > placeid_info.get('lng')
      => 139.729265
      
      

google_placeid_detail.rb

google_placeid_detail.rb
require 'json'
require 'httpclient'

class GooglePlaceidDetail
  attr_accessor :apikey, :placeid, :language, :placeid_response
  GSEARCHURL = 'https://maps.googleapis.com/maps/api/place/details/json'.freeze
  DEFAULTAPIKEY = 'YOUR_APIKEY'.freeze

  def initialize(options = {})
    @apikey = options[:apikey] || DEFAULTAPIKEY
    @placeid = options[:placeid]
    @language = options[:language] || 'ja'
    create(@placeid) if @placeid
  end

  # pladeidにひもづく詳細データをAPIで取得する
  def create(placeid = @placeid)
    client = HTTPClient.new(default_header: { 'Accept-Language' => @language })
    response = client.get(GSEARCHURL,
                          query: {
                            placeid: placeid,
                            languqage: @language,
                            key: @apikey
                          })
    sleep(1)
    @placeid_response = JSON.load(response.body)
    self
  end

  # キー(key)に対応した値(value)を詳細データ(placeid_response)から取り出す
  def get(key = nil, placeid_response = @placeid_response)
    if placeid_response.nil?
      p 'Please .create(place_id)'
      return
    end
    return nil if key.nil?
    value = case key
            when 'status'
              placeid_response.dig(key)
            when 'location_lat', 'lat'
              placeid_response.dig('result', 'geometry', 'location', 'lat')
            when 'location_lng', 'lng'
              placeid_response.dig('result', 'geometry', 'location', 'lng')
            when 'viewport_northeast_lat'
              placeid_response.dig('result', 'geometry', 'viewport', 'northeast', 'lat')
            when 'viewport_northeast_lng'
              placeid_response.dig('result', 'geometry', 'viewport', 'northeast', 'lng')
            when 'viewport_southwest_lat'
              placeid_response.dig('result', 'geometry', 'viewport', 'southwest', 'lat')
            when 'viewport_southwest_lng'
              placeid_response.dig('result', 'geometry', 'viewport', 'southwest', 'lng')
            when 'postal_code', 'country', 'ward', 'administrative_area_level_2', 'route', 'street_number', 'floor', 'sublocality_level_1', 'sublocality_level_2', 'sublocality_level_3', 'sublocality_level_4', 'sublocality_level_5'
              address_component = placeid_response['result']['address_components'].select { |a| a['types'].include?(key) }
              address_component[0]['long_name'] unless address_component.empty?
            when 'administrative_area_level_1', 'prefecture'
              address_component = placeid_response['result']['address_components'].select { |a| a['types'].include?('administrative_area_level_1') }
              address_component[0]['long_name'] unless address_component.empty?
            when 'city'
              address_component = placeid_response['result']['address_components'].select { |a| a['types'].include?('locality') && !a['types'].include?('ward') }
              address_component[0]['long_name'] unless address_component.empty?
            when 'open_now', 'weekday_text'
              placeid_response.dig('result', 'opening_hours', key)
            else
              placeid_response.dig('result', key)
            end
    value
  end
end

解説

  • initializeでインスタンス変数を設定します。
    • なお、GooglePlaceidDetail.new(apikey: 'YOUR_API_KEY', placeid: 'PLACEID')とするとcreate('PLACEID')も実行します。
  • create('PLACEID')でplaceidの詳細情報をハッシュで取得します。
  • get('KEY')でplaceidの詳細情報からKEYに対応する値にアクセス出来ます。
    • reviews, photos, opening_hoursのサブカテゴリへのKEYによる直接アクセスは対応していません。
    • 必要ならば、.placeid_responseでハッシュにアクセスするか、もしくはwhen 'postal_code' ... の箇所を参考にキーに対応するコードを追加するなど#getを拡張してください。
1
3
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
1
3