server-side-google-maps 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []