douglas_peucker 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +24 -0
- data/Rakefile +7 -0
- data/douglas_peucker.gemspec +21 -0
- data/lib/douglas_peucker.rb +7 -0
- data/lib/douglas_peucker/line.rb +3 -0
- data/lib/douglas_peucker/line_simplifier.rb +50 -0
- data/lib/douglas_peucker/orthogonal_distance.rb +18 -0
- data/lib/douglas_peucker/point.rb +3 -0
- data/lib/douglas_peucker/version.rb +3 -0
- data/spec/douglas_peucker/line_simplifier_spec.rb +459 -0
- data/spec/douglas_peucker/orthogonal_distance_spec.rb +42 -0
- data/spec/spec_helper.rb +3 -0
- metadata +83 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2011 Josh Clayton
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Douglas-Peucker Algorithm
|
2
|
+
|
3
|
+
This algorithm simplifies a line by recursively dividing a line and removing points outside of a predefined threshold. Check out the [Wikipedia page](http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm) to read up on it more.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
>> require "douglas_peucker"
|
8
|
+
=> true
|
9
|
+
>> line = [[0, 0], [1, 1], [2, 1], [3, 2.5], [4, 4]]
|
10
|
+
=> [[0, 0], [1, 1], [2, 1], [3, 2.5], [4, 4]]
|
11
|
+
>> DouglasPeucker::LineSimplifier.new(line).threshold(1).points
|
12
|
+
=> [[0, 0], [4, 4]]
|
13
|
+
>> DouglasPeucker::LineSimplifier.new(line).threshold(0.5).points
|
14
|
+
=> [[0, 0], [2, 1], [4, 4]]
|
15
|
+
>> DouglasPeucker::LineSimplifier.new(line).points
|
16
|
+
=> [[0, 0], [1, 1], [2, 1], [4, 4]]
|
17
|
+
|
18
|
+
## License
|
19
|
+
|
20
|
+
See the LICENSE
|
21
|
+
|
22
|
+
## Author
|
23
|
+
|
24
|
+
Written by Josh Clayton, although the algorithm and its various implementations have been written before.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "douglas_peucker/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "douglas_peucker"
|
7
|
+
s.version = DouglasPeucker::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Josh Clayton"]
|
10
|
+
s.email = ["joshua.clayton@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{A Ruby implementation of the Douglas–Peucker algorithm}
|
13
|
+
s.summary = %q{A Ruby implementation of the Douglas–Peucker algorithm}
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_development_dependency("rspec", "~> 2.6.0")
|
21
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
module DouglasPeucker
|
2
|
+
autoload :Line, "douglas_peucker/line"
|
3
|
+
autoload :Point, "douglas_peucker/point"
|
4
|
+
autoload :OrthogonalDistance, "douglas_peucker/orthogonal_distance"
|
5
|
+
autoload :LineSimplifier, "douglas_peucker/line_simplifier"
|
6
|
+
autoload :Version, "douglas_peucker/version"
|
7
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module DouglasPeucker
|
2
|
+
class LineSimplifier
|
3
|
+
|
4
|
+
def initialize(points)
|
5
|
+
@points = points
|
6
|
+
@threshold = 10e-8
|
7
|
+
end
|
8
|
+
|
9
|
+
def threshold(threshold)
|
10
|
+
@threshold = threshold
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def points
|
15
|
+
calculate_points(@points)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def orthogonal_distance(point, line_start, line_end)
|
21
|
+
line = Line.new(Point.new(line_start[0], line_start[1]), Point.new(line_end[0], line_end[1]))
|
22
|
+
point = Point.new(point[0], point[1])
|
23
|
+
OrthogonalDistance.new(point, line).distance
|
24
|
+
end
|
25
|
+
|
26
|
+
def calculate_points(points)
|
27
|
+
return points if points.length < 3
|
28
|
+
|
29
|
+
maximum_distance = 0
|
30
|
+
index = 0
|
31
|
+
|
32
|
+
(1..(points.length - 1)).each do |i|
|
33
|
+
current_distance = orthogonal_distance(points[i], points.first, points.last)
|
34
|
+
if current_distance > maximum_distance
|
35
|
+
index = i
|
36
|
+
maximum_distance = current_distance
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if maximum_distance >= @threshold
|
41
|
+
results_1 = calculate_points(points[0..index])
|
42
|
+
results_2 = calculate_points(points[index..-1])
|
43
|
+
|
44
|
+
results_1[0..-2] + results_2
|
45
|
+
else
|
46
|
+
[points.first, points.last]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DouglasPeucker
|
2
|
+
# From http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html
|
3
|
+
class OrthogonalDistance < Struct.new(:point, :line)
|
4
|
+
def distance
|
5
|
+
numerator.abs/denominator**0.5
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def numerator
|
11
|
+
((line.end.x - line.start.x)*(line.start.y - point.y) - (line.start.x - point.x)*(line.end.y - line.start.y))
|
12
|
+
end
|
13
|
+
|
14
|
+
def denominator
|
15
|
+
(line.end.x - line.start.x)**2 + (line.end.y - line.start.y)**2
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,459 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe DouglasPeucker::LineSimplifier, "with two points" do
|
4
|
+
let(:line) { [[0, 0], [99, 1]] }
|
5
|
+
|
6
|
+
it "returns both points with a small threshold" do
|
7
|
+
DouglasPeucker::LineSimplifier.new(line).threshold(10e-5).points.should == line
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns both points with a big threshold" do
|
11
|
+
DouglasPeucker::LineSimplifier.new(line).threshold(99).points.should == line
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe DouglasPeucker::LineSimplifier, "with a simple line" do
|
16
|
+
let(:line) { [[0, 0], [2, 0], [4, 4]] }
|
17
|
+
|
18
|
+
it "includes all three points if threshold is zero" do
|
19
|
+
DouglasPeucker::LineSimplifier.new(line).threshold(10e-5).points.should == line
|
20
|
+
end
|
21
|
+
|
22
|
+
it "includes all three points if threshold is too small" do
|
23
|
+
DouglasPeucker::LineSimplifier.new(line).threshold(1).points.should == line
|
24
|
+
DouglasPeucker::LineSimplifier.new(line).threshold((2**0.5).round(5)).points.should == line
|
25
|
+
end
|
26
|
+
|
27
|
+
it "excludes points if threshold is big enough" do
|
28
|
+
DouglasPeucker::LineSimplifier.new(line).threshold((2**0.5) + 0.3).points.should == [[0, 0], [4, 4]]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe DouglasPeucker::LineSimplifier, "with a bigger line" do
|
33
|
+
let(:line) do
|
34
|
+
[
|
35
|
+
[0, 0],
|
36
|
+
[1, 1],
|
37
|
+
[2, 1],
|
38
|
+
[3, 2.5],
|
39
|
+
[4, 4]
|
40
|
+
]
|
41
|
+
end
|
42
|
+
|
43
|
+
it "oversimplifies with a large threshold" do
|
44
|
+
DouglasPeucker::LineSimplifier.new(line).threshold(2).points.should == [[0, 0], [4, 4]]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# List of points from
|
49
|
+
# http://www.phpriot.com/articles/reducing-map-path-douglas-peucker-algorithm/4
|
50
|
+
describe DouglasPeucker::LineSimplifier, "with a massive line" do
|
51
|
+
let(:line) do
|
52
|
+
[
|
53
|
+
[-33.3240789844364,115.638325287067],
|
54
|
+
[-33.3240755555556,115.638360555556],
|
55
|
+
[-33.3240722222222,115.638396666667],
|
56
|
+
[-33.3240783333333,115.638419444444],
|
57
|
+
[-33.3246238888889,115.638753333333],
|
58
|
+
[-33.3246716666667,115.638813888889],
|
59
|
+
[-33.3247216666667,115.638857777778],
|
60
|
+
[-33.3247783333333,115.638908333333],
|
61
|
+
[-33.3248188888889,115.638933333333],
|
62
|
+
[-33.3248483333333,115.638941666667],
|
63
|
+
[-33.3248366666667,115.63901],
|
64
|
+
[-33.3246905555556,115.639496666667],
|
65
|
+
[-33.3244577777778,115.639959444444],
|
66
|
+
[-33.3243933333333,115.640034444444],
|
67
|
+
[-33.3247722222222,115.64049],
|
68
|
+
[-33.3250116666667,115.640761666667],
|
69
|
+
[-33.3252088888889,115.640923888889],
|
70
|
+
[-33.3254516666667,115.641070555556],
|
71
|
+
[-33.3258016666667,115.641201666667],
|
72
|
+
[-33.3260861111111,115.641242777778],
|
73
|
+
[-33.3262483333333,115.641245555556],
|
74
|
+
[-33.3264027777778,115.641217777778],
|
75
|
+
[-33.3266022222222,115.64116],
|
76
|
+
[-33.3267394444444,115.641115555556],
|
77
|
+
[-33.3271016666667,115.640994444444],
|
78
|
+
[-33.32748,115.640953888889],
|
79
|
+
[-33.3278433333333,115.640965],
|
80
|
+
[-33.3278988888889,115.640971666667],
|
81
|
+
[-33.3280316666667,115.641007222222],
|
82
|
+
[-33.3282477777778,115.641089444444],
|
83
|
+
[-33.3284666666667,115.641213888889],
|
84
|
+
[-33.3286688888889,115.641335],
|
85
|
+
[-33.3292377777778,115.641728333333],
|
86
|
+
[-33.3297683333333,115.642054444444],
|
87
|
+
[-33.3307816666667,115.642637222222],
|
88
|
+
[-33.3316822222222,115.643195],
|
89
|
+
[-33.3317516666667,115.643238333333],
|
90
|
+
[-33.3336577777778,115.644440555556],
|
91
|
+
[-33.3339866666667,115.644631666667],
|
92
|
+
[-33.3348883333333,115.645208333333],
|
93
|
+
[-33.33618,115.646065555556],
|
94
|
+
[-33.3363022222222,115.646147777778],
|
95
|
+
[-33.3365594444444,115.646294444444],
|
96
|
+
[-33.33716,115.646660555556],
|
97
|
+
[-33.3372666666667,115.646722777778],
|
98
|
+
[-33.3375916666667,115.646892222222],
|
99
|
+
[-33.3383216666667,115.647232777778],
|
100
|
+
[-33.3385261111111,115.647322777778],
|
101
|
+
[-33.3386222222222,115.647397777778],
|
102
|
+
[-33.3389205555556,115.647555555556],
|
103
|
+
[-33.3395622222222,115.647913333333],
|
104
|
+
[-33.3399055555556,115.648169444444],
|
105
|
+
[-33.34017,115.648402777778],
|
106
|
+
[-33.3402622222222,115.648500555556],
|
107
|
+
[-33.3405927777778,115.648932777778],
|
108
|
+
[-33.3407822222222,115.649263333333],
|
109
|
+
[-33.3408994444444,115.649528888889],
|
110
|
+
[-33.3409622222222,115.64974],
|
111
|
+
[-33.3409805555556,115.649866111111],
|
112
|
+
[-33.3410077777778,115.650059444444],
|
113
|
+
[-33.3410266666667,115.650232777778],
|
114
|
+
[-33.3410333333333,115.650487222222],
|
115
|
+
[-33.3410283333333,115.650679444444],
|
116
|
+
[-33.341005,115.650836666667],
|
117
|
+
[-33.3409177777778,115.651433888889],
|
118
|
+
[-33.3408427777778,115.651975555556],
|
119
|
+
[-33.3407094444444,115.652796666667],
|
120
|
+
[-33.340705,115.652825],
|
121
|
+
[-33.34062,115.653385555556],
|
122
|
+
[-33.3405794444444,115.653650555556],
|
123
|
+
[-33.3405572222222,115.653795555556],
|
124
|
+
[-33.340415,115.654651111111],
|
125
|
+
[-33.3401177777778,115.654593333333],
|
126
|
+
[-33.3396,115.654533888889],
|
127
|
+
[-33.3392644444444,115.654541666667],
|
128
|
+
[-33.3386505555556,115.654514444444],
|
129
|
+
[-33.3384444444444,115.654475555556],
|
130
|
+
[-33.3383433333333,115.654471111111],
|
131
|
+
[-33.337535,115.654371666667],
|
132
|
+
[-33.3364127777778,115.654178888889],
|
133
|
+
[-33.336375,115.654177222222],
|
134
|
+
[-33.3363755555556,115.65417],
|
135
|
+
[-33.3363755555556,115.654162222222],
|
136
|
+
[-33.3363755555556,115.654153888889],
|
137
|
+
[-33.3363744444444,115.654145555556],
|
138
|
+
[-33.3363733333333,115.654137777778],
|
139
|
+
[-33.3363716666667,115.654129444444],
|
140
|
+
[-33.3363694444444,115.654121666667],
|
141
|
+
[-33.3363672222222,115.654114444444],
|
142
|
+
[-33.3363638888889,115.654106666667],
|
143
|
+
[-33.3363605555556,115.654099444444],
|
144
|
+
[-33.3363566666667,115.654092777778],
|
145
|
+
[-33.3363527777778,115.654086111111],
|
146
|
+
[-33.3363483333333,115.65408],
|
147
|
+
[-33.3363433333333,115.654073888889],
|
148
|
+
[-33.3363383333333,115.654068888889],
|
149
|
+
[-33.3363327777778,115.654063888889],
|
150
|
+
[-33.3363272222222,115.654058888889],
|
151
|
+
[-33.3363211111111,115.654055],
|
152
|
+
[-33.336315,115.654051666667],
|
153
|
+
[-33.3363083333333,115.654048333333],
|
154
|
+
[-33.3363022222222,115.654045555556],
|
155
|
+
[-33.3362955555556,115.654043333333],
|
156
|
+
[-33.3362883333333,115.654042222222],
|
157
|
+
[-33.3362816666667,115.654041111111],
|
158
|
+
[-33.336275,115.654040555556],
|
159
|
+
[-33.3362677777778,115.654040555556],
|
160
|
+
[-33.3362611111111,115.654041111111],
|
161
|
+
[-33.3362544444444,115.654042222222],
|
162
|
+
[-33.3362477777778,115.654044444444],
|
163
|
+
[-33.3362411111111,115.654046666667],
|
164
|
+
[-33.3362344444444,115.654049444444],
|
165
|
+
[-33.3362283333333,115.654052777778],
|
166
|
+
[-33.3362222222222,115.654056111111],
|
167
|
+
[-33.3362161111111,115.654060555556],
|
168
|
+
[-33.3362105555556,115.654065],
|
169
|
+
[-33.336205,115.654070555556],
|
170
|
+
[-33.3362,115.654076111111],
|
171
|
+
[-33.3361955555556,115.654081666667],
|
172
|
+
[-33.3361911111111,115.654088333333],
|
173
|
+
[-33.3361872222222,115.654095],
|
174
|
+
[-33.3361833333333,115.654101666667],
|
175
|
+
[-33.33618,115.654108888889],
|
176
|
+
[-33.3361772222222,115.654116666667],
|
177
|
+
[-33.336175,115.654124444444],
|
178
|
+
[-33.3361727777778,115.654132222222],
|
179
|
+
[-33.3361711111111,115.65414],
|
180
|
+
[-33.3361705555556,115.654148333333],
|
181
|
+
[-33.3361694444444,115.654156666667],
|
182
|
+
[-33.3361694444444,115.654164444444],
|
183
|
+
[-33.33617,115.654172777778],
|
184
|
+
[-33.3361705555556,115.654181111111],
|
185
|
+
[-33.3361716666667,115.654188888889],
|
186
|
+
[-33.3361733333333,115.654197222222],
|
187
|
+
[-33.3361755555556,115.654205],
|
188
|
+
[-33.3361783333333,115.654212222222],
|
189
|
+
[-33.3361811111111,115.65422],
|
190
|
+
[-33.3361844444444,115.654227222222],
|
191
|
+
[-33.3361883333333,115.654233888889],
|
192
|
+
[-33.3361922222222,115.654240555556],
|
193
|
+
[-33.3361966666667,115.654246666667],
|
194
|
+
[-33.3362016666667,115.654252222222],
|
195
|
+
[-33.3362066666667,115.654257777778],
|
196
|
+
[-33.3362122222222,115.654262777778],
|
197
|
+
[-33.3362177777778,115.654267222222],
|
198
|
+
[-33.3362238888889,115.654271666667],
|
199
|
+
[-33.33623,115.654275],
|
200
|
+
[-33.3362366666667,115.654278333333],
|
201
|
+
[-33.3362433333333,115.654281111111],
|
202
|
+
[-33.33625,115.654282777778],
|
203
|
+
[-33.3362566666667,115.654284444444],
|
204
|
+
[-33.3362633333333,115.654285555556],
|
205
|
+
[-33.3362705555556,115.654286111111],
|
206
|
+
[-33.3362594444444,115.657527222222],
|
207
|
+
[-33.3362694444444,115.658115],
|
208
|
+
[-33.3362772222222,115.661860555556],
|
209
|
+
[-33.3362666666667,115.663044444444],
|
210
|
+
[-33.3362588888889,115.663943888889],
|
211
|
+
[-33.3362666666667,115.664742777778],
|
212
|
+
[-33.3362638888889,115.664801111111],
|
213
|
+
[-33.3362094444444,115.664952777778],
|
214
|
+
[-33.3361661111111,115.665025],
|
215
|
+
[-33.3361244444444,115.665072777778],
|
216
|
+
[-33.3360622222222,115.66512],
|
217
|
+
[-33.3359894444444,115.665158333333],
|
218
|
+
[-33.3358877777778,115.665172777778],
|
219
|
+
[-33.3357855555556,115.665168333333],
|
220
|
+
[-33.335585,115.665027777778],
|
221
|
+
[-33.3350388888889,115.664572777778],
|
222
|
+
[-33.3345688888889,115.664177222222],
|
223
|
+
[-33.333825,115.663587777778],
|
224
|
+
[-33.3328094444444,115.662822222222],
|
225
|
+
[-33.3325316666667,115.662621111111],
|
226
|
+
[-33.3323305555556,115.662475],
|
227
|
+
[-33.3322338888889,115.662401111111],
|
228
|
+
[-33.3321866666667,115.662373333333],
|
229
|
+
[-33.3321555555556,115.662366111111],
|
230
|
+
[-33.3321172222222,115.662363333333],
|
231
|
+
[-33.3320261111111,115.662363333333],
|
232
|
+
[-33.3318933333333,115.662373888889],
|
233
|
+
[-33.3319111111111,115.66242],
|
234
|
+
[-33.3319816666667,115.662791666667],
|
235
|
+
[-33.3320411111111,115.663145],
|
236
|
+
[-33.3320822222222,115.663462222222],
|
237
|
+
[-33.3321,115.663766666667],
|
238
|
+
[-33.332095,115.664183333333],
|
239
|
+
[-33.3320761111111,115.664577777778],
|
240
|
+
[-33.3320144444444,115.664891666667],
|
241
|
+
[-33.3319433333333,115.665122222222],
|
242
|
+
[-33.3322855555556,115.665379444444],
|
243
|
+
[-33.3331094444444,115.666027222222],
|
244
|
+
[-33.3335483333333,115.666373888889],
|
245
|
+
[-33.3336416666667,115.666491666667],
|
246
|
+
[-33.3338494444444,115.666663333333],
|
247
|
+
[-33.334155,115.666840555556],
|
248
|
+
[-33.3348594444444,115.667103888889],
|
249
|
+
[-33.3350183333333,115.667190555556],
|
250
|
+
[-33.335155,115.667307222222],
|
251
|
+
[-33.3352505555556,115.667408333333],
|
252
|
+
[-33.3353327777778,115.667505],
|
253
|
+
[-33.335585,115.667743333333],
|
254
|
+
[-33.3358294444444,115.668190555556],
|
255
|
+
[-33.3359744444444,115.66853],
|
256
|
+
[-33.3360222222222,115.668892777778],
|
257
|
+
[-33.3360344444444,115.669116666667],
|
258
|
+
[-33.3360388888889,115.669197222222],
|
259
|
+
[-33.33605,115.670768888889],
|
260
|
+
[-33.3360455555556,115.672128888889],
|
261
|
+
[-33.3360255555556,115.674903888889],
|
262
|
+
[-33.3360227777778,115.676181111111],
|
263
|
+
[-33.3360094444444,115.677107777778],
|
264
|
+
[-33.3359277777778,115.678325],
|
265
|
+
[-33.3357772222222,115.679310555556],
|
266
|
+
[-33.3354888888889,115.680615],
|
267
|
+
[-33.3353194444444,115.681237222222],
|
268
|
+
[-33.3349355555556,115.682392222222],
|
269
|
+
[-33.3346111111111,115.683531666667],
|
270
|
+
[-33.3343683333333,115.684342222222],
|
271
|
+
[-33.3340466666667,115.685418888889],
|
272
|
+
[-33.3336411111111,115.686831111111],
|
273
|
+
[-33.3335783333333,115.687009444444],
|
274
|
+
[-33.3335166666667,115.687186111111],
|
275
|
+
[-33.3333222222222,115.687761111111],
|
276
|
+
[-33.3330883333333,115.688365555556],
|
277
|
+
[-33.3327988888889,115.689008333333],
|
278
|
+
[-33.3325322222222,115.689537222222],
|
279
|
+
[-33.3322255555556,115.690066111111],
|
280
|
+
[-33.3319261111111,115.690547222222],
|
281
|
+
[-33.3315672222222,115.69107],
|
282
|
+
[-33.3314077777778,115.691283888889],
|
283
|
+
[-33.3310461111111,115.691757222222],
|
284
|
+
[-33.3298994444444,115.693195],
|
285
|
+
[-33.3291927777778,115.694116111111],
|
286
|
+
[-33.3287655555556,115.694647222222],
|
287
|
+
[-33.3280827777778,115.695564444444],
|
288
|
+
[-33.3276688888889,115.696246111111],
|
289
|
+
[-33.3276005555556,115.696347777778],
|
290
|
+
[-33.3274927777778,115.696505],
|
291
|
+
[-33.3274327777778,115.696578333333],
|
292
|
+
[-33.3273633333333,115.696640555556],
|
293
|
+
[-33.3273061111111,115.696677777778],
|
294
|
+
[-33.3272094444444,115.696726111111],
|
295
|
+
[-33.3271427777778,115.696745555556],
|
296
|
+
[-33.3270638888889,115.696761111111],
|
297
|
+
[-33.3268266666667,115.696790555556],
|
298
|
+
[-33.3266177777778,115.6968],
|
299
|
+
[-33.3265144444444,115.696808888889],
|
300
|
+
[-33.3263777777778,115.696821666667],
|
301
|
+
[-33.3262744444444,115.696834444444],
|
302
|
+
[-33.3261411111111,115.696861666667],
|
303
|
+
[-33.3258988888889,115.696919444444],
|
304
|
+
[-33.3257561111111,115.696950555556],
|
305
|
+
[-33.3255227777778,115.69699],
|
306
|
+
[-33.325365,115.697006666667],
|
307
|
+
[-33.3251983333333,115.69702],
|
308
|
+
[-33.3250888888889,115.697021666667],
|
309
|
+
[-33.3249761111111,115.69702],
|
310
|
+
[-33.3247816666667,115.697001111111],
|
311
|
+
[-33.3245933333333,115.696989444444],
|
312
|
+
[-33.3244227777778,115.696955555556],
|
313
|
+
[-33.324355,115.696985],
|
314
|
+
[-33.3240672222222,115.696919444444],
|
315
|
+
[-33.3230883333333,115.696683333333],
|
316
|
+
[-33.32234,115.696469444444],
|
317
|
+
[-33.3217983333333,115.696355],
|
318
|
+
[-33.321045,115.696186111111],
|
319
|
+
[-33.3208144444444,115.696146111111],
|
320
|
+
[-33.3191055555556,115.695857777778],
|
321
|
+
[-33.3173294444444,115.695498333333],
|
322
|
+
[-33.3168344444444,115.695422777778],
|
323
|
+
[-33.3160822222222,115.695284444444],
|
324
|
+
[-33.3158644444444,115.695241666667],
|
325
|
+
[-33.3152672222222,115.695123888889],
|
326
|
+
[-33.3152677777778,115.695121111111],
|
327
|
+
[-33.3152688888889,115.695108888889],
|
328
|
+
[-33.31527,115.695096666667],
|
329
|
+
[-33.3152705555556,115.695085],
|
330
|
+
[-33.3152705555556,115.695072777778],
|
331
|
+
[-33.3152705555556,115.695060555556],
|
332
|
+
[-33.3152694444444,115.695048333333],
|
333
|
+
[-33.3152683333333,115.695036666667],
|
334
|
+
[-33.3152666666667,115.695024444444],
|
335
|
+
[-33.3152644444444,115.695012777778],
|
336
|
+
[-33.3152616666667,115.695001111111],
|
337
|
+
[-33.3152588888889,115.694989444444],
|
338
|
+
[-33.315255,115.694978333333],
|
339
|
+
[-33.3152511111111,115.694967222222],
|
340
|
+
[-33.3152466666667,115.694956111111],
|
341
|
+
[-33.3152422222222,115.694945555556],
|
342
|
+
[-33.3152366666667,115.694935],
|
343
|
+
[-33.3152311111111,115.694925],
|
344
|
+
[-33.3152255555556,115.694915],
|
345
|
+
[-33.3152188888889,115.694905555556],
|
346
|
+
[-33.3152122222222,115.694896111111],
|
347
|
+
[-33.3152055555556,115.694887777778],
|
348
|
+
[-33.3151983333333,115.694879444444],
|
349
|
+
[-33.3151905555556,115.694871111111],
|
350
|
+
[-33.3151827777778,115.694863888889],
|
351
|
+
[-33.3151744444444,115.694856666667],
|
352
|
+
[-33.3151661111111,115.69485],
|
353
|
+
[-33.3151572222222,115.694843888889],
|
354
|
+
[-33.3151483333333,115.694837777778],
|
355
|
+
[-33.3151388888889,115.694832777778],
|
356
|
+
[-33.3151294444444,115.694827777778],
|
357
|
+
[-33.31512,115.694823888889],
|
358
|
+
[-33.3151105555556,115.69482],
|
359
|
+
[-33.3151005555556,115.694816666667],
|
360
|
+
[-33.3150905555556,115.694813888889],
|
361
|
+
[-33.3150805555556,115.694811666667],
|
362
|
+
[-33.3150705555556,115.69481],
|
363
|
+
[-33.3150638888889,115.694809444444],
|
364
|
+
[-33.3150605555556,115.694809444444],
|
365
|
+
[-33.3150505555556,115.694808888889],
|
366
|
+
[-33.3150405555556,115.694808888889],
|
367
|
+
[-33.31503,115.694809444444],
|
368
|
+
[-33.31502,115.694810555556],
|
369
|
+
[-33.31501,115.694812222222],
|
370
|
+
[-33.315,115.694814444444],
|
371
|
+
[-33.31499,115.694817222222],
|
372
|
+
[-33.3149805555556,115.694820555556],
|
373
|
+
[-33.3149705555556,115.694823888889],
|
374
|
+
[-33.3149611111111,115.694828333333],
|
375
|
+
[-33.3149516666667,115.694833333333],
|
376
|
+
[-33.3149427777778,115.694838333333],
|
377
|
+
[-33.3149338888889,115.694844444444],
|
378
|
+
[-33.314925,115.694850555556],
|
379
|
+
[-33.3149166666667,115.694857222222],
|
380
|
+
[-33.3149083333333,115.694864444444],
|
381
|
+
[-33.3149005555556,115.694872222222],
|
382
|
+
[-33.3148927777778,115.69488],
|
383
|
+
[-33.3148855555556,115.694888333333],
|
384
|
+
[-33.3148788888889,115.694897222222],
|
385
|
+
[-33.3148722222222,115.694906666667],
|
386
|
+
[-33.3148661111111,115.694916111111],
|
387
|
+
[-33.31486,115.694926111111],
|
388
|
+
[-33.3148544444444,115.694936111111],
|
389
|
+
[-33.3148494444444,115.694946666667],
|
390
|
+
[-33.3148444444444,115.694957222222],
|
391
|
+
[-33.31484,115.694968333333],
|
392
|
+
[-33.3148361111111,115.694979444444],
|
393
|
+
[-33.3148327777778,115.694991111111],
|
394
|
+
[-33.31483,115.695002222222],
|
395
|
+
[-33.3148272222222,115.695013888889],
|
396
|
+
[-33.314825,115.695026111111],
|
397
|
+
[-33.3148233333333,115.695037777778],
|
398
|
+
[-33.3148222222222,115.69505],
|
399
|
+
[-33.3148216666667,115.695062222222],
|
400
|
+
[-33.3148211111111,115.695073888889],
|
401
|
+
[-33.3147438888889,115.695072222222],
|
402
|
+
[-33.3145216666667,115.695077222222],
|
403
|
+
[-33.3142655555556,115.695102222222],
|
404
|
+
[-33.3138061111111,115.695135555556],
|
405
|
+
[-33.31346,115.695201666667],
|
406
|
+
[-33.3130127777778,115.695333888889],
|
407
|
+
[-33.3125211111111,115.695484444444],
|
408
|
+
[-33.3123194444444,115.695587222222],
|
409
|
+
[-33.3120872222222,115.695690555556],
|
410
|
+
[-33.3118622222222,115.695798333333],
|
411
|
+
[-33.31175,115.695856666667],
|
412
|
+
[-33.3115977777778,115.69595],
|
413
|
+
[-33.3114672222222,115.696025555556],
|
414
|
+
[-33.3113183333333,115.696106111111],
|
415
|
+
[-33.3111855555556,115.696187777778],
|
416
|
+
[-33.31112,115.696235555556],
|
417
|
+
[-33.3109944444444,115.696335],
|
418
|
+
[-33.3108894444444,115.696411666667],
|
419
|
+
[-33.3107816666667,115.696497222222],
|
420
|
+
[-33.3106561111111,115.696602777778],
|
421
|
+
[-33.3098788888889,115.697270555556],
|
422
|
+
[-33.3097755555556,115.697339444444],
|
423
|
+
[-33.3097555555556,115.697353333333],
|
424
|
+
[-33.3097444444444,115.697361111111],
|
425
|
+
[-33.3093833333333,115.697713333333],
|
426
|
+
[-33.3090761111111,115.697967777778],
|
427
|
+
[-33.3087366666667,115.698245555556],
|
428
|
+
[-33.3085644444444,115.698388888889],
|
429
|
+
[-33.3083677777778,115.698551666667],
|
430
|
+
[-33.30808,115.698808888889],
|
431
|
+
[-33.3076816666667,115.699201111111],
|
432
|
+
[-33.3071077777778,115.699707777778],
|
433
|
+
[-33.30673,115.700068333333],
|
434
|
+
[-33.3063894444444,115.700397777778],
|
435
|
+
[-33.30606,115.700706666667],
|
436
|
+
[-33.3057366666667,115.700995],
|
437
|
+
[-33.3054838888889,115.701237777778],
|
438
|
+
[-33.3055772222222,115.701379444444],
|
439
|
+
[-33.30561,115.701519444444],
|
440
|
+
[-33.3056127777778,115.701662777778],
|
441
|
+
[-33.3056261111111,115.702640555556],
|
442
|
+
[-33.3056266666667,115.702681111111],
|
443
|
+
[-33.3056583333333,115.702921111111],
|
444
|
+
[-33.3057144444444,115.703187222222],
|
445
|
+
[-33.3057894444444,115.703453888889],
|
446
|
+
[-33.3059144444444,115.703747222222],
|
447
|
+
[-33.30613,115.704095],
|
448
|
+
[-33.3063644444444,115.704267222222],
|
449
|
+
[-33.3068955555556,115.704573888889],
|
450
|
+
[-33.3077883333333,115.704722777778],
|
451
|
+
[-33.30797,115.704753333333],
|
452
|
+
[-33.3082938888889,115.704819444444]
|
453
|
+
]
|
454
|
+
end
|
455
|
+
|
456
|
+
it "simplifies the line correctly" do
|
457
|
+
DouglasPeucker::LineSimplifier.new(line).threshold(0.00005).points.length.should == 70
|
458
|
+
end
|
459
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe DouglasPeucker::OrthogonalDistance do
|
4
|
+
context "with a horizontal line" do
|
5
|
+
let(:line) do
|
6
|
+
DouglasPeucker::Line.new(DouglasPeucker::Point.new(0,0), DouglasPeucker::Point.new(4,0))
|
7
|
+
end
|
8
|
+
|
9
|
+
it "calculates distance correctly" do
|
10
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(2, 0), line).distance.should == 0
|
11
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(2, 2), line).distance.should == 2
|
12
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(4, 4), line).distance.should == 4
|
13
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(2, -2), line).distance.should == 2
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "with a vertical line" do
|
18
|
+
let(:line) do
|
19
|
+
DouglasPeucker::Line.new(DouglasPeucker::Point.new(0,0), DouglasPeucker::Point.new(0,4))
|
20
|
+
end
|
21
|
+
|
22
|
+
it "calculates distance correctly" do
|
23
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(2, 0), line).distance.should == 2
|
24
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(2, 2), line).distance.should == 2
|
25
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(4, 4), line).distance.should == 4
|
26
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(-2, 2), line).distance.should == 2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "with a sloped line" do
|
31
|
+
let(:line) do
|
32
|
+
DouglasPeucker::Line.new(DouglasPeucker::Point.new(0,0), DouglasPeucker::Point.new(4,4))
|
33
|
+
end
|
34
|
+
|
35
|
+
it "calculates distance correctly" do
|
36
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(1, 1), line).distance.should == 0
|
37
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(2, 2), line).distance.should == 0
|
38
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(4, 0), line).distance.should be_within(1e-9).of(2*2**0.5)
|
39
|
+
DouglasPeucker::OrthogonalDistance.new(DouglasPeucker::Point.new(2, 0), line).distance.should be_within(1e-9).of(2**0.5)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: douglas_peucker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Josh Clayton
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-09-04 00:00:00 -04:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rspec
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 2.6.0
|
25
|
+
type: :development
|
26
|
+
version_requirements: *id001
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- joshua.clayton@gmail.com
|
30
|
+
executables: []
|
31
|
+
|
32
|
+
extensions: []
|
33
|
+
|
34
|
+
extra_rdoc_files: []
|
35
|
+
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- Gemfile
|
39
|
+
- LICENSE
|
40
|
+
- README.md
|
41
|
+
- Rakefile
|
42
|
+
- douglas_peucker.gemspec
|
43
|
+
- lib/douglas_peucker.rb
|
44
|
+
- lib/douglas_peucker/line.rb
|
45
|
+
- lib/douglas_peucker/line_simplifier.rb
|
46
|
+
- lib/douglas_peucker/orthogonal_distance.rb
|
47
|
+
- lib/douglas_peucker/point.rb
|
48
|
+
- lib/douglas_peucker/version.rb
|
49
|
+
- spec/douglas_peucker/line_simplifier_spec.rb
|
50
|
+
- spec/douglas_peucker/orthogonal_distance_spec.rb
|
51
|
+
- spec/spec_helper.rb
|
52
|
+
has_rdoc: true
|
53
|
+
homepage: ""
|
54
|
+
licenses: []
|
55
|
+
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
requirements: []
|
74
|
+
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 1.6.2
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: "A Ruby implementation of the Douglas\xE2\x80\x93Peucker algorithm"
|
80
|
+
test_files:
|
81
|
+
- spec/douglas_peucker/line_simplifier_spec.rb
|
82
|
+
- spec/douglas_peucker/orthogonal_distance_spec.rb
|
83
|
+
- spec/spec_helper.rb
|