server-side-google-maps 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +14 -14
- data/lib/server-side-google-maps.rb +1 -0
- data/lib/server-side-google-maps/directions.rb +16 -25
- data/lib/server-side-google-maps/path.rb +74 -5
- data/lib/server-side-google-maps/point.rb +49 -0
- data/lib/server-side-google-maps/route.rb +7 -7
- data/lib/server-side-google-maps/version.rb +1 -1
- data/spec/directions_spec.rb +10 -16
- data/spec/path_spec.rb +60 -8
- data/spec/point_spec.rb +50 -0
- data/spec/route_spec.rb +7 -13
- metadata +8 -8
data/README.md
CHANGED
@@ -11,25 +11,25 @@ To install:
|
|
11
11
|
|
12
12
|
Then, to use within Ruby:
|
13
13
|
|
14
|
-
|
14
|
+
route = ServerSideGoogleMaps::Route.new(['Montreal, QC', 'Ottawa, ON'], :mode => :driving)
|
15
15
|
# Origin and destination accept [lat,lon] coordinates as well as strings
|
16
16
|
# :mode => :driving is the default. Others are :bicycling and :walking
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
route = Route.new(['Montreal, QC', 'Ottawa, ON', 'Toronto, ON'], :mode => :bicycling)
|
27
|
-
# All the same methods apply to route as to directions
|
18
|
+
route.status # 'OK'
|
19
|
+
route.origin_address # 'Montreal, QC, Canada'
|
20
|
+
route.origin_point # [ 45.5086700, -73.5536800 ]
|
21
|
+
route.destination_address # 'Ottawa, ON, Canada'
|
22
|
+
route.destination_point # [ 45.4119000, -75.6984600 ]
|
23
|
+
route.path.points # Array of Point coordinates of route
|
24
|
+
route.points[0].latitude # .latitude, .longitude, .distance_to_here
|
25
|
+
route.distance # 199901 (metres)
|
28
26
|
|
29
27
|
# We can also find elevations along a path
|
30
|
-
path =
|
31
|
-
path.elevations(20) # Array of equidistant
|
32
|
-
# Paths may only be up to around 230 points long,
|
28
|
+
path = route.path
|
29
|
+
path.elevations(20) # Array of equidistant Points, each with an elevation
|
30
|
+
# Paths used for elevation may only be up to around 230 points long,
|
31
|
+
# to comply with Google's URL length limit. That's not hard to achieve:
|
32
|
+
simple_path = path.interpolate(230) # will create a new Path by interpolating
|
33
33
|
|
34
34
|
One final `:mode` is `:direct`, which calculates `points` and estimates
|
35
35
|
`distance` without querying Google. To ensure Google isn't queried, input
|
@@ -5,6 +5,7 @@ require 'server-side-google-maps/version'
|
|
5
5
|
require 'server-side-google-maps/directions'
|
6
6
|
require 'server-side-google-maps/geo_math'
|
7
7
|
require 'server-side-google-maps/path'
|
8
|
+
require 'server-side-google-maps/point'
|
8
9
|
require 'server-side-google-maps/route'
|
9
10
|
require 'server-side-google-maps/server'
|
10
11
|
|
@@ -47,7 +47,7 @@ module ServerSideGoogleMaps
|
|
47
47
|
|
48
48
|
other = Directions.new(origin, destination, params.merge(:mode => mode))
|
49
49
|
if other.distance.to_f / distance < factor
|
50
|
-
@
|
50
|
+
@path = other.path
|
51
51
|
@distance = other.distance
|
52
52
|
end
|
53
53
|
end
|
@@ -71,31 +71,31 @@ module ServerSideGoogleMaps
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def origin_point
|
74
|
-
@origin_point ||= origin_point_without_server ||
|
74
|
+
@origin_point ||= origin_point_without_server || Point.new(leg['start_location']['lat'], leg['start_location']['lng'])
|
75
75
|
end
|
76
76
|
|
77
77
|
def destination_point
|
78
|
-
@destination_point ||= destination_point_without_server ||
|
78
|
+
@destination_point ||= destination_point_without_server || Point.new(leg['end_location']['lat'], leg['end_location']['lng'])
|
79
79
|
end
|
80
80
|
|
81
81
|
def status
|
82
82
|
@data['status']
|
83
83
|
end
|
84
84
|
|
85
|
-
def points
|
86
|
-
@points ||= calculate_points
|
87
|
-
end
|
88
|
-
|
89
85
|
def distance
|
90
86
|
@distance ||= calculate_distance
|
91
87
|
end
|
92
88
|
|
93
|
-
def
|
94
|
-
@
|
89
|
+
def path
|
90
|
+
@path ||= Path.new(points)
|
95
91
|
end
|
96
92
|
|
97
93
|
private
|
98
94
|
|
95
|
+
def points # DEPRECATED
|
96
|
+
@points ||= calculate_points
|
97
|
+
end
|
98
|
+
|
99
99
|
def origin_point_without_server
|
100
100
|
calculate_point_without_server_or_nil(origin_input)
|
101
101
|
end
|
@@ -107,7 +107,7 @@ module ServerSideGoogleMaps
|
|
107
107
|
def calculate_point_without_server_or_nil(input)
|
108
108
|
return input if Array === input
|
109
109
|
m = LATLNG_STRING_REGEXP.match(input)
|
110
|
-
return
|
110
|
+
return Point.new(m[1].to_f, m[3].to_f) if m
|
111
111
|
end
|
112
112
|
|
113
113
|
def route
|
@@ -124,34 +124,25 @@ module ServerSideGoogleMaps
|
|
124
124
|
|
125
125
|
def calculate_points_and_levels
|
126
126
|
polyline = route['overview_polyline']
|
127
|
-
return [ origin_point
|
127
|
+
return [ [origin_point.latitude, origin_point.longitude, 0], [destination_point.latitude, destination_point.longitude, 0]] unless polyline && polyline['points'] && polyline['levels']
|
128
128
|
::GoogleMapsPolyline.decode_polyline(polyline['points'], polyline['levels'])
|
129
129
|
end
|
130
130
|
|
131
131
|
def calculate_points
|
132
132
|
return [ origin_point, destination_point ] if @direct
|
133
|
-
points = points_and_levels.map { |lat,lng,level|
|
133
|
+
points = points_and_levels.map { |lat,lng,level| Point.new(lat, lng) }
|
134
134
|
points
|
135
135
|
end
|
136
136
|
|
137
137
|
def calculate_distance
|
138
|
-
|
138
|
+
if @direct
|
139
|
+
path.calculate_distances unless path.points[0].distance_along_path
|
140
|
+
return path.points[-1].distance_along_path
|
141
|
+
end
|
139
142
|
if !leg['distance']
|
140
143
|
return leg['steps'].collect{|s| s['distance']}.collect{|d| d ? d['value'].to_i : 0}.inject(0){|s,v| s += v}
|
141
144
|
end
|
142
145
|
leg['distance']['value']
|
143
146
|
end
|
144
|
-
|
145
|
-
def calculate_estimated_distance
|
146
|
-
d = 0
|
147
|
-
last_point = points[0]
|
148
|
-
|
149
|
-
points[1..-1].each do |point|
|
150
|
-
d += GeoMath.latlng_distance(last_point, point)
|
151
|
-
last_point = point
|
152
|
-
end
|
153
|
-
|
154
|
-
d
|
155
|
-
end
|
156
147
|
end
|
157
148
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module ServerSideGoogleMaps
|
2
2
|
class Path
|
3
|
+
attr_reader(:points)
|
4
|
+
|
3
5
|
def self.get_elevations(params)
|
4
6
|
server = Server.new
|
5
7
|
server.get('/maps/api/elevation', {:sensor => false}.merge(params))
|
@@ -10,15 +12,82 @@ module ServerSideGoogleMaps
|
|
10
12
|
raise ArgumentError.new('path must have one or more points') unless points.length > 0
|
11
13
|
i = 0
|
12
14
|
@points = points.collect do |pt|
|
13
|
-
raise ArgumentError.new("path element #{i} must
|
14
|
-
pt
|
15
|
+
raise ArgumentError.new("path element #{i} must have .latitude and .longitude") unless pt.respond_to?(:latitude)
|
16
|
+
pt
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
|
-
# Returns
|
20
|
+
# Returns a new Path with n equidistant Points along this Path, complete with .elevation
|
19
21
|
def elevations(n)
|
20
22
|
results = self.class.get_elevations(:path => "enc:#{encoded_path}", :samples => n)
|
21
|
-
results['results'].collect
|
23
|
+
points = results['results'].collect do |r|
|
24
|
+
Point.new(
|
25
|
+
r['location']['lat'].to_f,
|
26
|
+
r['location']['lng'].to_f,
|
27
|
+
:elevation => r['elevation'].to_f
|
28
|
+
)
|
29
|
+
end
|
30
|
+
Path.new(points)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Sets .distance on every Point in the Path
|
34
|
+
#
|
35
|
+
# Yes, this is a hack: it assumes all the Points will only belong to this Path.
|
36
|
+
# It's here because it's convenient.
|
37
|
+
def calculate_distances
|
38
|
+
total_distance = 0
|
39
|
+
last_point = nil
|
40
|
+
points.each do |point|
|
41
|
+
if last_point
|
42
|
+
distance_piece = last_point.distance(point)
|
43
|
+
total_distance += distance_piece
|
44
|
+
end
|
45
|
+
point.distance_along_path = total_distance
|
46
|
+
last_point = point
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns a Path that approximates this one, with n points
|
51
|
+
def interpolate(n)
|
52
|
+
calculate_distances unless points[0].distance_along_path
|
53
|
+
|
54
|
+
total_distance = points[-1].distance_along_path - points[0].distance_along_path
|
55
|
+
distance_step = 1.0 * total_distance / (n - 1)
|
56
|
+
|
57
|
+
ret = []
|
58
|
+
ret << Point.new(
|
59
|
+
points[0].latitude,
|
60
|
+
points[0].longitude,
|
61
|
+
:distance_along_path => points[0].distance_along_path
|
62
|
+
)
|
63
|
+
|
64
|
+
j = 0
|
65
|
+
current_distance = points[0].distance_along_path
|
66
|
+
(1...(n - 1)).each do |i|
|
67
|
+
current_distance += distance_step if i > 0
|
68
|
+
while j < (points.length - 2) && points[j + 1].distance_along_path < current_distance #&& points[j].distance_along_path == points[j + 1].distance_along_path
|
69
|
+
j += 1
|
70
|
+
end
|
71
|
+
|
72
|
+
point_before = points[j]
|
73
|
+
point_after = points[j + 1]
|
74
|
+
point_segment_length = point_after.distance_along_path - point_before.distance_along_path
|
75
|
+
|
76
|
+
fraction_after = (1.0 * current_distance - point_before.distance_along_path) / point_segment_length
|
77
|
+
fraction_before = 1.0 - fraction_after
|
78
|
+
|
79
|
+
ret << Point.new(
|
80
|
+
fraction_before * point_before.latitude + fraction_after * point_after.latitude,
|
81
|
+
fraction_before * point_before.longitude + fraction_after * point_after.longitude,
|
82
|
+
:distance_along_path => current_distance.round
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
ret << Point.new(
|
87
|
+
points[-1].latitude,
|
88
|
+
points[-1].longitude,
|
89
|
+
:distance_along_path => points[-1].distance_along_path
|
90
|
+
)
|
22
91
|
end
|
23
92
|
|
24
93
|
private
|
@@ -28,7 +97,7 @@ module ServerSideGoogleMaps
|
|
28
97
|
end
|
29
98
|
|
30
99
|
def points_1e5
|
31
|
-
@points.map { |
|
100
|
+
@points.map { |p| [ (p.latitude * 1e5).to_i, (p.longitude * 1e5).to_i ] }
|
32
101
|
end
|
33
102
|
end
|
34
103
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module ServerSideGoogleMaps
|
2
|
+
class Point
|
3
|
+
RADIUS_OF_EARTH = 6367000 # metres
|
4
|
+
DEGREES_TO_RADIANS = Math::PI / 180
|
5
|
+
|
6
|
+
attr_reader(:latitude, :longitude, :object, :elevation)
|
7
|
+
attr_accessor(:distance_along_path)
|
8
|
+
|
9
|
+
def initialize(latitude, longitude, options = {})
|
10
|
+
@latitude = latitude
|
11
|
+
@longitude = longitude
|
12
|
+
@object = options[:object] if options[:object]
|
13
|
+
@distance_along_path = options[:distance_along_path] if options[:distance_along_path]
|
14
|
+
@elevation = options[:elevation] if options[:elevation]
|
15
|
+
end
|
16
|
+
|
17
|
+
def ==(other)
|
18
|
+
latitude == other.latitude && longitude == other.longitude && object == other.object
|
19
|
+
end
|
20
|
+
|
21
|
+
# Calculates the distance to another point, in metres
|
22
|
+
#
|
23
|
+
# The method assumes the Earth is a sphere.
|
24
|
+
def distance(other)
|
25
|
+
lat1 = latitude * DEGREES_TO_RADIANS
|
26
|
+
lat2 = other.latitude * DEGREES_TO_RADIANS
|
27
|
+
dlat = lat2 - lat1
|
28
|
+
dlon = (longitude - other.longitude) * DEGREES_TO_RADIANS
|
29
|
+
|
30
|
+
# Optimize a tad. This method is slow.
|
31
|
+
sin_dlat = Math.sin(dlat / 2)
|
32
|
+
sin_dlon = Math.sin(dlon / 2)
|
33
|
+
|
34
|
+
a = sin_dlat * sin_dlat + Math.cos(lat1) * Math.cos(lat2) * sin_dlon * sin_dlon
|
35
|
+
|
36
|
+
sqrt_a = Math.sqrt(a)
|
37
|
+
|
38
|
+
c = 2 * Math.asin(1.0 < sqrt_a ? 1.0 : sqrt_a)
|
39
|
+
|
40
|
+
(RADIUS_OF_EARTH * c).to_i
|
41
|
+
end
|
42
|
+
|
43
|
+
def latlng_distance_squared(other)
|
44
|
+
latitude_difference = latitude - other.latitude
|
45
|
+
longitude_difference = longitude - other.longitude
|
46
|
+
latitude_difference * latitude_difference + longitude_difference * longitude_difference
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -32,22 +32,22 @@ module ServerSideGoogleMaps
|
|
32
32
|
@directionses.last.destination_point
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
36
|
-
|
35
|
+
def path
|
36
|
+
Path.new(points)
|
37
37
|
end
|
38
38
|
|
39
39
|
def distance
|
40
40
|
@distance ||= @directionses.map{|d| d.distance}.inject(:+)
|
41
41
|
end
|
42
42
|
|
43
|
-
def estimated_distance
|
44
|
-
@estimated_distance ||= @directionses.map{|d| d.estimated_distance}.inject(:+)
|
45
|
-
end
|
46
|
-
|
47
43
|
private
|
48
44
|
|
45
|
+
def points # DEPRECATED
|
46
|
+
@points ||= calculate_points
|
47
|
+
end
|
48
|
+
|
49
49
|
def calculate_points
|
50
|
-
pointses = @directionses.map { |d| d.points }
|
50
|
+
pointses = @directionses.map { |d| d.path.points }
|
51
51
|
|
52
52
|
first = pointses.shift
|
53
53
|
|
data/spec/directions_spec.rb
CHANGED
@@ -70,8 +70,8 @@ module ServerSideGoogleMaps
|
|
70
70
|
|
71
71
|
it('should have origin_point and destination_point') do
|
72
72
|
directions = Directions.new('Montreal,QC', 'Ottawa,ON')
|
73
|
-
directions.origin_point.should ==
|
74
|
-
directions.destination_point.should ==
|
73
|
+
directions.origin_point.should == Point.new(45.5086700, -73.5536800)
|
74
|
+
directions.destination_point.should == Point.new(45.4119000, -75.6984600)
|
75
75
|
end
|
76
76
|
|
77
77
|
it('should have an "OK" status') do
|
@@ -81,11 +81,11 @@ module ServerSideGoogleMaps
|
|
81
81
|
|
82
82
|
it('should have the proper points') do
|
83
83
|
directions = Directions.new('Montreal,QC', 'Ottawa,ON')
|
84
|
-
points = directions.points
|
84
|
+
points = directions.path.points
|
85
85
|
points.length.should == 138
|
86
|
-
points[0].should ==
|
87
|
-
points[1].should ==
|
88
|
-
points[-1].should ==
|
86
|
+
points[0].should == Point.new(45.50867, -73.55368)
|
87
|
+
points[1].should == Point.new(45.50623, -73.55569)
|
88
|
+
points[-1].should == Point.new(45.4119, -75.69846)
|
89
89
|
end
|
90
90
|
|
91
91
|
it('should have the proper distance') do
|
@@ -94,27 +94,21 @@ module ServerSideGoogleMaps
|
|
94
94
|
distance.should == 199901
|
95
95
|
end
|
96
96
|
|
97
|
-
it('should supply an estimated_distance') do
|
98
|
-
directions = Directions.new('Montreal,QC', 'Ottawa,ON')
|
99
|
-
distance = directions.estimated_distance
|
100
|
-
distance.should == 199127
|
101
|
-
end
|
102
|
-
|
103
97
|
it('should suggest a straight line, with :direct') do
|
104
98
|
directions = Directions.new('Montreal,QC', 'Ottawa,ON', :mode => :direct)
|
105
|
-
directions.points.should == [
|
99
|
+
directions.path.points.should == [Point.new(45.50867, -73.55368), Point.new(45.4119, -75.69846)]
|
106
100
|
directions.distance.should == 167512
|
107
101
|
end
|
108
102
|
|
109
103
|
it('should suggest normal route if :find_shortcuts shortcuts are not short enough') do
|
110
104
|
directions = Directions.new('Montreal,QC', 'Ottawa,ON', :find_shortcuts => [{ :factor => 0.5, :mode => :direct }])
|
111
|
-
directions.points.length.should > 2
|
105
|
+
directions.path.points.length.should > 2
|
112
106
|
directions.distance.should == 199901
|
113
107
|
end
|
114
108
|
|
115
109
|
it('should suggest a shortcut if :find_shortcuts finds a shortcut') do
|
116
110
|
directions = Directions.new('Montreal,QC', 'Ottawa,ON', :find_shortcuts => [{ :factor => 0.95, :mode => :direct }])
|
117
|
-
directions.points.length.should == 2
|
111
|
+
directions.path.points.length.should == 2
|
118
112
|
directions.distance.should == 167512
|
119
113
|
end
|
120
114
|
|
@@ -157,7 +151,7 @@ module ServerSideGoogleMaps
|
|
157
151
|
|
158
152
|
it('should provide the start-point and end-point instead') do
|
159
153
|
directions = Directions.new('Montreal,QC', 'Ottawa,ON')
|
160
|
-
directions.points.should == [
|
154
|
+
directions.path.points.should == [Point.new(45.50867, -73.55368), Point.new(45.4119, -75.69846)]
|
161
155
|
end
|
162
156
|
end
|
163
157
|
end
|
data/spec/path_spec.rb
CHANGED
@@ -15,7 +15,7 @@ module ServerSideGoogleMaps
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it('should allow a 1-point path') do
|
18
|
-
pt =
|
18
|
+
pt = Point.new(45.5086700, -73.5536800)
|
19
19
|
Path.new([pt])
|
20
20
|
end
|
21
21
|
end
|
@@ -37,22 +37,74 @@ module ServerSideGoogleMaps
|
|
37
37
|
describe('#elevations') do
|
38
38
|
it('should pass an encoded :path and :samples to #get_elevations') do
|
39
39
|
Path.should_receive(:get_elevations).with(:path => 'enc:elwtGn}|_M~piJnlqb@', :samples => 20)
|
40
|
-
pt1 =
|
41
|
-
pt2 =
|
40
|
+
pt1 = Point.new(45.50867, -73.55368)
|
41
|
+
pt2 = Point.new(43.65235, -79.38240)
|
42
42
|
path = Path.new([pt1, pt2])
|
43
43
|
path.elevations(20)
|
44
44
|
end
|
45
45
|
|
46
46
|
it('should return the proper elevations') do
|
47
|
-
pt1 =
|
48
|
-
pt2 =
|
47
|
+
pt1 = Point.new(45.50867, -73.55368)
|
48
|
+
pt2 = Point.new(43.65235, -79.38240)
|
49
49
|
path = Path.new([pt1, pt2])
|
50
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[
|
51
|
+
elevations.points.length.should == 20 # the 20 is from the stub file, not the above argument
|
52
|
+
elevations.points[0].elevation.should == 15.3455887
|
53
|
+
elevations.points[0].latitude.should == 45.50867
|
54
|
+
elevations.points[0].longitude.should == -73.55368
|
55
|
+
elevations.points[19].elevation.should == 89.6621323
|
54
56
|
end
|
55
57
|
end
|
56
58
|
end
|
59
|
+
|
60
|
+
describe('#calculate_distances') do
|
61
|
+
it('should put 0 on a 1-element Path') do
|
62
|
+
p1 = Point.new(1.0, 2.0)
|
63
|
+
path = Path.new([p1])
|
64
|
+
path.calculate_distances
|
65
|
+
path.points[0].distance_along_path.should == 0
|
66
|
+
end
|
67
|
+
|
68
|
+
it('should calculate the distance for each element') do
|
69
|
+
p1 = Point.new(1.0, 2.0)
|
70
|
+
p2 = Point.new(4.0, 1.0)
|
71
|
+
p3 = Point.new(3.0, 8.0)
|
72
|
+
path = Path.new([p1, p2, p3])
|
73
|
+
path.calculate_distances
|
74
|
+
path.points[0].distance_along_path.should == 0
|
75
|
+
path.points[1].distance_along_path.should == 351371
|
76
|
+
path.points[2].distance_along_path.should == 1135696
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe('#interpolate') do
|
81
|
+
it('should return a new, interpolated Path with more than the original number of points') do
|
82
|
+
p1 = Point.new(1.0, 2.0)
|
83
|
+
p2 = Point.new(7.0, 2.0)
|
84
|
+
p3 = Point.new(7.0, 1.0)
|
85
|
+
path = Path.new([p1, p2, p3])
|
86
|
+
interpolated = path.interpolate(8)
|
87
|
+
interpolated.length.should == 8
|
88
|
+
interpolated[0].should == p1
|
89
|
+
interpolated[6].latitude.to_s.should == '6.9936056564358' # too many decimals...
|
90
|
+
interpolated[6].longitude.should == 2.0
|
91
|
+
interpolated[6].distance_along_path.should == 666039
|
92
|
+
interpolated[7].should == p3
|
93
|
+
end
|
94
|
+
|
95
|
+
it('should work okay when duplicate Points are on the Path') do
|
96
|
+
p1 = Point.new(1.0, 2.0)
|
97
|
+
p2 = Point.new(7.0, 2.0)
|
98
|
+
p2_2 = Point.new(7.0, 2.0)
|
99
|
+
p3 = Point.new(7.0, 1.0)
|
100
|
+
path = Path.new([p1, p2, p2_2, p3])
|
101
|
+
interpolated = path.interpolate(8)
|
102
|
+
interpolated[0].should == p1
|
103
|
+
interpolated[6].latitude.to_s.should == '6.9936056564358' # too many decimals...
|
104
|
+
interpolated[6].longitude.should == 2.0
|
105
|
+
interpolated[6].distance_along_path.should == 666039
|
106
|
+
interpolated[7].should == p3
|
107
|
+
end
|
108
|
+
end
|
57
109
|
end
|
58
110
|
end
|
data/spec/point_spec.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
module ServerSideGoogleMaps
|
4
|
+
describe(Point) do
|
5
|
+
describe('#initialize') do
|
6
|
+
it('should set latitude and longitude') do
|
7
|
+
point = Point.new(1.2, 3.4)
|
8
|
+
point.latitude.should == 1.2
|
9
|
+
point.longitude.should == 3.4
|
10
|
+
end
|
11
|
+
|
12
|
+
it('should work without an "object" option') do
|
13
|
+
point = Point.new(1.2, 3.4)
|
14
|
+
point.object.should == nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it('should work with a "distance_along_path" option') do
|
18
|
+
point = Point.new(1.2, 3.4, :distance_along_path => 341)
|
19
|
+
point.distance_along_path.should == 341
|
20
|
+
end
|
21
|
+
|
22
|
+
it('should work with a "elevation" option') do
|
23
|
+
point = Point.new(1.2, 3.4, :elevation => 341)
|
24
|
+
point.elevation.should == 341
|
25
|
+
end
|
26
|
+
|
27
|
+
it('should allow an "object" option') do
|
28
|
+
object = [1, 2, 3]
|
29
|
+
point = Point.new(1.2, 3.4, :object => object)
|
30
|
+
point.object.should == object
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe('#latlng_distance_squared') do
|
35
|
+
it('should calculate the lat/lng distance squared') do
|
36
|
+
point1 = Point.new(1.0, 4.0)
|
37
|
+
point2 = Point.new(2.0, 6.0)
|
38
|
+
point1.latlng_distance_squared(point2).should == 5.0
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe('#distance') do
|
43
|
+
it('should calculate the distance') do
|
44
|
+
point1 = Point.new(1.0, 4.0)
|
45
|
+
point2 = Point.new(2.0, 6.0)
|
46
|
+
point1.distance(point2).should == 248412
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/route_spec.rb
CHANGED
@@ -58,18 +58,18 @@ module ServerSideGoogleMaps
|
|
58
58
|
|
59
59
|
it('should return appropriate origin_point and destination_point') do
|
60
60
|
route = Route.new(['Montreal,QC', 'Ottawa,ON', 'Toronto,ON'])
|
61
|
-
route.origin_point.should ==
|
62
|
-
route.destination_point.should ==
|
61
|
+
route.origin_point.should == Point.new(45.5086700, -73.5536800)
|
62
|
+
route.destination_point.should == Point.new(43.65235, -79.3824)
|
63
63
|
end
|
64
64
|
|
65
65
|
it('should concatenate the points from component directions') do
|
66
66
|
route = Route.new(['Montreal,QC', 'Ottawa,ON', 'Toronto,ON'])
|
67
|
-
points = route.points
|
67
|
+
points = route.path.points
|
68
68
|
points.length.should == 352
|
69
|
-
points[0].should ==
|
70
|
-
points[137].should ==
|
71
|
-
points[138].should ==
|
72
|
-
points[351].should ==
|
69
|
+
points[0].should == Point.new(45.50867, -73.55368)
|
70
|
+
points[137].should == Point.new(45.4119, -75.69846)
|
71
|
+
points[138].should == Point.new(45.40768, -75.69567)
|
72
|
+
points[351].should == Point.new(43.65235, -79.3824)
|
73
73
|
end
|
74
74
|
|
75
75
|
it('should have the proper distance') do
|
@@ -78,12 +78,6 @@ module ServerSideGoogleMaps
|
|
78
78
|
distance.should == 649742
|
79
79
|
end
|
80
80
|
|
81
|
-
it('should have the proper estimated_distance') do
|
82
|
-
route = Route.new(['Montreal,QC', 'Ottawa,ON', 'Toronto,ON'])
|
83
|
-
distance = route.estimated_distance
|
84
|
-
distance.should == 647730
|
85
|
-
end
|
86
|
-
|
87
81
|
it('should not alter params') do
|
88
82
|
original_params = {
|
89
83
|
:mode => :driving,
|
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:
|
5
|
-
prerelease:
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.5
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Adam Hooper
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-06-10 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: httparty
|
@@ -77,6 +76,7 @@ files:
|
|
77
76
|
- lib/server-side-google-maps/directions.rb
|
78
77
|
- lib/server-side-google-maps/geo_math.rb
|
79
78
|
- lib/server-side-google-maps/path.rb
|
79
|
+
- lib/server-side-google-maps/point.rb
|
80
80
|
- lib/server-side-google-maps/route.rb
|
81
81
|
- lib/server-side-google-maps/server.rb
|
82
82
|
- lib/server-side-google-maps/version.rb
|
@@ -89,9 +89,9 @@ files:
|
|
89
89
|
- spec/files/directions-Ottawa,ON-to-Toronto,ON.txt
|
90
90
|
- spec/files/path1-get_elevations-result.txt
|
91
91
|
- spec/path_spec.rb
|
92
|
+
- spec/point_spec.rb
|
92
93
|
- spec/route_spec.rb
|
93
94
|
- spec/spec.rb
|
94
|
-
has_rdoc: true
|
95
95
|
homepage: http://github.com/adamh/server-side-google-maps
|
96
96
|
licenses: []
|
97
97
|
|
@@ -121,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements: []
|
122
122
|
|
123
123
|
rubyforge_project: server-side-google-maps
|
124
|
-
rubygems_version: 1.
|
124
|
+
rubygems_version: 1.7.2
|
125
125
|
signing_key:
|
126
126
|
specification_version: 3
|
127
127
|
summary: Performs calculations with Google Maps
|