server-side-google-maps 0.1.2 → 0.2.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/lib/server-side-google-maps/path.rb +29 -20
- data/lib/server-side-google-maps/point.rb +8 -5
- data/lib/server-side-google-maps/segment.rb +31 -0
- data/lib/server-side-google-maps/version.rb +1 -1
- data/lib/server-side-google-maps.rb +1 -0
- data/spec/point_spec.rb +2 -2
- data/spec/segment_spec.rb +50 -0
- metadata +6 -4
@@ -78,34 +78,43 @@ module ServerSideGoogleMaps
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def simplify(latlng_error2)
|
81
|
-
simplified_points =
|
81
|
+
simplified_points = douglas_peucker(points, latlng_error2)
|
82
82
|
Path.new(simplified_points)
|
83
83
|
end
|
84
84
|
|
85
85
|
private
|
86
86
|
|
87
|
-
def
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
87
|
+
def douglas_peucker(points, latlng_error2)
|
88
|
+
ret = [points[0]]
|
89
|
+
|
90
|
+
stack = []
|
91
|
+
stack.push([0, points.length - 1])
|
92
|
+
|
93
|
+
while !stack.empty?
|
94
|
+
left, right = stack.pop
|
95
|
+
|
96
|
+
segment = Segment.new(points[left], points[right])
|
97
|
+
max_i = 0
|
98
|
+
max_d = 0
|
99
|
+
|
100
|
+
(left...right).each do |i|
|
101
|
+
point = points[i]
|
102
|
+
d = point.latlng_distance_squared_from_segment(segment)
|
103
|
+
if d > max_d
|
104
|
+
max_i = i
|
105
|
+
max_d = d
|
106
|
+
end
|
98
107
|
end
|
99
|
-
end
|
100
108
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
return simple_points
|
109
|
+
if max_d > latlng_error2
|
110
|
+
stack.push([max_i, right])
|
111
|
+
stack.push([left, max_i])
|
112
|
+
else
|
113
|
+
ret << points[right]
|
114
|
+
end
|
108
115
|
end
|
116
|
+
|
117
|
+
ret
|
109
118
|
end
|
110
119
|
|
111
120
|
def create_interpolated_point(point_before, point_after, fraction_after, options = {})
|
@@ -46,19 +46,22 @@ module ServerSideGoogleMaps
|
|
46
46
|
latitude_difference * latitude_difference + longitude_difference * longitude_difference
|
47
47
|
end
|
48
48
|
|
49
|
-
def latlng_distance_squared_from_segment(
|
49
|
+
def latlng_distance_squared_from_segment(segment)
|
50
|
+
p1 = segment.first
|
51
|
+
|
50
52
|
vx = p1.latitude - latitude
|
51
53
|
vy = p1.longitude - longitude
|
52
54
|
|
53
|
-
return vx*vx + vy*vy if
|
55
|
+
return vx*vx + vy*vy if segment.length2 == 0
|
54
56
|
|
55
|
-
ux =
|
56
|
-
uy =
|
57
|
-
length2 = ux*ux + uy*uy
|
57
|
+
ux = segment.dlat
|
58
|
+
uy = segment.dlon
|
58
59
|
|
59
60
|
det = (-vx*ux) + (-vy*uy)
|
60
61
|
|
62
|
+
length2 = segment.length2
|
61
63
|
if det < 0 || det > length2
|
64
|
+
p2 = segment.last
|
62
65
|
# We're outside the line segment
|
63
66
|
wx = p2.latitude - latitude
|
64
67
|
wy = p2.longitude - longitude
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ServerSideGoogleMaps
|
2
|
+
class Segment
|
3
|
+
attr_reader(:first, :last)
|
4
|
+
|
5
|
+
def initialize(point1, point2)
|
6
|
+
@first = point1
|
7
|
+
@last = point2
|
8
|
+
end
|
9
|
+
|
10
|
+
def dlat
|
11
|
+
@dlat ||= last.latitude - first.latitude
|
12
|
+
end
|
13
|
+
|
14
|
+
def dlon
|
15
|
+
@dlon ||= last.longitude - first.longitude
|
16
|
+
end
|
17
|
+
|
18
|
+
def length2
|
19
|
+
@length2 ||= dlat * dlat + dlon * dlon
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_a
|
23
|
+
[first, last]
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def calculate_length2
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/point_spec.rb
CHANGED
@@ -48,7 +48,7 @@ module ServerSideGoogleMaps
|
|
48
48
|
p2 = Point.new(-1.0, 9.1)
|
49
49
|
p3 = Point.new(7.0, 1.0)
|
50
50
|
|
51
|
-
distance2 = p2.latlng_distance_squared_from_segment(p1, p3)
|
51
|
+
distance2 = p2.latlng_distance_squared_from_segment(Segment.new(p1, p3))
|
52
52
|
distance2.should == p2.latlng_distance_squared(p1)
|
53
53
|
end
|
54
54
|
|
@@ -57,7 +57,7 @@ module ServerSideGoogleMaps
|
|
57
57
|
p2 = Point.new(-1.0, 9.1)
|
58
58
|
p3 = Point.new(1.0, 7.0)
|
59
59
|
|
60
|
-
distance2 = p2.latlng_distance_squared_from_segment(p1, p3)
|
60
|
+
distance2 = p2.latlng_distance_squared_from_segment(Segment.new(p1, p3))
|
61
61
|
distance2.should == p2.latlng_distance_squared(p1)
|
62
62
|
end
|
63
63
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec'
|
2
|
+
|
3
|
+
module ServerSideGoogleMaps
|
4
|
+
describe(Segment) do
|
5
|
+
describe('#first') do
|
6
|
+
it('should return the first element') do
|
7
|
+
point1 = Point.new(1, 2)
|
8
|
+
point2 = Point.new(2, 3)
|
9
|
+
segment = Segment.new(point1, point2)
|
10
|
+
segment.first.should == point1
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe('#last') do
|
15
|
+
it('should return the last element') do
|
16
|
+
point1 = Point.new(1, 2)
|
17
|
+
point2 = Point.new(2, 3)
|
18
|
+
segment = Segment.new(point1, point2)
|
19
|
+
segment.last.should == point2
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe('#length2') do
|
24
|
+
it('should return the length squared') do
|
25
|
+
point1 = Point.new(1, 2)
|
26
|
+
point2 = Point.new(2, 3)
|
27
|
+
segment = Segment.new(point1, point2)
|
28
|
+
segment.length2.should == 2
|
29
|
+
end
|
30
|
+
|
31
|
+
it('should return 0 for zero-length segment') do
|
32
|
+
point = Point.new(1, 2)
|
33
|
+
segment = Segment.new(point, point)
|
34
|
+
segment.length2.should == 0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe('#to_a') do
|
39
|
+
it('should return the array') do
|
40
|
+
p1 = Point.new(1, 2)
|
41
|
+
p2 = Point.new(2, 3)
|
42
|
+
segment = Segment.new(p1, p2)
|
43
|
+
a = segment.to_a
|
44
|
+
a.length.should == 2
|
45
|
+
a[0].should == p1
|
46
|
+
a[1].should == p2
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
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:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 1
|
9
8
|
- 2
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
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-06-
|
18
|
+
date: 2011-06-15 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: httparty
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- lib/server-side-google-maps/path.rb
|
79
79
|
- lib/server-side-google-maps/point.rb
|
80
80
|
- lib/server-side-google-maps/route.rb
|
81
|
+
- lib/server-side-google-maps/segment.rb
|
81
82
|
- lib/server-side-google-maps/server.rb
|
82
83
|
- lib/server-side-google-maps/version.rb
|
83
84
|
- server-side-google-maps.gemspec
|
@@ -91,6 +92,7 @@ files:
|
|
91
92
|
- spec/path_spec.rb
|
92
93
|
- spec/point_spec.rb
|
93
94
|
- spec/route_spec.rb
|
95
|
+
- spec/segment_spec.rb
|
94
96
|
- spec/spec.rb
|
95
97
|
homepage: http://github.com/adamh/server-side-google-maps
|
96
98
|
licenses: []
|