概要
- Google place_idからプレイス詳細情報を取り出すために自作したrubyのクラス
事前準備
- ruby: 2.3.1(digメソッドを使っているため、2.3以上必須)
- Google Places API Web Serviceにアクセス出来るAPIキーを取得済みである
- Gem: httpclientを導入済みである
使い方
- irbを使って説明します。
-
google_placeid_detail.rbをloadで読み込む
- 文末のgoogle_placeid_detail.rbのコードをカレントディレクトリに保存している事を想定しています
$ irb > load './google_placeid_detail.rb'
-
オブジェクト作成
> placeid_info = GooglePlaceidDetail.new
-
apikeyを設定
- YOUR_API_KEYは自分のAPIKEYを入力してください
> placeid_info.apikey = 'YOUR_API_KEY'
- apikeyは、こちらの文末の「キーを取得」をクリックして取得してください。
-
place_idデータ取得
-
place_idを引数としてplace_idデータを取得する
> placeid_info.create('ChIJDZcTCXeLGGARU7MVy39Gw8w')
place_idがわからない場合は、こちらから検索してください。
-
-
キーに対応する値を取り出す
-
キーを引数として値を取り出す
> 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を拡張してください。