google_maps_apis 1.0.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.
data/README.md ADDED
@@ -0,0 +1,379 @@
1
+ # Ruby gem for Google Maps APIs
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/google_maps_apis.svg)](http://badge.fury.io/rb/google_maps_apis) [![Build Status](https://travis-ci.org/edwardsamuel/google-maps-services-ruby.svg?branch=master)](https://travis-ci.org/edwardsamuel/google-maps-services-ruby) [![Dependency Status](https://gemnasium.com/edwardsamuel/google-maps-services-ruby.svg)](https://gemnasium.com/edwardsamuel/google-maps-services-ruby) [![Code Climate](https://codeclimate.com/github/edwardsamuel/google-maps-services-ruby/badges/gpa.svg)](https://codeclimate.com/github/edwardsamuel/google-maps-services-ruby) [![Coverage Status](https://coveralls.io/repos/edwardsamuel/google-maps-services-ruby/badge.svg?branch=master&service=github)](https://coveralls.io/github/edwardsamuel/google-maps-services-ruby?branch=master) [![Inch CI](https://inch-ci.org/github/edwardsamuel/google-maps-services-ruby.svg?branch=master)](https://inch-ci.org/github/edwardsamuel/google-maps-services-ruby?branch=master)
4
+
5
+ ![Analytics](https://ga-beacon.appspot.com/UA-66926725-1/google-maps-services-ruby/readme?pixel)
6
+
7
+ *This gem is ported from [Python Client for Google Maps Services](https://github.com/googlemaps/google-maps-services-python).*
8
+
9
+ ## Description
10
+
11
+ Use Ruby? Want to [geocode][Geocoding API] something? Looking for [directions][Directions API]?
12
+ Maybe [matrices of directions][Distance Matrix API]? This gem brings the [Google Maps API Web
13
+ Services] to your Ruby application.
14
+
15
+ The Ruby gem for Google Maps Web Service APIs is a gem for the following Google Maps APIs:
16
+
17
+ - [Google Maps Directions API][Directions API]
18
+ - [Google Maps Distance Matrix API][Distance Matrix API]
19
+ - [Google Maps Elevation API][Elevation API]
20
+ - [Google Maps Geocoding API][Geocoding API]
21
+ - [Google Maps Time Zone API][Time Zone API]
22
+ - [Google Maps Roads API][Roads API]
23
+ - [Google Maps Places API][Places API - AutoComplete]
24
+
25
+ Keep in mind that the same [terms and conditions](https://developers.google.com/maps/terms) apply
26
+ to usage of the APIs when they're accessed through this gem.
27
+
28
+
29
+ ## Features
30
+
31
+ ### Rate Limiting
32
+
33
+ Never sleep between requests again! By default, requests are sent at the expected rate limits for
34
+ each web service, typically 10 queries per second for free users. If you want to speed up or slowdown requests, you can do that too, using `queries_per_second` options while initializing API client.
35
+
36
+ ### Retry on Failure
37
+
38
+ Automatically retry when intermittent failures occur. That is, when any of the retriable 5xx errors
39
+ are returned from the API.
40
+
41
+ ### Keys *and* Client IDs
42
+
43
+ Maps API for Work customers can use their [client ID and secret][clientid] to authenticate. Free
44
+ customers can use their [API key][apikey], too.
45
+
46
+ Note: Currently, [Roads API] does not accept client ID. It requires API key to authenticate the request.
47
+
48
+ ### Ruby Hash/Array as API Result
49
+
50
+ This gem return a Ruby Hash/Array object as the API result. The result format structure is same as in Google Maps API documentation.
51
+
52
+ ## Requirements
53
+
54
+ - Ruby 2.0 or later.
55
+ - A Google Maps API credentials (API keys or client IDs)
56
+
57
+ ### Obtain API keys
58
+
59
+ Each Google Maps Web Service requires an API key or Client ID. API keys are
60
+ freely available with a Google Account at https://developers.google.com/console.
61
+ To generate a server key for your project:
62
+
63
+ 1. Visit https://developers.google.com/console and log in with
64
+ a Google Account.
65
+ 1. Select an existing project, or create a new project.
66
+ 1. Click **Enable an API**.
67
+ 1. Browse for the API, and set its status to "On". The Python Client for Google Maps Services
68
+ accesses the following APIs:
69
+ * Directions API
70
+ * Distance Matrix API
71
+ * Elevation API
72
+ * Geocoding API
73
+ * Time Zone API
74
+ * Roads API
75
+ 1. Once you've enabled the APIs, click **Credentials** from the left navigation of the Developer
76
+ Console.
77
+ 1. In the "Public API access", click **Create new Key**.
78
+ 1. Choose **Server Key**.
79
+ 1. If you'd like to restrict requests to a specific IP address, do so now.
80
+ 1. Click **Create**.
81
+
82
+ Your API key should be 40 characters long, and begin with `AIza`.
83
+
84
+ **Important:** This key should be kept secret on your server.
85
+
86
+ ## Installation
87
+
88
+ Add this line to your application's Gemfile:
89
+
90
+ gem 'google_maps_apis'
91
+
92
+ And then execute:
93
+
94
+ bundle install
95
+
96
+ Or install it yourself as:
97
+
98
+ gem install google_maps_apis
99
+
100
+ In your Ruby code, add this line to load this gem:
101
+
102
+ require 'google_maps_apis'
103
+
104
+ ## Usage
105
+
106
+ Before you request Google Maps API, you must configure the client.
107
+
108
+ You can view the [reference documentation](http://www.rubydoc.info/gems/google_maps_apis).
109
+
110
+ ### Configure client
111
+
112
+ ```ruby
113
+ require 'google_maps_apis'
114
+
115
+ # Setup API keys
116
+ gmaps = GoogleMapsApis::Client.new(key: 'Add your key here')
117
+
118
+ # Setup client IDs
119
+ gmaps = GoogleMapsApis::Client.new(
120
+ client_id: 'Add your client id here',
121
+ client_secret: 'Add your client secret here'
122
+ )
123
+
124
+ # More complex setup
125
+ gmaps = GoogleMapsApis::Client.new(
126
+ key: 'Add your key here',
127
+ retry_timeout: 20, # Timeout for retrying failed request
128
+ queries_per_second: 10 # Limit total request per second
129
+ )
130
+ ```
131
+ You can also set up the client globally.
132
+
133
+ ```ruby
134
+ require 'google_maps_apis'
135
+
136
+ # Setup global parameters
137
+ GoogleMapsApis.configure do |config|
138
+ config.key = 'Add your key here'
139
+ config.retry_timeout = 20
140
+ config.queries_per_second = 10
141
+ end
142
+
143
+ # Initialize client using global parameters
144
+ gmaps = GoogleMapsApis::Client.new
145
+ ```
146
+
147
+ For more examples and detail (setup **proxy**, **timeout**, **caching**, etc.) while initializing the client, check out [Client documentation](http://www.rubydoc.info/gems/google_maps_apis/GoogleMapsApis/services/Client#initialize-instance_method).
148
+
149
+ ### Latitude/longitude pairs format
150
+
151
+ Some APIs require latitude/longitude pair(s) as their parameter(s). This gem accept various format of latitude/longitude pairs:
152
+
153
+ ```ruby
154
+ # Array
155
+ latlng = [40.714224, -73.961452]
156
+
157
+ # Hash with symbolized keys
158
+ latlng = {lat: 40.714224, lng: -73.961452}
159
+ latlng = {latitude: 40.714224, longitude: -73.961452}
160
+
161
+ # Hash with string keys
162
+ latlng = {'lat' => 40.714224, 'lng' => -73.961452}
163
+ latlng = {'latitude' => 40.714224, 'longitude' => -73.961452}
164
+ ```
165
+
166
+ ### Directions API
167
+
168
+ ```ruby
169
+ # Simple directions
170
+ routes = gmaps.directions(
171
+ '1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA',
172
+ '2400 Amphitheatre Parkway, Mountain View, CA 94043, USA',
173
+ mode: 'walking',
174
+ alternatives: false)
175
+ ```
176
+
177
+ Sample result:
178
+
179
+ ```ruby
180
+ [{
181
+ :bounds=>{
182
+ :northeast=>{:lat=>37.4238004, :lng=>-122.084314},
183
+ :southwest=>{:lat=>37.42277989999999, :lng=>-122.0882019}
184
+ },
185
+ :copyrights=>"Map data ©2015 Google",
186
+ :legs=>[
187
+ {
188
+ :distance=>{:text=>"0.2 mi", :value=>393},
189
+ :duration=>{:text=>"5 mins", :value=>287},
190
+ :end_address=>"2400 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
191
+ :end_location=>{:lat=>37.4238004, :lng=>-122.0882019},
192
+ :start_address=>"1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
193
+ :start_location=>{:lat=>37.42277989999999, :lng=>-122.084314},
194
+ :steps=>[
195
+ {
196
+ :distance=>{:text=>"223 ft", :value=>68},
197
+ :duration=>{:text=>"1 min", :value=>49},
198
+ :end_location=>{:lat=>37.4228653, :lng=>-122.0850785},
199
+ :html_instructions=>"Head <b>west</b>",
200
+ :polyline=>{:points=>"kclcF|qchVEdAGx@ALAJ"},
201
+ :start_location=>{:lat=>37.42277989999999, :lng=>-122.084314},
202
+ :travel_mode=>"WALKING"
203
+ }, {
204
+ :distance=>{:text=>"108 ft", :value=>33},
205
+ :duration=>{:text=>"1 min", :value=>23},
206
+ :end_location=>{:lat=>37.423161, :lng=>-122.0850102},
207
+ :html_instructions=>"Turn <b>right</b> toward <b>Amphitheatre Pkwy</b>",
208
+ :maneuver=>"turn-right",
209
+ :polyline=>{:points=>"}clcFvvchVg@IQC"},
210
+ :start_location=>{:lat=>37.4228653, :lng=>-122.0850785},
211
+ :travel_mode=>"WALKING"
212
+ }, {
213
+ :distance=>{:text=>"407 ft", :value=>124},
214
+ :duration=>{:text=>"2 mins", :value=>90},
215
+ :end_location=>{:lat=>37.423396, :lng=>-122.0863768},
216
+ :html_instructions=>"Turn <b>left</b> onto <b>Amphitheatre Pkwy</b>",
217
+ :maneuver=>"turn-left",
218
+ :polyline=>{:points=>"welcFhvchVEf@Eb@C\\EZGp@Il@CRAJAJ"},
219
+ :start_location=>{:lat=>37.423161, :lng=>-122.0850102},
220
+ :travel_mode=>"WALKING"
221
+ }, {
222
+ :distance=>{:text=>"0.1 mi", :value=>168},
223
+ :duration=>{:text=>"2 mins", :value=>125},
224
+ :end_location=>{:lat=>37.4238004, :lng=>-122.0882019},
225
+ :html_instructions=>
226
+ "Slight <b>right</b> to stay on <b>Amphitheatre Pkwy</b><div style=\"font-size:0.9em\">Destination will be on the right</div>",
227
+ :maneuver=>"turn-slight-right",
228
+ :polyline=>{:points=>"gglcFz~chVGJADAD?DIh@MhAWhBOxACT"},
229
+ :start_location=>{:lat=>37.423396, :lng=>-122.0863768},
230
+ :travel_mode=>"WALKING"
231
+ }
232
+ ],
233
+ :via_waypoint=>[]
234
+ }
235
+ ],
236
+ :overview_polyline=>{:points=>"kclcF|qchVQxCy@MKjA[xCE^IVMz@y@bH"},
237
+ :summary=>"Amphitheatre Pkwy",
238
+ :warnings=>["Walking directions are in beta. Use caution – This route may be missing sidewalks or pedestrian paths."],
239
+ :waypoint_order=>[]
240
+ }]
241
+ ```
242
+
243
+ For more usage examples and result format, check out [gem documentation](http://www.rubydoc.info/gems/google_maps_apis/GoogleMapsApis/services/Directions), [test script](https://github.com/go-illa/google-maps-services-ruby/tree/master/spec/google_maps_apis/services/directions_spec.rb), and [Google Maps Directions API documentation][Directions API].
244
+
245
+ ### Distance Matrix API
246
+
247
+ ```ruby
248
+ # Multiple parameters distance matrix
249
+ origins = ["Bobcaygeon ON", [41.43206, -81.38992]]
250
+ destinations = [[43.012486, -83.6964149], {lat: 42.8863855, lng: -78.8781627}]
251
+ matrix = gmaps.distance_matrix(origins, destinations,
252
+ mode: 'driving',
253
+ language: 'en-AU',
254
+ avoid: 'tolls',
255
+ units: 'imperial')
256
+ ```
257
+
258
+ For more usage examples and result format, check out [gem documentation](http://www.rubydoc.info/gems/google_maps_apis/GoogleMapsApis/services/DistanceMatrix), [test script](https://github.com/go-illa/google-maps-services-ruby/tree/master/spec/google_maps_apis/services/distance_matrix_spec.rb), and [Google Maps Distance Matrix API documentation][Distance Matrix API].
259
+
260
+ ### Elevation API
261
+
262
+ ```ruby
263
+ # Elevation of some locations
264
+ locations = [[40.714728, -73.998672], [-34.397, 150.644]]
265
+ results = gmaps.elevation(locations)
266
+
267
+ # Elevation along path
268
+ locations = [[40.714728, -73.998672], [-34.397, 150.644]]
269
+ results = gmaps.elevation_along_path(locations, 5)
270
+ ```
271
+
272
+ For more usage examples and result format, check out [gem documentation](http://www.rubydoc.info/gems/google_maps_apis/GoogleMapsApis/services/Elevation), [test script](https://github.com/go-illa/google-maps-services-ruby/tree/master/spec/google_maps_apis/services/elevation_spec.rb), and [Google Maps Elevation API documentation][Elevation API].
273
+
274
+ ### Geocoding API
275
+
276
+ ```ruby
277
+ # Geocoding an address
278
+ results = gmaps.geocode('1600 Amphitheatre Parkway, Mountain View, CA')
279
+
280
+ # Look up an address with reverse geocoding
281
+ results = gmaps.reverse_geocode([40.714224, -73.961452])
282
+ ```
283
+
284
+ For more usage examples and result format, check out [gem documentation](http://www.rubydoc.info/gems/google_maps_apis/GoogleMapsApis/services/Geocoding), [test script](https://github.com/go-illa/google-maps-services-ruby/tree/master/spec/google_maps_apis/services/geocoding_spec.rb), and [Google Maps Geocoding API documentation][Geocoding API].
285
+
286
+ ### Roads API
287
+
288
+ ```ruby
289
+ # Snap to roads
290
+ path = [
291
+ [-33.8671, 151.20714],
292
+ [-33.86708, 151.20683000000002],
293
+ [-33.867070000000005, 151.20674000000002],
294
+ [-33.86703, 151.20625]
295
+ ]
296
+ results = gmaps.snap_to_roads(path, interpolate: true)
297
+
298
+ # Snapped speed limits
299
+ path = [
300
+ [-33.8671, 151.20714],
301
+ [-33.86708, 151.20683000000002],
302
+ [-33.867070000000005, 151.20674000000002],
303
+ [-33.86703, 151.20625]
304
+ ]
305
+ results = gmaps.snapped_speed_limits(path)
306
+
307
+ # Speed limits
308
+ place_ids = [
309
+ 'ChIJ0wawjUCuEmsRgfqC5Wd9ARM',
310
+ 'ChIJ6cs2kkCuEmsRUfqC5Wd9ARM'
311
+ ]
312
+ results = gmaps.speed_limits(place_ids)
313
+ ```
314
+
315
+ For more usage examples and result format, check out [gem documentation](http://www.rubydoc.info/gems/google_maps_apis/GoogleMapsApis/services/Roads), [test script](https://github.com/go-illa/google-maps-services-ruby/tree/master/spec/google_maps_apis/services/roads_spec.rb), and [Google Maps Roads API documentation][Roads API].
316
+
317
+ ### Time Zone API
318
+
319
+ ```ruby
320
+ # Current time zone
321
+ timezone = gmaps.timezone([39.603481, -119.682251])
322
+
323
+ # Time zone at certain time
324
+ timezone = gmaps.timezone([39.603481, -119.682251], timestamp: Time.at(1608))
325
+ ```
326
+
327
+ For more usage examples and result format, check out [gem documentation](http://www.rubydoc.info/gems/google_maps_apis/GoogleMapsApis/services/TimeZone), [test script](https://github.com/go-illa/google-maps-services-ruby/tree/master/spec/google_maps_apis/services/time_zone_spec.rb), and [Google Maps Time Zone API documentation][Time Zone API].
328
+
329
+ ### Polyline encoder/decoder
330
+
331
+ [Google Encoded Polyline] is a lossy compression algorithm that allows you to store a series of coordinates as a single string. This format is used in some APIs:
332
+
333
+ - [Directions API] encodes the result path.
334
+ - [Elevation API] also accepts the encoded polyline as request parameter.
335
+
336
+ To handle Google Encoded Polyline, this gem provides encoder/decoder:
337
+
338
+ ```ruby
339
+ require 'google_maps_apis/polyline' # Or, require 'google_maps_apis' is enough
340
+
341
+ # Decode polyline
342
+ encoded_path = '_p~iF~ps|U_ulLnnqC_mqNvxq`@'
343
+ path = GoogleMapsApis::Polyline.decode(encoded_path)
344
+ #=> [{:lat=>38.5, :lng=>-120.2}, {:lat=>40.7, :lng=>-120.95}, {:lat=>43.252, :lng=>-126.45300000000002}]
345
+
346
+ # Encode polyline
347
+ path = [[38.5, -120.2], [40.7, -120.95], [43.252, -126.453]]
348
+ encoded_path = GoogleMapsApis::Polyline.encode(path)
349
+ #=> "_p~iF~ps|U_ulLnnqC_mqNvxq`@"
350
+ ```
351
+
352
+ ## Issues and feature suggestions
353
+
354
+ If you find a bug, or have a feature suggestion, please [log an issue][issues]. If you'd like to
355
+ contribute, please read [How to Contribute](#contributing).
356
+
357
+ ## Contributing
358
+
359
+ 1. Fork it (https://github.com/go-illa/google-maps-services-ruby/fork).
360
+ 2. Create your feature branch (`git checkout -b my-new-feature`).
361
+ 3. Commit your changes (`git commit -am 'Add some feature'`).
362
+ 4. Push to the branch (`git push origin my-new-feature`).
363
+ 5. Create a new Pull Request.
364
+
365
+ [apikey]: https://developers.google.com/maps/faq#keysystem
366
+ [clientid]: https://developers.google.com/maps/documentation/business/webservices/auth
367
+
368
+ [Google Maps API Web Services]: https://developers.google.com/maps/web-services/overview/
369
+ [Directions API]: https://developers.google.com/maps/documentation/directions/
370
+ [Distance Matrix API]: https://developers.google.com/maps/documentation/distancematrix/
371
+ [Elevation API]: https://developers.google.com/maps/documentation/elevation/
372
+ [Geocoding API]: https://developers.google.com/maps/documentation/geocoding/
373
+ [Time Zone API]: https://developers.google.com/maps/documentation/timezone/
374
+ [Roads API]: https://developers.google.com/maps/documentation/roads/
375
+ [Places API - AutoComplete]: https://developers.google.com/maps/documentation/places
376
+
377
+ [Google Encoded Polyline]: https://developers.google.com/maps/documentation/utilities/polylinealgorithm
378
+
379
+ [issues]: https://github.com/go-illa/google-maps-services-ruby/issues
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
8
+
9
+ unless defined?(JRUBY_VERSION)
10
+ require 'yard'
11
+
12
+ YARD::Rake::YardocTask.new do |t|
13
+ t.files = ['lib/**/*.rb']
14
+ end
15
+ end
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "google_maps_apis"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'google_maps_apis/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'google_maps_apis'
8
+ spec.version = GoogleMapsApis::VERSION
9
+ spec.authors = ['Edward Samuel Pasaribu', 'Ahmed Abdelhamid']
10
+ spec.email = ['edwardsamuel92@gmail.com', 'eng.a.abdelhamid@outlook.com']
11
+
12
+ spec.summary = %q{Ruby gem for Google Maps Web Service APIs }
13
+ spec.homepage = %q{https://github.com/go-illa/google-maps-services-ruby/tree/stable}
14
+ spec.license = 'Apache-2.0'
15
+ spec.required_ruby_version = '>= 2.6.0'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_runtime_dependency 'multi_json', '~> 1.12'
21
+ spec.add_runtime_dependency 'faraday', '~> 2.0'
22
+ spec.add_runtime_dependency 'retriable', '~> 3.1'
23
+ end