server-side-google-maps 0.0.3 → 0.0.4

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 CHANGED
@@ -20,12 +20,17 @@ Then, to use within Ruby:
20
20
  directions.origin_point # [ 45.5086700, -73.5536800 ]
21
21
  directions.destination_address # 'Ottawa, ON, Canada'
22
22
  directions.destination_point # [ 45.4119000, -75.6984600 ]
23
- directions.points # List of [lat,lon] coordinates of route
23
+ directions.points # Array of [lat,lon] coordinates of route
24
24
  directions.distance # 199901 (metres)
25
25
 
26
26
  route = Route.new(['Montreal, QC', 'Ottawa, ON', 'Toronto, ON'], :mode => :bicycling)
27
27
  # All the same methods apply to route as to directions
28
28
 
29
+ # We can also find elevations along a path
30
+ path = Path.new([ [ 45.5086700, -73.5536800 ], [ 45.4119000, -75.6984600 ] ]) # a straight line
31
+ path.elevations(20) # Array of equidistant altitudes, in metres, along the path
32
+ # Paths may only be up to around 230 points long, to comply with Google's URL length limit.
33
+
29
34
  One final `:mode` is `:direct`, which calculates `points` and estimates
30
35
  `distance` without querying Google. To ensure Google isn't queried, input
31
36
  the origin and destination as latitude/longitude coordinates.
@@ -4,6 +4,7 @@ Bundler.require
4
4
  require 'server-side-google-maps/version'
5
5
  require 'server-side-google-maps/directions'
6
6
  require 'server-side-google-maps/geo_math'
7
+ require 'server-side-google-maps/path'
7
8
  require 'server-side-google-maps/route'
8
9
  require 'server-side-google-maps/server'
9
10
 
@@ -0,0 +1,34 @@
1
+ module ServerSideGoogleMaps
2
+ class Path
3
+ def self.get_elevations(params)
4
+ server = Server.new
5
+ server.get('/maps/api/elevation', {:sensor => false}.merge(params))
6
+ end
7
+
8
+ def initialize(points)
9
+ raise ArgumentError.new('path must be an Enumerable') unless Enumerable === points
10
+ raise ArgumentError.new('path must have one or more points') unless points.length > 0
11
+ i = 0
12
+ @points = points.collect do |pt|
13
+ raise ArgumentError.new("path element #{i} must be a [latitude, longitude] Array") unless pt.length == 2
14
+ pt.dup
15
+ end
16
+ end
17
+
18
+ # Returns an Array of n equidistant altitudes (in metres) along this path
19
+ def elevations(n)
20
+ results = self.class.get_elevations(:path => "enc:#{encoded_path}", :samples => n)
21
+ results['results'].collect { |r| r['elevation'].to_f }
22
+ end
23
+
24
+ private
25
+
26
+ def encoded_path
27
+ @encoded_path ||= ::GoogleMapsPolyline::Encoder.new(StringIO.new).encode_points(points_1e5).string
28
+ end
29
+
30
+ def points_1e5
31
+ @points.map { |latitude, longitude| [ (latitude * 1e5).to_i, (longitude * 1e5).to_i ] }
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module ServerSideGoogleMaps
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -0,0 +1,124 @@
1
+ {
2
+ "status": "OK",
3
+ "results": [ {
4
+ "location": {
5
+ "lat": 45.5086700,
6
+ "lng": -73.5536800
7
+ },
8
+ "elevation": 15.3455887
9
+ }, {
10
+ "location": {
11
+ "lat": 45.4185028,
12
+ "lng": -73.8696901
13
+ },
14
+ "elevation": 20.8894730
15
+ }, {
16
+ "location": {
17
+ "lat": 45.3274670,
18
+ "lng": -74.1846876
19
+ },
20
+ "elevation": 44.8820000
21
+ }, {
22
+ "location": {
23
+ "lat": 45.2355682,
24
+ "lng": -74.4986695
25
+ },
26
+ "elevation": 59.5912666
27
+ }, {
28
+ "location": {
29
+ "lat": 45.1428119,
30
+ "lng": -74.8116328
31
+ },
32
+ "elevation": 85.9591980
33
+ }, {
34
+ "location": {
35
+ "lat": 45.0492036,
36
+ "lng": -75.1235748
37
+ },
38
+ "elevation": 90.0000000
39
+ }, {
40
+ "location": {
41
+ "lat": 44.9547490,
42
+ "lng": -75.4344927
43
+ },
44
+ "elevation": 75.8659973
45
+ }, {
46
+ "location": {
47
+ "lat": 44.8594535,
48
+ "lng": -75.7443843
49
+ },
50
+ "elevation": 112.5547333
51
+ }, {
52
+ "location": {
53
+ "lat": 44.7633228,
54
+ "lng": -76.0532474
55
+ },
56
+ "elevation": 138.2833099
57
+ }, {
58
+ "location": {
59
+ "lat": 44.6663624,
60
+ "lng": -76.3610798
61
+ },
62
+ "elevation": 128.3775635
63
+ }, {
64
+ "location": {
65
+ "lat": 44.5685778,
66
+ "lng": -76.6678798
67
+ },
68
+ "elevation": 182.8619995
69
+ }, {
70
+ "location": {
71
+ "lat": 44.4699747,
72
+ "lng": -76.9736456
73
+ },
74
+ "elevation": 155.4394684
75
+ }, {
76
+ "location": {
77
+ "lat": 44.3705587,
78
+ "lng": -77.2783759
79
+ },
80
+ "elevation": 158.1198730
81
+ }, {
82
+ "location": {
83
+ "lat": 44.2703352,
84
+ "lng": -77.5820692
85
+ },
86
+ "elevation": 122.1667023
87
+ }, {
88
+ "location": {
89
+ "lat": 44.1693099,
90
+ "lng": -77.8847244
91
+ },
92
+ "elevation": 154.1021423
93
+ }, {
94
+ "location": {
95
+ "lat": 44.0674883,
96
+ "lng": -78.1863405
97
+ },
98
+ "elevation": 284.4921570
99
+ }, {
100
+ "location": {
101
+ "lat": 43.9648759,
102
+ "lng": -78.4869167
103
+ },
104
+ "elevation": 151.9664764
105
+ }, {
106
+ "location": {
107
+ "lat": 43.8614784,
108
+ "lng": -78.7864523
109
+ },
110
+ "elevation": 70.7919540
111
+ }, {
112
+ "location": {
113
+ "lat": 43.7573013,
114
+ "lng": -79.0849468
115
+ },
116
+ "elevation": 38.9590378
117
+ }, {
118
+ "location": {
119
+ "lat": 43.6523500,
120
+ "lng": -79.3824000
121
+ },
122
+ "elevation": 89.6621323
123
+ } ]
124
+ }
data/spec/path_spec.rb ADDED
@@ -0,0 +1,58 @@
1
+ require 'spec'
2
+
3
+ module ServerSideGoogleMaps
4
+ describe(Path) do
5
+ describe('#get_elevations') do
6
+ it('should use the proper URL') do
7
+ Server.should_receive(:get).with('/maps/api/elevation/json', :query => { :sensor => false, :path => 'abcd', :samples => 20})
8
+ Path.get_elevations(:path => 'abcd', :samples => 20)
9
+ end
10
+ end
11
+
12
+ describe('#initialize') do
13
+ it('should not allow a 0-point path') do
14
+ expect { Path.new([]) }.to(raise_exception(ArgumentError))
15
+ end
16
+
17
+ it('should allow a 1-point path') do
18
+ pt = [ 45.5086700, -73.5536800 ]
19
+ Path.new([pt])
20
+ end
21
+ end
22
+
23
+ context('with a mocked #get_elevations') do
24
+ class Parser < HTTParty::Parser
25
+ public_class_method(:new)
26
+ end
27
+
28
+ before(:each) do
29
+ Path.stub(:get_elevations) do |params|
30
+ basename = 'path1-get_elevations-result.txt'
31
+ data = File.read("#{File.dirname(__FILE__)}/files/#{basename}")
32
+ parser = Parser.new(data, :json)
33
+ parser.parse
34
+ end
35
+ end
36
+
37
+ describe('#elevations') do
38
+ it('should pass an encoded :path and :samples to #get_elevations') do
39
+ Path.should_receive(:get_elevations).with(:path => 'enc:elwtGn}|_M~piJnlqb@', :samples => 20)
40
+ pt1 = [ 45.50867, -73.55368 ]
41
+ pt2 = [ 43.65235, -79.38240 ]
42
+ path = Path.new([pt1, pt2])
43
+ path.elevations(20)
44
+ end
45
+
46
+ it('should return the proper elevations') do
47
+ pt1 = [ 45.50867, -73.55368 ]
48
+ pt2 = [ 43.65235, -79.38240 ]
49
+ path = Path.new([pt1, pt2])
50
+ elevations = path.elevations(20)
51
+ elevations.length.should == 20 # the 20 is from the stub file, not the above argument
52
+ elevations[0].should == 15.3455887
53
+ elevations[19].should == 89.6621323
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: server-side-google-maps
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Adam Hooper
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-26 00:00:00 -04:00
18
+ date: 2011-05-01 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -76,6 +76,7 @@ files:
76
76
  - lib/server-side-google-maps.rb
77
77
  - lib/server-side-google-maps/directions.rb
78
78
  - lib/server-side-google-maps/geo_math.rb
79
+ - lib/server-side-google-maps/path.rb
79
80
  - lib/server-side-google-maps/route.rb
80
81
  - lib/server-side-google-maps/server.rb
81
82
  - lib/server-side-google-maps/version.rb
@@ -86,6 +87,8 @@ files:
86
87
  - spec/files/directions-Montreal,QC-to-Ottawa,ON-without-overview-polyline.txt
87
88
  - spec/files/directions-Montreal,QC-to-Ottawa,ON.txt
88
89
  - spec/files/directions-Ottawa,ON-to-Toronto,ON.txt
90
+ - spec/files/path1-get_elevations-result.txt
91
+ - spec/path_spec.rb
89
92
  - spec/route_spec.rb
90
93
  - spec/spec.rb
91
94
  has_rdoc: true