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.
@@ -78,34 +78,43 @@ module ServerSideGoogleMaps
78
78
  end
79
79
 
80
80
  def simplify(latlng_error2)
81
- simplified_points = douglas_peucker_step(points, latlng_error2)
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 douglas_peucker_step(points, latlng_error2)
88
- simple_points = [ points.first, points.last ]
89
- max_i = 0
90
- max_d = 0
91
-
92
- points.each_with_index do |point, i|
93
- next if i == 0 || i == points.length - 1
94
- d = point.latlng_distance_squared_from_segment(points.first, points.last)
95
- if d > max_d
96
- max_d = d
97
- max_i = i
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
- if max_d > latlng_error2
102
- simple1 = douglas_peucker_step(points[0..max_i], latlng_error2)
103
- simple2 = douglas_peucker_step(points[max_i..-1], latlng_error2)
104
- simple1.pop
105
- return simple1.concat(simple2)
106
- else
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(p1, p2)
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 p1 == p2
55
+ return vx*vx + vy*vy if segment.length2 == 0
54
56
 
55
- ux = p2.latitude - p1.latitude
56
- uy = p2.longitude - p1.longitude
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
@@ -1,3 +1,3 @@
1
1
  module ServerSideGoogleMaps
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -8,6 +8,7 @@ require 'server-side-google-maps/path'
8
8
  require 'server-side-google-maps/point'
9
9
  require 'server-side-google-maps/route'
10
10
  require 'server-side-google-maps/server'
11
+ require 'server-side-google-maps/segment'
11
12
 
12
13
  module ServerSideGoogleMaps
13
14
  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: 31
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
8
  - 2
10
- version: 0.1.2
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-10 00:00:00 Z
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: []