Google Place APIの詳細検索を使って返ってきたJSON形式のデータを、キーの中身からデータを指定して表示させたいです。
以下においてtypesのstreet_number、route、locality、administrative_area_level_2、administrative_area_level_1を含む部分のlong_nameをそれぞれ表示させたいです。
{ "result" : { "address_components" : [ { "long_name" : "32", "short_name" : "32", "types" : [ "street_number" ] }, { "long_name" : "The Promenade", "short_name" : "The Promenade", "types" : [ "route" ] }, { "long_name" : "Sydney", "short_name" : "Sydney", "types" : [ "locality", "political" ] }, { "long_name" : "Council of the City of Sydney", "short_name" : "Sydney", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "New South Wales", "short_name" : "NSW", "types" : [ "administrative_area_level_1", "political" ] }, { "long_name" : "オーストラリア", "short_name" : "AU", "types" : [ "country", "political" ] }, { "long_name" : "2000", "short_name" : "2000", "types" : [ "postal_code" ] } ], } }
最初は以下のようにして表示させたのですが、複数のデータを扱う際にstreet_number等の小さい単位のキーがない場合があり、配列の順番の関係で項目ごとに表示できずずれてしまうので、typesの中身で指定したいです。(nilの時はif文などで表示させないようにする予定です)
ruby
1place_detail = detail['result'] 2address = place_detail['address_components'] 3answer = { 4 street_number:address[0]['long_name'], 5 route:address[1]['long_name'], 6 locality:address[2]['long_name'], 7 area_level_2:address[3]['long_name'], 8 area_level_1:address[4]['long_name'] 9}
よろしくお願いします。
追記
ruby
1require 'net/https' 2require 'uri' 3require 'json' 4 5API_KEY = 'Your API Key' 6 7lat = '3.1528496' 8lng = '101.7015546' 9rad = '50000' 10 11# types = 'train_station' 12# types = 'university' 13# types = 'school' 14# types = 'shopping_mall' 15# types = 'hospital' 16types = 'bus_station' 17# types = 'subway_station' 18# types = 'department_store' 19 20 21language = 'en' 22 23uri = URI.parse "https://maps.googleapis.com/maps/api/place/radarsearch/json?location=#{lat},#{lng}&radius=#{rad}&types=#{types}&language=en&key=#{API_KEY}" 24 25request = Net::HTTP::Get.new(uri.request_uri) 26response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http| 27 http.request(request) 28end 29 30body = JSON.parse response.body 31results = body['results'] 32 33results.each do |result| 34 place_id = result['place_id'] 35 36 uri2 = URI.parse "https://maps.googleapis.com/maps/api/place/details/json?placeid=#{place_id}&language=en&key=#{API_KEY}" 37 38 request = Net::HTTP::Get.new(uri2.request_uri) 39 response = Net::HTTP.start(uri2.host, uri2.port, use_ssl: uri2.scheme == 'https') do |http| 40 http.request(request) 41 end 42 43 detail = JSON.parse response.body 44 place_detail = detail['result'] 45 location = place_detail['geometry']['location'] 46 address = place_detail['address_components'] 47 check_items = ["street_number", "route", "locality", "administrative_area_level_2", "administrative_area_level_1"] 48 place = {} 49 50 answer = { 51 name:place_detail['name'], 52 lat: location['lat'], 53 lng:location['lng'], 54 address:place_detail['formatted_address'], 55 types:place_detail['types'] 56 } 57 address.each do |element| 58 result = element["types"] & check_items 59 next if result.empty? 60 place[result[0]] = element["long_name"] 61 end 62 63 File.open('./place.json', 'a') do |file| 64 file.puts JSON.pretty_generate(answer) 65 end 66end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/11 03:10
2017/09/11 03:17 編集
2017/09/11 03:21
2017/09/11 04:32
2017/09/11 06:17
2017/09/11 06:37