google_maps_service 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +3 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE +202 -0
- data/README.md +132 -0
- data/Rakefile +12 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/google_maps_service.gemspec +30 -0
- data/lib/google_maps_service.rb +21 -0
- data/lib/google_maps_service/client.rb +226 -0
- data/lib/google_maps_service/convert.rb +227 -0
- data/lib/google_maps_service/directions.rb +93 -0
- data/lib/google_maps_service/distance_matrix.rb +85 -0
- data/lib/google_maps_service/elevation.rb +57 -0
- data/lib/google_maps_service/errors.rb +40 -0
- data/lib/google_maps_service/geocoding.rb +58 -0
- data/lib/google_maps_service/roads.rb +141 -0
- data/lib/google_maps_service/time_zone.rb +36 -0
- data/lib/google_maps_service/version.rb +3 -0
- metadata +215 -0
@@ -0,0 +1,93 @@
|
|
1
|
+
module GoogleMapsService
|
2
|
+
|
3
|
+
# Performs requests to the Google Maps Directions API.
|
4
|
+
module Directions
|
5
|
+
|
6
|
+
# Get directions between an origin point and a destination point.
|
7
|
+
#
|
8
|
+
# @param [String, Hash, Array] origin The address or latitude/longitude value from which you wish
|
9
|
+
# to calculate directions.
|
10
|
+
# @param [String, Hash, Array] destination The address or latitude/longitude value from which
|
11
|
+
# you wish to calculate directions.
|
12
|
+
# @param [String] mode Specifies the mode of transport to use when calculating
|
13
|
+
# directions. One of "driving", "walking", "bicycling" or "transit"
|
14
|
+
# @param [Array<String>, Array<Hash>, Array<Array>] waypoints Specifies an array of waypoints. Waypoints alter a
|
15
|
+
# route by routing it through the specified location(s).
|
16
|
+
# @param [Boolean] alternatives If True, more than one route may be returned in the
|
17
|
+
# response.
|
18
|
+
# @param [Array, String] avoid Indicates that the calculated route(s) should avoid the
|
19
|
+
# indicated features.
|
20
|
+
# @param [String] language The language in which to return results.
|
21
|
+
# @param [String] units Specifies the unit system to use when displaying results.
|
22
|
+
# "metric" or "imperial"
|
23
|
+
# @param [String] region The region code, specified as a ccTLD ("top-level domain"
|
24
|
+
# two-character value.
|
25
|
+
# @param [Integer, DateTime] departure_time Specifies the desired time of departure.
|
26
|
+
# @param [Integer, DateTime] arrival_time Specifies the desired time of arrival for transit
|
27
|
+
# directions. Note: you can't specify both departure_time and
|
28
|
+
# arrival_time.
|
29
|
+
# @param [Boolean] optimize_waypoints Optimize the provided route by rearranging the
|
30
|
+
# waypoints in a more efficient order.
|
31
|
+
# @param [String, Array<String>] transit_mode Specifies one or more preferred modes of transit.
|
32
|
+
# This parameter may only be specified for requests where the mode is
|
33
|
+
# transit. Valid values are "bus", "subway", "train", "tram", "rail".
|
34
|
+
# "rail" is equivalent to ["train", "tram", "subway"].
|
35
|
+
# @param [String] transit_routing_preference Specifies preferences for transit
|
36
|
+
# requests. Valid values are "less_walking" or "fewer_transfers"
|
37
|
+
#
|
38
|
+
# @return List of routes
|
39
|
+
def directions(origin: nil, destination: nil,
|
40
|
+
mode: nil, waypoints: nil, alternatives: false, avoid: nil,
|
41
|
+
language: nil, units: nil, region: nil, departure_time: nil,
|
42
|
+
arrival_time: nil, optimize_waypoints: false, transit_mode: nil,
|
43
|
+
transit_routing_preference: nil)
|
44
|
+
|
45
|
+
params = {
|
46
|
+
origin: _convert_waypoint(origin),
|
47
|
+
destination: _convert_waypoint(destination)
|
48
|
+
}
|
49
|
+
|
50
|
+
if mode
|
51
|
+
# NOTE(broady): the mode parameter is not validated by the Maps API
|
52
|
+
# server. Check here to prevent silent failures.
|
53
|
+
unless ["driving", "walking", "bicycling", "transit"].include?(mode)
|
54
|
+
raise ArgumentError, "Invalid travel mode."
|
55
|
+
end
|
56
|
+
params[:mode] = mode
|
57
|
+
end
|
58
|
+
|
59
|
+
if waypoints
|
60
|
+
waypoints = GoogleMapsService::Convert.as_list(waypoints)
|
61
|
+
waypoints = waypoints.map { |waypoint| _convert_waypoint(waypoint) }
|
62
|
+
waypoints = ["optimize:true"] + waypoints if optimize_waypoints
|
63
|
+
|
64
|
+
params[:waypoints] = GoogleMapsService::Convert.join_list("|", waypoints)
|
65
|
+
end
|
66
|
+
|
67
|
+
params[:alternatives] = "true" if alternatives
|
68
|
+
params[:avoid] = GoogleMapsService::Convert.join_list("|", avoid) if avoid
|
69
|
+
params[:language] = language if language
|
70
|
+
params[:units] = units if units
|
71
|
+
params[:region] = region if region
|
72
|
+
params[:departure_time] = GoogleMapsService::Convert.time(departure_time) if departure_time
|
73
|
+
params[:arrival_time] = GoogleMapsService::Convert.time(arrival_time) if arrival_time
|
74
|
+
|
75
|
+
if departure_time and arrival_time
|
76
|
+
raise ArgumentError, "Should not specify both departure_time and arrival_time."
|
77
|
+
end
|
78
|
+
|
79
|
+
params[:transit_mode] = GoogleMapsService::Convert.join_list("|", transit_mode) if transit_mode
|
80
|
+
params[:transit_routing_preference] = transit_routing_preference if transit_routing_preference
|
81
|
+
|
82
|
+
return get("/maps/api/directions/json", params)[:routes]
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
def _convert_waypoint(waypoint)
|
87
|
+
if waypoint.kind_of?(String)
|
88
|
+
return waypoint
|
89
|
+
end
|
90
|
+
return GoogleMapsService::Convert.latlng(waypoint)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module GoogleMapsService
|
2
|
+
|
3
|
+
# Performs requests to the Google Maps Distance Matrix API.
|
4
|
+
module DistanceMatrix
|
5
|
+
|
6
|
+
# Gets travel distance and time for a matrix of origins and destinations.
|
7
|
+
#
|
8
|
+
# @param [Array<String>, Array<Hash>, Array<Array>] origins One or more addresses and/or latitude/longitude values,
|
9
|
+
# from which to calculate distance and time. If you pass an address
|
10
|
+
# as a string, the service will geocode the string and convert it to
|
11
|
+
# a latitude/longitude coordinate to calculate directions.
|
12
|
+
# @param [Array<String>, Array<Hash>, Array<Array>] destinations One or more addresses and/or lat/lng values, to
|
13
|
+
# which to calculate distance and time. If you pass an address as a
|
14
|
+
# string, the service will geocode the string and convert it to a
|
15
|
+
# latitude/longitude coordinate to calculate directions.
|
16
|
+
# @param [String] mode Specifies the mode of transport to use when calculating
|
17
|
+
# directions. Valid values are "driving", "walking", "transit" or
|
18
|
+
# "bicycling".
|
19
|
+
# @param [String] language The language in which to return results.
|
20
|
+
# @param [String] avoid Indicates that the calculated route(s) should avoid the
|
21
|
+
# indicated features. Valid values are "tolls", "highways" or "ferries"
|
22
|
+
# @param [String] units Specifies the unit system to use when displaying results.
|
23
|
+
# Valid values are "metric" or "imperial"
|
24
|
+
# @param [Integer, DateTime] departure_time Specifies the desired time of departure.
|
25
|
+
# @param [Integer, DateTime] arrival_time Specifies the desired time of arrival for transit
|
26
|
+
# directions. Note: you can't specify both departure_time and
|
27
|
+
# arrival_time.
|
28
|
+
# @param [String, Array<String>] transit_mode Specifies one or more preferred modes of transit.
|
29
|
+
# This parameter may only be specified for requests where the mode is
|
30
|
+
# transit. Valid values are "bus", "subway", "train", "tram", "rail".
|
31
|
+
# "rail" is equivalent to ["train", "tram", "subway"].
|
32
|
+
# @param [String] transit_routing_preference Specifies preferences for transit
|
33
|
+
# requests. Valid values are "less_walking" or "fewer_transfers"
|
34
|
+
#
|
35
|
+
# @return matrix of distances. Results are returned in rows, each row
|
36
|
+
# containing one origin paired with each destination.
|
37
|
+
def distance_matrix(origins: nil, destinations: nil,
|
38
|
+
mode: nil, language: nil, avoid: nil, units: nil,
|
39
|
+
departure_time: nil, arrival_time: nil, transit_mode: nil,
|
40
|
+
transit_routing_preference: nil)
|
41
|
+
params = {
|
42
|
+
origins: _convert_path(origins),
|
43
|
+
destinations: _convert_path(destinations)
|
44
|
+
}
|
45
|
+
|
46
|
+
if mode
|
47
|
+
# NOTE(broady): the mode parameter is not validated by the Maps API
|
48
|
+
# server. Check here to prevent silent failures.
|
49
|
+
unless ["driving", "walking", "bicycling", "transit"].include?(mode)
|
50
|
+
raise ArgumentError, "Invalid travel mode."
|
51
|
+
end
|
52
|
+
params[:mode] = mode
|
53
|
+
end
|
54
|
+
|
55
|
+
params[:language] = language if language
|
56
|
+
|
57
|
+
if avoid
|
58
|
+
unless ["tolls", "highways", "ferries"].include?(avoid)
|
59
|
+
raise ArgumentError, "Invalid route restriction."
|
60
|
+
end
|
61
|
+
params[:avoid] = avoid
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
params[:units] = units if units
|
66
|
+
params[:departure_time] = convert.time(departure_time) if departure_time
|
67
|
+
params[:arrival_time] = convert.time(arrival_time) if arrival_time
|
68
|
+
|
69
|
+
if departure_time and arrival_time
|
70
|
+
raise ArgumentError, "Should not specify both departure_time and arrival_time."
|
71
|
+
end
|
72
|
+
|
73
|
+
params[:transit_mode] = convert.join_list("|", transit_mode) if transit_mode
|
74
|
+
params[:transit_routing_preference] = transit_routing_preference if transit_routing_preference
|
75
|
+
|
76
|
+
return get("/maps/api/distancematrix/json", params)
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def _convert_path(waypoints)
|
81
|
+
waypoints = GoogleMapsService::Convert.as_list(waypoints)
|
82
|
+
return GoogleMapsService::Convert.join_list("|", waypoints.map { |k| k.kind_of?(String) ? k : GoogleMapsService::Convert.latlng(k) })
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module GoogleMapsService
|
2
|
+
|
3
|
+
# Performs requests to the Google Maps Elevation API.
|
4
|
+
module Elevation
|
5
|
+
|
6
|
+
# Provides elevation data for locations provided on the surface of the
|
7
|
+
# earth, including depth locations on the ocean floor (which return negative
|
8
|
+
# values)
|
9
|
+
#
|
10
|
+
# @param [Array] locations A single latitude/longitude hash, or an array of
|
11
|
+
# latitude/longitude hash from which you wish to calculate
|
12
|
+
# elevation data.
|
13
|
+
#
|
14
|
+
# @return [Array] Array of elevation data responses
|
15
|
+
def elevation(locations: nil)
|
16
|
+
params = {}
|
17
|
+
if locations.kind_of?(Array) and locations.length == 2 and not locations[0].kind_of?(Array)
|
18
|
+
locations = [locations]
|
19
|
+
end
|
20
|
+
|
21
|
+
params[:locations] = _convert_locations(locations)
|
22
|
+
|
23
|
+
return get("/maps/api/elevation/json", params)[:results]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Provides elevation data sampled along a path on the surface of the earth.
|
27
|
+
#
|
28
|
+
# @param [String, Array] path A encoded polyline string, or a list of
|
29
|
+
# latitude/longitude tuples from which you wish to calculate
|
30
|
+
# elevation data.
|
31
|
+
#
|
32
|
+
# @param [Integer] samples The number of sample points along a path for which to
|
33
|
+
# return elevation data.
|
34
|
+
#
|
35
|
+
# @return [Array] Array of elevation data responses
|
36
|
+
def elevation_along_path(path: nil, samples: nil)
|
37
|
+
if path.kind_of?(String)
|
38
|
+
path = "enc:%s" % path
|
39
|
+
else
|
40
|
+
path = _convert_locations(path)
|
41
|
+
end
|
42
|
+
|
43
|
+
params = {
|
44
|
+
path: path,
|
45
|
+
samples: samples
|
46
|
+
}
|
47
|
+
|
48
|
+
return get("/maps/api/elevation/json", params)[:results]
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def _convert_locations(locations)
|
53
|
+
locations = GoogleMapsService::Convert.as_list(locations)
|
54
|
+
return GoogleMapsService::Convert.join_list("|", locations.map { |k| k.kind_of?(String) ? k : GoogleMapsService::Convert.latlng(k) })
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module GoogleMapsService
|
2
|
+
module Error
|
3
|
+
# Base error, capable of wrapping another
|
4
|
+
class BaseError < StandardError
|
5
|
+
attr_reader :response
|
6
|
+
|
7
|
+
def initialize(response)
|
8
|
+
@response = response
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# An exception that is raised if a redirect is required
|
13
|
+
class RedirectError < BaseError
|
14
|
+
end
|
15
|
+
|
16
|
+
# A 4xx class HTTP error occurred.
|
17
|
+
class ClientError < BaseError
|
18
|
+
end
|
19
|
+
|
20
|
+
# A 5xx class HTTP error occurred.
|
21
|
+
class ServerError < BaseError
|
22
|
+
end
|
23
|
+
|
24
|
+
# An API error occured.
|
25
|
+
class ApiError < BaseError
|
26
|
+
end
|
27
|
+
|
28
|
+
# Requiered query is missing
|
29
|
+
class InvalidRequestError < ApiError
|
30
|
+
end
|
31
|
+
|
32
|
+
# Over quota.
|
33
|
+
class RateLimitError < ApiError
|
34
|
+
end
|
35
|
+
|
36
|
+
# An unathorized error occurred. It might be caused by invalid key/secret or invalid access.
|
37
|
+
class RequestDeniedError < ApiError
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'google_maps_service/convert'
|
2
|
+
|
3
|
+
module GoogleMapsService
|
4
|
+
|
5
|
+
# Performs requests to the Google Maps Geocoding API.
|
6
|
+
module Geocoding
|
7
|
+
|
8
|
+
# Geocoding is the process of converting addresses
|
9
|
+
# (like +"1600 Amphitheatre Parkway, Mountain View, CA"+) into geographic
|
10
|
+
# coordinates (like latitude 37.423021 and longitude -122.083739), which you
|
11
|
+
# can use to place markers or position the map.
|
12
|
+
#
|
13
|
+
# @param [String] address The address to geocode.
|
14
|
+
# @param [Hash] components A component filter for which you wish to obtain a geocode,
|
15
|
+
# for example: `{ 'administrative_area': 'TX','country': 'US' }`
|
16
|
+
# @param [String, Hash] bounds The bounding box of the viewport within which to bias geocode
|
17
|
+
# results more prominently. Accept string or hash with northeast and southwest keys.
|
18
|
+
# @param [String] region The region code, specified as a ccTLD ("top-level domain")
|
19
|
+
# two-character value.
|
20
|
+
# @param [String] language The language in which to return results.
|
21
|
+
#
|
22
|
+
# @return Array of geocoding results.
|
23
|
+
def geocode(address: nil, components: nil, bounds: nil, region: nil, language: nil)
|
24
|
+
params = {}
|
25
|
+
|
26
|
+
params[:address] = address if address
|
27
|
+
params[:components] = GoogleMapsService::Convert.components(components) if components
|
28
|
+
params[:bounds] = GoogleMapsService::Convert.bounds(bounds) if bounds
|
29
|
+
params[:region] = region if region
|
30
|
+
params[:language] = language if language
|
31
|
+
|
32
|
+
return get('/maps/api/geocode/json', params)[:results]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Reverse geocoding is the process of converting geographic coordinates into a
|
36
|
+
# human-readable address.
|
37
|
+
#
|
38
|
+
# @param [Hash, Array] latlng The latitude/longitude value for which you wish to obtain the
|
39
|
+
# closest, human-readable address#
|
40
|
+
# @param [String, Array<String>] result_type One or more address types to restrict results to.
|
41
|
+
# @param [Array<String>] location_type One or more location types to restrict results to.
|
42
|
+
# @param [String] language The language in which to return results.
|
43
|
+
#
|
44
|
+
# @return Array of reverse geocoding results.
|
45
|
+
def reverse_geocode(latlng: nil, result_type: nil, location_type: nil, language: nil)
|
46
|
+
params = {
|
47
|
+
latlng: GoogleMapsService::Convert.latlng(latlng)
|
48
|
+
}
|
49
|
+
|
50
|
+
params[:result_type] = GoogleMapsService::Convert.join_list("|", result_type) if result_type
|
51
|
+
params[:location_type] = GoogleMapsService::Convert.join_list("|", location_type) if location_type
|
52
|
+
params[:language] = language if language
|
53
|
+
|
54
|
+
return get('/maps/api/geocode/json', params)[:results]
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
|
3
|
+
module GoogleMapsService
|
4
|
+
|
5
|
+
# Performs requests to the Google Maps Roads API."""
|
6
|
+
module Roads
|
7
|
+
|
8
|
+
# Base URL of Google Maps Roads API
|
9
|
+
ROADS_BASE_URL = "https://roads.googleapis.com"
|
10
|
+
|
11
|
+
# Snaps a path to the most likely roads travelled.
|
12
|
+
#
|
13
|
+
# Takes up to 100 GPS points collected along a route, and returns a similar
|
14
|
+
# set of data with the points snapped to the most likely roads the vehicle
|
15
|
+
# was traveling along.
|
16
|
+
#
|
17
|
+
# @param [] path The path to be snapped. A list of latitude/longitude tuples.
|
18
|
+
# :type path: list
|
19
|
+
#
|
20
|
+
# @param [] interpolate Whether to interpolate a path to include all points
|
21
|
+
# forming the full road-geometry. When true, additional interpolated
|
22
|
+
# points will also be returned, resulting in a path that smoothly
|
23
|
+
# follows the geometry of the road, even around corners and through
|
24
|
+
# tunnels. Interpolated paths may contain more points than the
|
25
|
+
# original path.
|
26
|
+
# :type interpolate: bool
|
27
|
+
#
|
28
|
+
# :rtype: A list of snapped points.
|
29
|
+
def snap_to_roads(path: nil, interpolate: false)
|
30
|
+
if path.kind_of?(Array) and path.length == 2 and not path[0].kind_of?(Array)
|
31
|
+
path = [path]
|
32
|
+
end
|
33
|
+
|
34
|
+
path = _convert_path(path)
|
35
|
+
|
36
|
+
params = {
|
37
|
+
path: path
|
38
|
+
}
|
39
|
+
|
40
|
+
params[:interpolate] = "true" if interpolate
|
41
|
+
|
42
|
+
return get("/v1/snapToRoads", params,
|
43
|
+
base_url: ROADS_BASE_URL,
|
44
|
+
accepts_client_id: false,
|
45
|
+
custom_response_decoder: method(:extract_roads_body))[:snappedPoints]
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the posted speed limit (in km/h) for given road segments.
|
49
|
+
#
|
50
|
+
# @param [String, Array<String>] place_ids The Place ID of the road segment. Place IDs are returned
|
51
|
+
# by the snap_to_roads function. You can pass up to 100 Place IDs.
|
52
|
+
# @return Array of speed limits.
|
53
|
+
def speed_limits(place_ids: nil)
|
54
|
+
params = GoogleMapsService::Convert.as_list(place_ids).map { |place_id| ["placeId", place_id] }
|
55
|
+
|
56
|
+
return get("/v1/speedLimits", params,
|
57
|
+
base_url: ROADS_BASE_URL,
|
58
|
+
accepts_client_id: false,
|
59
|
+
custom_response_decoder: method(:extract_roads_body))[:speedLimits]
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
# Returns the posted speed limit (in km/h) for given road segments.
|
64
|
+
#
|
65
|
+
# The provided points will first be snapped to the most likely roads the
|
66
|
+
# vehicle was traveling along.
|
67
|
+
#
|
68
|
+
# @param [Hash, Array] path The path of points to be snapped. A list of (or single)
|
69
|
+
# latitude/longitude tuples.
|
70
|
+
#
|
71
|
+
# @return [Hash] a dict with both a list of speed limits and a list of the snapped
|
72
|
+
# points.
|
73
|
+
def snapped_speed_limits(path: nil)
|
74
|
+
|
75
|
+
if path.kind_of?(Array) and path.length == 2 and not path[0].kind_of?(Array)
|
76
|
+
path = [path]
|
77
|
+
end
|
78
|
+
|
79
|
+
path = _convert_path(path)
|
80
|
+
|
81
|
+
params = {
|
82
|
+
path: path
|
83
|
+
}
|
84
|
+
|
85
|
+
return get("/v1/speedLimits", params,
|
86
|
+
base_url: ROADS_BASE_URL,
|
87
|
+
accepts_client_id: false,
|
88
|
+
custom_response_decoder: method(:extract_roads_body))
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
def _convert_path(paths)
|
93
|
+
paths = GoogleMapsService::Convert.as_list(paths)
|
94
|
+
return GoogleMapsService::Convert.join_list("|", paths.map { |k| k.kind_of?(String) ? k : GoogleMapsService::Convert.latlng(k) })
|
95
|
+
end
|
96
|
+
|
97
|
+
# Extracts a result from a Roads API HTTP response.
|
98
|
+
def extract_roads_body(response)
|
99
|
+
begin
|
100
|
+
body = MultiJson.load(response.body, :symbolize_keys => true)
|
101
|
+
rescue
|
102
|
+
unless response.status_code == 200
|
103
|
+
check_response_status_code(response)
|
104
|
+
end
|
105
|
+
raise GoogleMapsService::Error::ApiError.new(response), "Received a malformed response."
|
106
|
+
end
|
107
|
+
|
108
|
+
if body.has_key?(:error)
|
109
|
+
error = body[:error]
|
110
|
+
status = error[:status]
|
111
|
+
|
112
|
+
if status == 'INVALID_ARGUMENT'
|
113
|
+
if error[:message] == 'The provided API key is invalid.'
|
114
|
+
raise GoogleMapsService::Error::RequestDeniedError.new(response), error[:message]
|
115
|
+
end
|
116
|
+
raise GoogleMapsService::Error::InvalidRequestError.new(response), error[:message]
|
117
|
+
end
|
118
|
+
|
119
|
+
if status == 'PERMISSION_DENIED'
|
120
|
+
raise GoogleMapsService::Error::RequestDeniedError.new(response), error[:message]
|
121
|
+
end
|
122
|
+
|
123
|
+
if status == 'RESOURCE_EXHAUSTED'
|
124
|
+
raise GoogleMapsService::Error::RateLimitError.new(response), error[:message]
|
125
|
+
end
|
126
|
+
|
127
|
+
if error.has_key?(:message)
|
128
|
+
raise GoogleMapsService::Error::ApiError.new(response), error[:message]
|
129
|
+
else
|
130
|
+
raise GoogleMapsService::Error::ApiError.new(response)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
unless response.status_code == 200
|
135
|
+
raise GoogleMapsService::Error::HTTPError.new(response)
|
136
|
+
end
|
137
|
+
|
138
|
+
return body
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|