ffi-geos 0.5.0 → 1.0.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/README.rdoc +14 -100
- data/lib/ffi-geos.rb +18 -3
- data/lib/ffi-geos/coordinate_sequence.rb +2 -2
- data/lib/ffi-geos/geometry.rb +7 -1
- data/lib/ffi-geos/interrupt.rb +7 -7
- data/lib/ffi-geos/line_string.rb +16 -1
- data/lib/ffi-geos/point.rb +1 -1
- data/lib/ffi-geos/polygon.rb +1 -1
- data/lib/ffi-geos/strtree.rb +7 -1
- data/lib/ffi-geos/tools.rb +31 -5
- data/lib/ffi-geos/utils.rb +6 -18
- data/lib/ffi-geos/version.rb +1 -1
- data/lib/ffi-geos/wkb_reader.rb +7 -0
- data/lib/ffi-geos/wkb_writer.rb +1 -1
- data/lib/ffi-geos/wkt_reader.rb +5 -0
- data/lib/ffi-geos/wkt_writer.rb +2 -2
- data/test/coordinate_sequence_tests.rb +23 -23
- data/test/geometry_collection_tests.rb +6 -1
- data/test/geometry_tests.rb +356 -554
- data/test/interrupt_tests.rb +1 -1
- data/test/line_string_tests.rb +65 -37
- data/test/linear_ring_tests.rb +10 -3
- data/test/misc_tests.rb +1 -1
- data/test/point_tests.rb +6 -1
- data/test/polygon_tests.rb +2 -2
- data/test/prepared_geometry_tests.rb +1 -1
- data/test/strtree_tests.rb +2 -2
- data/test/test_helper.rb +56 -3
- data/test/tools_tests.rb +2 -2
- data/test/utils_tests.rb +35 -43
- data/test/wkb_reader_tests.rb +13 -1
- data/test/wkb_writer_tests.rb +29 -3
- data/test/wkt_reader_tests.rb +2 -2
- data/test/wkt_writer_tests.rb +4 -4
- metadata +2 -2
data/lib/ffi-geos/version.rb
CHANGED
data/lib/ffi-geos/wkb_reader.rb
CHANGED
@@ -6,6 +6,9 @@ module Geos
|
|
6
6
|
|
7
7
|
attr_reader :ptr
|
8
8
|
|
9
|
+
class ParseError < Geos::ParseError
|
10
|
+
end
|
11
|
+
|
9
12
|
def initialize(*args)
|
10
13
|
ptr = if args.first.is_a?(FFI::Pointer)
|
11
14
|
args.first
|
@@ -23,12 +26,16 @@ module Geos
|
|
23
26
|
cast_geometry_ptr(FFIGeos.GEOSWKBReader_read_r(Geos.current_handle, self.ptr, wkb, wkb.bytesize), {
|
24
27
|
:srid => options[:srid]
|
25
28
|
})
|
29
|
+
rescue Geos::GEOSException => e
|
30
|
+
raise ParseError.new(e)
|
26
31
|
end
|
27
32
|
|
28
33
|
def read_hex(wkb, options = {})
|
29
34
|
cast_geometry_ptr(FFIGeos.GEOSWKBReader_readHEX_r(Geos.current_handle, self.ptr, wkb, wkb.bytesize), {
|
30
35
|
:srid => options[:srid]
|
31
36
|
})
|
37
|
+
rescue Geos::GEOSException => e
|
38
|
+
raise ParseError.new(e)
|
32
39
|
end
|
33
40
|
|
34
41
|
def self.release(ptr) #:nodoc:
|
data/lib/ffi-geos/wkb_writer.rb
CHANGED
@@ -58,7 +58,7 @@ module Geos
|
|
58
58
|
|
59
59
|
def output_dimensions=(dim)
|
60
60
|
if dim < 2 || dim > 3
|
61
|
-
raise
|
61
|
+
raise ArgumentError.new("Output dimensions must be either 2 or 3")
|
62
62
|
end
|
63
63
|
FFIGeos.GEOSWKBWriter_setOutputDimension_r(Geos.current_handle, self.ptr, dim)
|
64
64
|
end
|
data/lib/ffi-geos/wkt_reader.rb
CHANGED
@@ -6,6 +6,9 @@ module Geos
|
|
6
6
|
|
7
7
|
attr_reader :ptr
|
8
8
|
|
9
|
+
class ParseError < Geos::ParseError
|
10
|
+
end
|
11
|
+
|
9
12
|
def initialize(*args)
|
10
13
|
ptr = if args.first.is_a?(FFI::Pointer)
|
11
14
|
args.first
|
@@ -23,6 +26,8 @@ module Geos
|
|
23
26
|
cast_geometry_ptr(FFIGeos.GEOSWKTReader_read_r(Geos.current_handle, self.ptr, wkt), {
|
24
27
|
:srid => options[:srid]
|
25
28
|
})
|
29
|
+
rescue Geos::GEOSException => e
|
30
|
+
raise ParseError.new(e)
|
26
31
|
end
|
27
32
|
|
28
33
|
def self.release(ptr) #:nodoc:
|
data/lib/ffi-geos/wkt_writer.rb
CHANGED
@@ -70,7 +70,7 @@ module Geos
|
|
70
70
|
def rounding_precision=(r)
|
71
71
|
r = r.to_i
|
72
72
|
if r > 255
|
73
|
-
raise
|
73
|
+
raise ArgumentError.new("Rounding precision cannot be greater than 255")
|
74
74
|
end
|
75
75
|
|
76
76
|
@rounding_precision = r
|
@@ -93,7 +93,7 @@ module Geos
|
|
93
93
|
def output_dimensions=(dim)
|
94
94
|
dim = dim.to_i
|
95
95
|
if dim < 2 || dim > 3
|
96
|
-
raise
|
96
|
+
raise ArgumentError.new("Output dimensions must be either 2 or 3")
|
97
97
|
end
|
98
98
|
FFIGeos.GEOSWKTWriter_setOutputDimension_r(Geos.current_handle, self.ptr, dim)
|
99
99
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
$: << File.dirname(__FILE__)
|
4
4
|
require 'test_helper'
|
5
5
|
|
6
|
-
class CoordinateSequenceTests <
|
6
|
+
class CoordinateSequenceTests < Minitest::Test
|
7
7
|
include TestHelper
|
8
8
|
|
9
9
|
def setup
|
@@ -45,29 +45,29 @@ class CoordinateSequenceTests < MiniTest::Unit::TestCase
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_check_bounds
|
48
|
-
assert_raises(
|
49
|
-
assert_raises(
|
48
|
+
assert_raises(Geos::IndexBoundsError) { @cs.set_x(10, 0.1) }
|
49
|
+
assert_raises(Geos::IndexBoundsError) { @cs.set_x(-1, 0.1) }
|
50
50
|
|
51
|
-
assert_raises(
|
52
|
-
assert_raises(
|
51
|
+
assert_raises(Geos::IndexBoundsError) { @cs.set_y(10, 0.1) }
|
52
|
+
assert_raises(Geos::IndexBoundsError) { @cs.set_y(-1, 0.1) }
|
53
53
|
|
54
|
-
assert_raises(
|
55
|
-
assert_raises(
|
54
|
+
assert_raises(Geos::IndexBoundsError) { @cs.set_z(10, 0.1) }
|
55
|
+
assert_raises(Geos::IndexBoundsError) { @cs.set_z(-1, 0.1) }
|
56
56
|
|
57
|
-
assert_raises(
|
58
|
-
assert_raises(
|
57
|
+
assert_raises(Geos::IndexBoundsError) { @cs.set_ordinate(10, 0, 0.1) }
|
58
|
+
assert_raises(Geos::IndexBoundsError) { @cs.set_ordinate(-1, 0, 0.1) }
|
59
59
|
|
60
|
-
assert_raises(
|
61
|
-
assert_raises(
|
60
|
+
assert_raises(Geos::IndexBoundsError) { @cs.get_x(10) }
|
61
|
+
assert_raises(Geos::IndexBoundsError) { @cs.get_x(-1) }
|
62
62
|
|
63
|
-
assert_raises(
|
64
|
-
assert_raises(
|
63
|
+
assert_raises(Geos::IndexBoundsError) { @cs.get_y(10) }
|
64
|
+
assert_raises(Geos::IndexBoundsError) { @cs.get_y(-1) }
|
65
65
|
|
66
|
-
assert_raises(
|
67
|
-
assert_raises(
|
66
|
+
assert_raises(Geos::IndexBoundsError) { @cs.get_z(10) }
|
67
|
+
assert_raises(Geos::IndexBoundsError) { @cs.get_z(-1) }
|
68
68
|
|
69
|
-
assert_raises(
|
70
|
-
assert_raises(
|
69
|
+
assert_raises(Geos::IndexBoundsError) { @cs.get_ordinate(10, 0) }
|
70
|
+
assert_raises(Geos::IndexBoundsError) { @cs.get_ordinate(-1, 0) }
|
71
71
|
end
|
72
72
|
|
73
73
|
def test_clone
|
@@ -216,15 +216,15 @@ class CoordinateSequenceTests < MiniTest::Unit::TestCase
|
|
216
216
|
assert_equal('NaN', cs.z[0].to_s)
|
217
217
|
assert_equal('NaN', cs.z[1].to_s)
|
218
218
|
|
219
|
-
assert_raises(
|
219
|
+
assert_raises(Geos::IndexBoundsError) do
|
220
220
|
cs.x[100]
|
221
221
|
end
|
222
222
|
|
223
|
-
assert_raises(
|
223
|
+
assert_raises(Geos::IndexBoundsError) do
|
224
224
|
cs.y[100]
|
225
225
|
end
|
226
226
|
|
227
|
-
assert_raises(
|
227
|
+
assert_raises(Geos::IndexBoundsError) do
|
228
228
|
cs.z[100]
|
229
229
|
end
|
230
230
|
end
|
@@ -243,15 +243,15 @@ class CoordinateSequenceTests < MiniTest::Unit::TestCase
|
|
243
243
|
assert_equal(2, cs.get_y(0))
|
244
244
|
assert_equal(11, cs.get_y(1))
|
245
245
|
|
246
|
-
assert_raises(
|
246
|
+
assert_raises(Geos::IndexBoundsError) do
|
247
247
|
cs.x[100] = 10
|
248
248
|
end
|
249
249
|
|
250
|
-
assert_raises(
|
250
|
+
assert_raises(Geos::IndexBoundsError) do
|
251
251
|
cs.y[100] = 10
|
252
252
|
end
|
253
253
|
|
254
|
-
assert_raises(
|
254
|
+
assert_raises(Geos::IndexBoundsError) do
|
255
255
|
cs.z[100] = 10
|
256
256
|
end
|
257
257
|
end
|
@@ -3,9 +3,14 @@
|
|
3
3
|
$: << File.dirname(__FILE__)
|
4
4
|
require 'test_helper'
|
5
5
|
|
6
|
-
class GeometryCollectionTests <
|
6
|
+
class GeometryCollectionTests < Minitest::Test
|
7
7
|
include TestHelper
|
8
8
|
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
writer.trim = true
|
12
|
+
end
|
13
|
+
|
9
14
|
def test_geometry_collection_enumerator
|
10
15
|
skip unless ENV['FORCE_TESTS'] || Geos::GeometryCollection.method_defined?(:[])
|
11
16
|
|
data/test/geometry_tests.rb
CHANGED
@@ -3,125 +3,123 @@
|
|
3
3
|
$: << File.dirname(__FILE__)
|
4
4
|
require 'test_helper'
|
5
5
|
|
6
|
-
class GeometryTests <
|
6
|
+
class GeometryTests < Minitest::Test
|
7
7
|
include TestHelper
|
8
8
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
args = method_with_args
|
13
|
-
|
14
|
-
geom_1 = read(geom_a)
|
15
|
-
geom_b = read(geom_b)
|
16
|
-
result = geom_1.send(method, geom_b, *args)
|
17
|
-
assert_geom_eql_exact(read(expected), result)
|
18
|
-
end
|
19
|
-
|
20
|
-
def self_tester(method_with_args, g, expected)
|
21
|
-
method_with_args = Array(method_with_args)
|
22
|
-
geom = read(g)
|
23
|
-
result = geom.send(*method_with_args)
|
24
|
-
assert_geom_eql_exact(read(expected), result)
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
writer.trim = true
|
25
12
|
end
|
26
13
|
|
27
14
|
def test_intersection
|
28
15
|
comparison_tester(
|
29
16
|
:intersection,
|
30
|
-
'POLYGON((
|
31
|
-
'POLYGON((
|
32
|
-
'POLYGON((5
|
17
|
+
'POLYGON ((5 10, 10 10, 10 5, 5 5, 5 10))',
|
18
|
+
'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))',
|
19
|
+
'POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))'
|
33
20
|
)
|
34
21
|
end
|
35
22
|
|
36
23
|
def test_buffer
|
37
|
-
|
38
|
-
width, params = args
|
39
|
-
assert_equal(expected, write(read(geom).buffer(width, params)))
|
40
|
-
}
|
24
|
+
writer.rounding_precision = 2
|
41
25
|
|
42
|
-
|
43
|
-
|
44
|
-
|
26
|
+
simple_tester(
|
27
|
+
:buffer,
|
28
|
+
'POLYGON EMPTY',
|
29
|
+
'POINT(0 0)',
|
30
|
+
0
|
31
|
+
)
|
45
32
|
|
46
|
-
|
47
|
-
|
33
|
+
simple_tester(
|
34
|
+
:buffer,
|
35
|
+
'POLYGON ((10 0, 9.8 -2, 9.2 -3.8, 8.3 -5.6, 7.1 -7.1, 5.6 -8.3, 3.8 -9.2, 2 -9.8, 1.6e-14 -10, -2 -9.8, -3.8 -9.2, -5.6 -8.3, -7.1 -7.1, -8.3 -5.6, -9.2 -3.8, -9.8 -2, -10 -3.2e-14, -9.8 2, -9.2 3.8, -8.3 5.6, -7.1 7.1, -5.6 8.3, -3.8 9.2, -2 9.8, -3.7e-14 10, 2 9.8, 3.8 9.2, 5.6 8.3, 7.1 7.1, 8.3 5.6, 9.2 3.8, 9.8 2, 10 0))',
|
48
36
|
'POINT(0 0)',
|
49
37
|
10
|
50
|
-
|
38
|
+
)
|
51
39
|
|
52
40
|
# One segment per quadrant
|
53
|
-
|
54
|
-
|
41
|
+
simple_tester(
|
42
|
+
:buffer,
|
43
|
+
'POLYGON ((10 0, 1.6e-14 -10, -10 -3.2e-14, -4.6e-14 10, 10 0))',
|
55
44
|
'POINT(0 0)',
|
56
45
|
10,
|
57
46
|
{ :quad_segs => 1 }
|
58
|
-
|
47
|
+
)
|
59
48
|
|
60
49
|
# End cap styles
|
61
|
-
|
62
|
-
|
50
|
+
simple_tester(
|
51
|
+
:buffer,
|
52
|
+
'POLYGON ((1e+02 10, 1.1e+02 0, 1e+02 -10, 0 -10, -10 1.2e-15, 0 10, 1e+02 10))',
|
63
53
|
'LINESTRING(0 0, 100 0)',
|
64
54
|
10,
|
65
55
|
{ :quad_segs => 1, :endcap => :round }
|
66
|
-
|
56
|
+
)
|
67
57
|
|
68
|
-
|
69
|
-
|
58
|
+
simple_tester(
|
59
|
+
:buffer,
|
60
|
+
'POLYGON ((1e+02 10, 1e+02 -10, 0 -10, 0 10, 1e+02 10))',
|
70
61
|
'LINESTRING(0 0, 100 0)',
|
71
62
|
10,
|
72
63
|
{ :quad_segs => 1, :endcap => :flat }
|
73
|
-
|
64
|
+
)
|
74
65
|
|
75
|
-
|
76
|
-
|
66
|
+
simple_tester(
|
67
|
+
:buffer,
|
68
|
+
'POLYGON ((1e+02 10, 1.1e+02 10, 1.1e+02 -10, 0 -10, -10 -10, -10 10, 1e+02 10))',
|
77
69
|
'LINESTRING(0 0, 100 0)',
|
78
70
|
10,
|
79
71
|
{ :quad_segs => 1, :endcap => :square }
|
80
|
-
|
72
|
+
)
|
81
73
|
|
82
74
|
# Join styles
|
83
|
-
|
84
|
-
|
75
|
+
simple_tester(
|
76
|
+
:buffer,
|
77
|
+
'POLYGON ((90 10, 90 1e+02, 93 1.1e+02, 1e+02 1.1e+02, 1.1e+02 1.1e+02, 1.1e+02 1e+02, 1.1e+02 0, 1.1e+02 -7.1, 1e+02 -10, 0 -10, -7.1 -7.1, -10 1.2e-15, -7.1 7.1, 0 10, 90 10))',
|
85
78
|
'LINESTRING(0 0, 100 0, 100 100)',
|
86
79
|
10,
|
87
80
|
{ :quad_segs => 2, :join => :round }
|
88
|
-
|
81
|
+
)
|
89
82
|
|
90
|
-
|
91
|
-
|
83
|
+
simple_tester(
|
84
|
+
:buffer,
|
85
|
+
'POLYGON ((90 10, 90 1e+02, 93 1.1e+02, 1e+02 1.1e+02, 1.1e+02 1.1e+02, 1.1e+02 1e+02, 1.1e+02 0, 1e+02 -10, 0 -10, -7.1 -7.1, -10 1.2e-15, -7.1 7.1, 0 10, 90 10))',
|
92
86
|
'LINESTRING(0 0, 100 0, 100 100)',
|
93
87
|
10,
|
94
88
|
{ :quad_segs => 2, :join => :bevel }
|
95
|
-
|
89
|
+
)
|
96
90
|
|
97
|
-
|
98
|
-
|
91
|
+
simple_tester(
|
92
|
+
:buffer,
|
93
|
+
'POLYGON ((90 10, 90 1e+02, 93 1.1e+02, 1e+02 1.1e+02, 1.1e+02 1.1e+02, 1.1e+02 1e+02, 1.1e+02 -10, 0 -10, -7.1 -7.1, -10 1.2e-15, -7.1 7.1, 0 10, 90 10))',
|
99
94
|
'LINESTRING(0 0, 100 0, 100 100)',
|
100
95
|
10,
|
101
96
|
{ :quad_segs => 2, :join => :mitre }
|
102
|
-
|
97
|
+
)
|
103
98
|
|
104
|
-
|
105
|
-
|
99
|
+
simple_tester(
|
100
|
+
:buffer,
|
101
|
+
'POLYGON ((90 10, 90 1e+02, 93 1.1e+02, 1e+02 1.1e+02, 1.1e+02 1.1e+02, 1.1e+02 1e+02, 1.1e+02 -5, 1e+02 -9.1, 0 -10, -7.1 -7.1, -10 1.2e-15, -7.1 7.1, 0 10, 90 10))',
|
106
102
|
'LINESTRING(0 0, 100 0, 100 100)',
|
107
103
|
10,
|
108
104
|
{ :quad_segs => 2, :join => :mitre, :mitre_limit => 1.0 }
|
109
|
-
|
105
|
+
)
|
110
106
|
|
111
107
|
# Single-sided buffering
|
112
|
-
|
113
|
-
|
108
|
+
simple_tester(
|
109
|
+
:buffer,
|
110
|
+
'POLYGON ((1e+02 0, 0 0, 0 10, 1e+02 10, 1e+02 0))',
|
114
111
|
'LINESTRING(0 0, 100 0)',
|
115
112
|
10,
|
116
113
|
{ :single_sided => true }
|
117
|
-
|
114
|
+
)
|
118
115
|
|
119
|
-
|
120
|
-
|
116
|
+
simple_tester(
|
117
|
+
:buffer,
|
118
|
+
'POLYGON ((0 0, 1e+02 0, 1e+02 -10, 0 -10, 0 0))',
|
121
119
|
'LINESTRING(0 0, 100 0)',
|
122
120
|
-10,
|
123
121
|
{ :single_sided => true }
|
124
|
-
|
122
|
+
)
|
125
123
|
end
|
126
124
|
|
127
125
|
def test_convex_hull
|
@@ -138,447 +136,358 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
138
136
|
def test_difference
|
139
137
|
comparison_tester(
|
140
138
|
:difference,
|
139
|
+
'GEOMETRYCOLLECTION EMPTY',
|
141
140
|
'POINT(0 0)',
|
142
|
-
'POINT(0 0)'
|
143
|
-
'GEOMETRYCOLLECTION EMPTY'
|
141
|
+
'POINT(0 0)'
|
144
142
|
)
|
145
143
|
|
146
144
|
comparison_tester(
|
147
145
|
:difference,
|
146
|
+
'POINT (0 0)',
|
148
147
|
'POINT(0 0)',
|
149
|
-
'POINT(1 0)'
|
150
|
-
'POINT (0 0)'
|
148
|
+
'POINT(1 0)'
|
151
149
|
)
|
152
150
|
|
153
151
|
comparison_tester(
|
154
152
|
:difference,
|
153
|
+
'LINESTRING (0 0, 10 0)',
|
155
154
|
'LINESTRING(0 0, 10 0)',
|
156
|
-
'POINT(5 0)'
|
157
|
-
'LINESTRING (0 0, 10 0)'
|
155
|
+
'POINT(5 0)'
|
158
156
|
)
|
159
157
|
|
160
158
|
comparison_tester(
|
161
159
|
:difference,
|
160
|
+
'GEOMETRYCOLLECTION EMPTY',
|
162
161
|
'POINT(5 0)',
|
163
|
-
'LINESTRING(0 0, 10 0)'
|
164
|
-
'GEOMETRYCOLLECTION EMPTY'
|
162
|
+
'LINESTRING(0 0, 10 0)'
|
165
163
|
)
|
166
164
|
|
167
165
|
comparison_tester(
|
168
166
|
:difference,
|
167
|
+
'POINT (5 0)',
|
169
168
|
'POINT(5 0)',
|
170
|
-
'LINESTRING(0 1, 10 1)'
|
171
|
-
'POINT (5 0)'
|
169
|
+
'LINESTRING(0 1, 10 1)'
|
172
170
|
)
|
173
171
|
|
174
172
|
comparison_tester(
|
175
173
|
:difference,
|
174
|
+
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0))',
|
176
175
|
'LINESTRING(0 0, 10 0)',
|
177
|
-
'LINESTRING(5 -10, 5 10)'
|
178
|
-
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0))'
|
176
|
+
'LINESTRING(5 -10, 5 10)'
|
179
177
|
)
|
180
178
|
|
181
179
|
comparison_tester(
|
182
180
|
:difference,
|
181
|
+
'LINESTRING (0 0, 5 0)',
|
183
182
|
'LINESTRING(0 0, 10 0)',
|
184
|
-
'LINESTRING(5 0, 20 0)'
|
185
|
-
'LINESTRING (0 0, 5 0)'
|
183
|
+
'LINESTRING(5 0, 20 0)'
|
186
184
|
)
|
187
185
|
|
188
186
|
comparison_tester(
|
189
187
|
:difference,
|
188
|
+
'POLYGON ((5 0, 0 0, 0 10, 5 10, 10 10, 10 0, 5 0))',
|
190
189
|
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
191
|
-
'LINESTRING(5 -10, 5 10)'
|
192
|
-
'POLYGON ((5 0, 0 0, 0 10, 5 10, 10 10, 10 0, 5 0))'
|
190
|
+
'LINESTRING(5 -10, 5 10)'
|
193
191
|
)
|
194
192
|
|
195
193
|
comparison_tester(
|
196
194
|
:difference,
|
195
|
+
'POLYGON ((10 0, 0 0, 0 10, 10 10, 10 0))',
|
197
196
|
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
198
|
-
'LINESTRING(10 0, 20 0)'
|
199
|
-
'POLYGON ((10 0, 0 0, 0 10, 10 10, 10 0))'
|
197
|
+
'LINESTRING(10 0, 20 0)'
|
200
198
|
)
|
201
199
|
|
202
200
|
comparison_tester(
|
203
201
|
:difference,
|
202
|
+
'POLYGON ((5 0, 0 0, 0 10, 10 10, 10 5, 5 5, 5 0))',
|
204
203
|
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
205
|
-
'POLYGON((5 -5, 5 5, 15 5, 15 -5, 5 -5))'
|
206
|
-
'POLYGON ((5 0, 0 0, 0 10, 10 10, 10 5, 5 5, 5 0))'
|
204
|
+
'POLYGON((5 -5, 5 5, 15 5, 15 -5, 5 -5))'
|
207
205
|
)
|
208
206
|
end
|
209
207
|
|
210
208
|
def test_sym_difference
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
def test_symmetric_difference
|
283
|
-
comparison_tester(
|
284
|
-
:symmetric_difference,
|
285
|
-
'POINT(0 0)',
|
286
|
-
'POINT(0 0)',
|
287
|
-
'GEOMETRYCOLLECTION EMPTY'
|
288
|
-
)
|
289
|
-
|
290
|
-
comparison_tester(
|
291
|
-
:symmetric_difference,
|
292
|
-
'POINT(0 0)',
|
293
|
-
'POINT(1 0)',
|
294
|
-
'MULTIPOINT (0 0, 1 0)'
|
295
|
-
)
|
296
|
-
|
297
|
-
comparison_tester(
|
298
|
-
:symmetric_difference,
|
299
|
-
'LINESTRING(0 0, 10 0)',
|
300
|
-
'POINT(5 0)',
|
301
|
-
'LINESTRING (0 0, 10 0)'
|
302
|
-
)
|
303
|
-
|
304
|
-
comparison_tester(
|
305
|
-
:symmetric_difference,
|
306
|
-
'POINT(5 0)',
|
307
|
-
'LINESTRING(0 0, 10 0)',
|
308
|
-
'LINESTRING (0 0, 10 0)'
|
309
|
-
)
|
310
|
-
|
311
|
-
comparison_tester(
|
312
|
-
:symmetric_difference,
|
313
|
-
'POINT(5 0)',
|
314
|
-
'LINESTRING(0 1, 10 1)',
|
315
|
-
'GEOMETRYCOLLECTION (POINT (5 0), LINESTRING (0 1, 10 1))'
|
316
|
-
)
|
317
|
-
|
318
|
-
comparison_tester(
|
319
|
-
:symmetric_difference,
|
320
|
-
'LINESTRING(0 0, 10 0)',
|
321
|
-
'LINESTRING(5 -10, 5 10)',
|
322
|
-
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0), (5 -10, 5 0), (5 0, 5 10))'
|
323
|
-
)
|
324
|
-
|
325
|
-
comparison_tester(
|
326
|
-
:symmetric_difference,
|
327
|
-
'LINESTRING(0 0, 10 0)',
|
328
|
-
'LINESTRING(5 0, 20 0)',
|
329
|
-
'MULTILINESTRING ((0 0, 5 0), (10 0, 20 0))'
|
330
|
-
)
|
331
|
-
|
332
|
-
comparison_tester(
|
333
|
-
:symmetric_difference,
|
334
|
-
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
335
|
-
'LINESTRING(5 -10, 5 10)',
|
336
|
-
'GEOMETRYCOLLECTION (LINESTRING (5 -10, 5 0), POLYGON ((5 0, 0 0, 0 10, 5 10, 10 10, 10 0, 5 0)))'
|
337
|
-
)
|
338
|
-
|
339
|
-
comparison_tester(
|
340
|
-
:symmetric_difference,
|
341
|
-
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
342
|
-
'LINESTRING(10 0, 20 0)',
|
343
|
-
'GEOMETRYCOLLECTION (LINESTRING (10 0, 20 0), POLYGON ((10 0, 0 0, 0 10, 10 10, 10 0)))'
|
344
|
-
)
|
345
|
-
|
346
|
-
comparison_tester(
|
347
|
-
:symmetric_difference,
|
348
|
-
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
349
|
-
'POLYGON((5 -5, 5 5, 15 5, 15 -5, 5 -5))',
|
350
|
-
'MULTIPOLYGON (((5 0, 0 0, 0 10, 10 10, 10 5, 5 5, 5 0)), ((5 0, 10 0, 10 5, 15 5, 15 -5, 5 -5, 5 0)))'
|
351
|
-
)
|
209
|
+
%w{ sym_difference symmetric_difference }.each do |method|
|
210
|
+
comparison_tester(
|
211
|
+
method,
|
212
|
+
'GEOMETRYCOLLECTION EMPTY',
|
213
|
+
'POINT(0 0)',
|
214
|
+
'POINT(0 0)'
|
215
|
+
)
|
216
|
+
|
217
|
+
comparison_tester(
|
218
|
+
method,
|
219
|
+
'MULTIPOINT (0 0, 1 0)',
|
220
|
+
'POINT(0 0)',
|
221
|
+
'POINT(1 0)'
|
222
|
+
)
|
223
|
+
|
224
|
+
comparison_tester(
|
225
|
+
method,
|
226
|
+
'LINESTRING (0 0, 10 0)',
|
227
|
+
'LINESTRING(0 0, 10 0)',
|
228
|
+
'POINT(5 0)'
|
229
|
+
)
|
230
|
+
|
231
|
+
comparison_tester(
|
232
|
+
method,
|
233
|
+
'LINESTRING (0 0, 10 0)',
|
234
|
+
'POINT(5 0)',
|
235
|
+
'LINESTRING(0 0, 10 0)'
|
236
|
+
)
|
237
|
+
|
238
|
+
comparison_tester(
|
239
|
+
method,
|
240
|
+
'GEOMETRYCOLLECTION (POINT (5 0), LINESTRING (0 1, 10 1))',
|
241
|
+
'POINT(5 0)',
|
242
|
+
'LINESTRING(0 1, 10 1)'
|
243
|
+
)
|
244
|
+
|
245
|
+
comparison_tester(
|
246
|
+
method,
|
247
|
+
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0), (5 -10, 5 0), (5 0, 5 10))',
|
248
|
+
'LINESTRING(0 0, 10 0)',
|
249
|
+
'LINESTRING(5 -10, 5 10)'
|
250
|
+
)
|
251
|
+
|
252
|
+
comparison_tester(
|
253
|
+
method,
|
254
|
+
'MULTILINESTRING ((0 0, 5 0), (10 0, 20 0))',
|
255
|
+
'LINESTRING(0 0, 10 0)',
|
256
|
+
'LINESTRING(5 0, 20 0)'
|
257
|
+
)
|
258
|
+
|
259
|
+
comparison_tester(
|
260
|
+
method,
|
261
|
+
'GEOMETRYCOLLECTION (LINESTRING (5 -10, 5 0), POLYGON ((5 0, 0 0, 0 10, 5 10, 10 10, 10 0, 5 0)))',
|
262
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
263
|
+
'LINESTRING(5 -10, 5 10)'
|
264
|
+
)
|
265
|
+
|
266
|
+
comparison_tester(
|
267
|
+
method,
|
268
|
+
'GEOMETRYCOLLECTION (LINESTRING (10 0, 20 0), POLYGON ((10 0, 0 0, 0 10, 10 10, 10 0)))',
|
269
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
270
|
+
'LINESTRING(10 0, 20 0)'
|
271
|
+
)
|
272
|
+
|
273
|
+
comparison_tester(
|
274
|
+
method,
|
275
|
+
'MULTIPOLYGON (((5 0, 0 0, 0 10, 10 10, 10 5, 5 5, 5 0)), ((5 0, 10 0, 10 5, 15 5, 15 -5, 5 -5, 5 0)))',
|
276
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
277
|
+
'POLYGON((5 -5, 5 5, 15 5, 15 -5, 5 -5))'
|
278
|
+
)
|
279
|
+
end
|
352
280
|
end
|
353
281
|
|
354
282
|
def test_boundary
|
355
|
-
|
283
|
+
simple_tester(
|
356
284
|
:boundary,
|
357
|
-
'
|
358
|
-
'
|
285
|
+
'GEOMETRYCOLLECTION EMPTY',
|
286
|
+
'POINT(0 0)'
|
359
287
|
)
|
360
288
|
|
361
|
-
|
289
|
+
simple_tester(
|
362
290
|
:boundary,
|
363
|
-
'
|
364
|
-
'
|
291
|
+
'MULTIPOINT (0 0, 10 10)',
|
292
|
+
'LINESTRING(0 0, 10 10)'
|
365
293
|
)
|
366
294
|
|
367
|
-
|
295
|
+
simple_tester(
|
368
296
|
:boundary,
|
369
|
-
'
|
370
|
-
'
|
297
|
+
'MULTILINESTRING ((0 0, 10 0, 10 10, 0 10, 0 0), (5 5, 5 6, 6 6, 6 5, 5 5))',
|
298
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),( 5 5, 5 6, 6 6, 6 5, 5 5))'
|
371
299
|
)
|
372
300
|
end
|
373
301
|
|
374
302
|
def test_union
|
375
303
|
comparison_tester(
|
376
304
|
:union,
|
305
|
+
'POINT (0 0)',
|
377
306
|
'POINT(0 0)',
|
378
|
-
'POINT(0 0)'
|
379
|
-
'POINT (0 0)'
|
307
|
+
'POINT(0 0)'
|
380
308
|
)
|
381
309
|
|
382
310
|
comparison_tester(
|
383
311
|
:union,
|
312
|
+
'MULTIPOINT (0 0, 1 0)',
|
384
313
|
'POINT(0 0)',
|
385
|
-
'POINT(1 0)'
|
386
|
-
'MULTIPOINT (0 0, 1 0)'
|
314
|
+
'POINT(1 0)'
|
387
315
|
)
|
388
316
|
|
389
317
|
comparison_tester(
|
390
318
|
:union,
|
319
|
+
'LINESTRING (0 0, 10 0)',
|
391
320
|
'LINESTRING(0 0, 10 0)',
|
392
|
-
'POINT(5 0)'
|
393
|
-
'LINESTRING (0 0, 10 0)'
|
321
|
+
'POINT(5 0)'
|
394
322
|
)
|
395
323
|
|
396
324
|
comparison_tester(
|
397
325
|
:union,
|
326
|
+
'LINESTRING (0 0, 10 0)',
|
398
327
|
'POINT(5 0)',
|
399
|
-
'LINESTRING(0 0, 10 0)'
|
400
|
-
'LINESTRING (0 0, 10 0)'
|
328
|
+
'LINESTRING(0 0, 10 0)'
|
401
329
|
)
|
402
330
|
|
403
331
|
comparison_tester(
|
404
332
|
:union,
|
333
|
+
'GEOMETRYCOLLECTION (POINT (5 0), LINESTRING (0 1, 10 1))',
|
405
334
|
'POINT(5 0)',
|
406
|
-
'LINESTRING(0 1, 10 1)'
|
407
|
-
'GEOMETRYCOLLECTION (POINT (5 0), LINESTRING (0 1, 10 1))'
|
335
|
+
'LINESTRING(0 1, 10 1)'
|
408
336
|
)
|
409
337
|
|
410
338
|
comparison_tester(
|
411
339
|
:union,
|
340
|
+
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0), (5 -10, 5 0), (5 0, 5 10))',
|
412
341
|
'LINESTRING(0 0, 10 0)',
|
413
|
-
'LINESTRING(5 -10, 5 10)'
|
414
|
-
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0), (5 -10, 5 0), (5 0, 5 10))'
|
342
|
+
'LINESTRING(5 -10, 5 10)'
|
415
343
|
)
|
416
344
|
|
417
345
|
comparison_tester(
|
418
346
|
:union,
|
347
|
+
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0), (10 0, 20 0))',
|
419
348
|
'LINESTRING(0 0, 10 0)',
|
420
|
-
'LINESTRING(5 0, 20 0)'
|
421
|
-
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0), (10 0, 20 0))'
|
349
|
+
'LINESTRING(5 0, 20 0)'
|
422
350
|
)
|
423
351
|
|
424
352
|
comparison_tester(
|
425
353
|
:union,
|
354
|
+
'GEOMETRYCOLLECTION (LINESTRING (5 -10, 5 0), POLYGON ((5 0, 0 0, 0 10, 5 10, 10 10, 10 0, 5 0)))',
|
426
355
|
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
427
|
-
'LINESTRING(5 -10, 5 10)'
|
428
|
-
'GEOMETRYCOLLECTION (LINESTRING (5 -10, 5 0), POLYGON ((5 0, 0 0, 0 10, 5 10, 10 10, 10 0, 5 0)))'
|
356
|
+
'LINESTRING(5 -10, 5 10)'
|
429
357
|
)
|
430
358
|
|
431
359
|
comparison_tester(
|
432
360
|
:union,
|
361
|
+
'GEOMETRYCOLLECTION (LINESTRING (10 0, 20 0), POLYGON ((10 0, 0 0, 0 10, 10 10, 10 0)))',
|
433
362
|
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
434
|
-
'LINESTRING(10 0, 20 0)'
|
435
|
-
'GEOMETRYCOLLECTION (LINESTRING (10 0, 20 0), POLYGON ((10 0, 0 0, 0 10, 10 10, 10 0)))'
|
363
|
+
'LINESTRING(10 0, 20 0)'
|
436
364
|
)
|
437
365
|
|
438
366
|
comparison_tester(
|
439
367
|
:union,
|
368
|
+
'POLYGON ((5 0, 0 0, 0 10, 10 10, 10 5, 15 5, 15 -5, 5 -5, 5 0))',
|
440
369
|
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
441
|
-
'POLYGON((5 -5, 5 5, 15 5, 15 -5, 5 -5))'
|
442
|
-
'POLYGON ((5 0, 0 0, 0 10, 10 10, 10 5, 15 5, 15 -5, 5 -5, 5 0))'
|
370
|
+
'POLYGON((5 -5, 5 5, 15 5, 15 -5, 5 -5))'
|
443
371
|
)
|
444
372
|
end
|
445
373
|
|
446
374
|
def test_union_cascaded
|
447
375
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:union_cascaded)
|
448
376
|
|
449
|
-
|
377
|
+
simple_tester(
|
450
378
|
:union_cascaded,
|
379
|
+
'POLYGON ((1 0, 0 0, 0 1, 0 11, 10 11, 10 14, 14 14, 14 10, 11 10, 11 0, 1 0), (11 11, 12 11, 12 12, 11 12, 11 11))',
|
451
380
|
'MULTIPOLYGON(
|
452
381
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
453
382
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
454
383
|
(11 11, 11 12, 12 12, 12 11, 11 11)),
|
455
384
|
((0 0, 11 0, 11 11, 0 11, 0 0))
|
456
|
-
))'
|
457
|
-
'POLYGON ((
|
458
|
-
1 0, 0 0, 0 1, 0 11, 10 11,
|
459
|
-
10 14, 14 14, 14 10, 11 10,
|
460
|
-
11 0, 1 0
|
461
|
-
), (11 11, 12 11, 12 12, 11 12, 11 11))'
|
385
|
+
))'
|
462
386
|
)
|
463
387
|
end
|
464
388
|
|
465
389
|
def test_unary_union
|
466
390
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:unary_union)
|
467
391
|
|
468
|
-
|
392
|
+
simple_tester(
|
469
393
|
:unary_union,
|
394
|
+
'POLYGON ((1 0, 0 0, 0 1, 0 11, 10 11, 10 14, 14 14, 14 10, 11 10, 11 0, 1 0), (11 11, 12 11, 12 12, 11 12, 11 11))',
|
470
395
|
'MULTIPOLYGON(
|
471
396
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
472
397
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
473
398
|
(11 11, 11 12, 12 12, 12 11, 11 11)),
|
474
399
|
((0 0, 11 0, 11 11, 0 11, 0 0))
|
475
|
-
))'
|
476
|
-
'POLYGON ((
|
477
|
-
1 0, 0 0, 0 1, 0 11, 10 11,
|
478
|
-
10 14, 14 14, 14 10, 11 10,
|
479
|
-
11 0, 1 0
|
480
|
-
), (11 11, 12 11, 12 12, 11 12, 11 11))'
|
400
|
+
))'
|
481
401
|
)
|
482
402
|
end
|
483
403
|
|
484
404
|
def test_node
|
485
405
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:node)
|
486
406
|
|
487
|
-
|
407
|
+
simple_tester(
|
488
408
|
:node,
|
489
|
-
'
|
490
|
-
'
|
409
|
+
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0, 5 -5, 5 0), (5 0, 5 5))',
|
410
|
+
'LINESTRING(0 0, 10 0, 5 -5, 5 5)'
|
491
411
|
)
|
492
412
|
end
|
493
413
|
|
494
414
|
def test_union_without_arguments
|
495
|
-
|
415
|
+
simple_tester(
|
496
416
|
:union,
|
417
|
+
'POLYGON ((1 0, 0 0, 0 1, 0 11, 10 11, 10 14, 14 14, 14 10, 11 10, 11 0, 1 0), (11 11, 12 11, 12 12, 11 12, 11 11))',
|
497
418
|
'MULTIPOLYGON(
|
498
419
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
499
420
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
500
421
|
(11 11, 11 12, 12 12, 12 11, 11 11)),
|
501
422
|
((0 0, 11 0, 11 11, 0 11, 0 0))
|
502
|
-
))'
|
503
|
-
'POLYGON ((
|
504
|
-
1 0, 0 0, 0 1, 0 11, 10 11,
|
505
|
-
10 14, 14 14, 14 10, 11 10,
|
506
|
-
11 0, 1 0
|
507
|
-
), (11 11, 12 11, 12 12, 11 12, 11 11))'
|
423
|
+
))'
|
508
424
|
)
|
509
425
|
end
|
510
426
|
|
511
|
-
def
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
'POINT(0 0)',
|
535
|
-
'POINT(0 0)'
|
536
|
-
)
|
537
|
-
|
538
|
-
self_tester(
|
539
|
-
:representative_point,
|
540
|
-
'LINESTRING(0 0, 5 0, 10 0)',
|
541
|
-
'POINT (5 0)'
|
542
|
-
)
|
543
|
-
|
544
|
-
self_tester(
|
545
|
-
:representative_point,
|
546
|
-
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
547
|
-
'POINT (5 5)'
|
548
|
-
)
|
427
|
+
def test_point_on_surface_and_representative_point
|
428
|
+
%w{
|
429
|
+
point_on_surface
|
430
|
+
representative_point
|
431
|
+
}.each do |method|
|
432
|
+
simple_tester(
|
433
|
+
method,
|
434
|
+
'POINT (0 0)',
|
435
|
+
'POINT (0 0)'
|
436
|
+
)
|
437
|
+
|
438
|
+
simple_tester(
|
439
|
+
method,
|
440
|
+
'POINT (5 0)',
|
441
|
+
'LINESTRING(0 0, 5 0, 10 0)'
|
442
|
+
)
|
443
|
+
|
444
|
+
simple_tester(
|
445
|
+
method,
|
446
|
+
'POINT (5 5)',
|
447
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'
|
448
|
+
)
|
449
|
+
end
|
549
450
|
end
|
550
451
|
|
551
|
-
def
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
452
|
+
def test_centroid_and_center
|
453
|
+
%w{
|
454
|
+
centroid
|
455
|
+
center
|
456
|
+
}.each do |method|
|
457
|
+
simple_tester(
|
458
|
+
method,
|
459
|
+
'POINT (0 0)',
|
460
|
+
'POINT(0 0)'
|
461
|
+
)
|
462
|
+
|
463
|
+
simple_tester(
|
464
|
+
method,
|
465
|
+
'POINT (5 5)',
|
466
|
+
'LINESTRING(0 0, 10 10)'
|
467
|
+
)
|
468
|
+
|
469
|
+
writer.trim = true
|
470
|
+
writer.rounding_precision = 0
|
471
|
+
|
472
|
+
simple_tester(
|
473
|
+
method,
|
474
|
+
'POINT (5 4)',
|
475
|
+
'POLYGON((0 0, 0 10, 5 5, 10 10, 10 0, 0 0))'
|
476
|
+
)
|
477
|
+
end
|
569
478
|
end
|
570
479
|
|
571
480
|
def test_envelope
|
572
|
-
|
481
|
+
simple_tester(
|
573
482
|
:envelope,
|
574
|
-
'POINT(0 0)',
|
575
|
-
'POINT
|
483
|
+
'POINT (0 0)',
|
484
|
+
'POINT(0 0)'
|
576
485
|
)
|
577
486
|
|
578
|
-
|
487
|
+
simple_tester(
|
579
488
|
:envelope,
|
580
|
-
'
|
581
|
-
'
|
489
|
+
'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))',
|
490
|
+
'LINESTRING(0 0, 10 10)'
|
582
491
|
)
|
583
492
|
end
|
584
493
|
|
@@ -642,39 +551,39 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
642
551
|
end
|
643
552
|
|
644
553
|
def test_line_merge
|
645
|
-
|
554
|
+
simple_tester(
|
646
555
|
:line_merge,
|
556
|
+
'LINESTRING (0 0, 10 10, 10 0, 5 0, 5 -5)',
|
647
557
|
'MULTILINESTRING(
|
648
558
|
(0 0, 10 10),
|
649
559
|
(10 10, 10 0),
|
650
560
|
(5 0, 10 0),
|
651
561
|
(5 -5, 5 0)
|
652
|
-
|
653
|
-
'LINESTRING (0 0, 10 10, 10 0, 5 0, 5 -5)'
|
562
|
+
)'
|
654
563
|
)
|
655
564
|
end
|
656
565
|
|
657
566
|
def test_simplify
|
658
|
-
|
659
|
-
|
567
|
+
simple_tester(
|
568
|
+
:simplify,
|
569
|
+
'LINESTRING (0 0, 5 10, 10 0, 10 9, 0 9)',
|
660
570
|
'LINESTRING(0 0, 3 4, 5 10, 10 0, 10 9, 5 11, 0 9)',
|
661
|
-
|
571
|
+
2
|
662
572
|
)
|
663
573
|
end
|
664
574
|
|
665
575
|
def test_topology_preserve_simplify
|
666
|
-
|
667
|
-
|
576
|
+
simple_tester(
|
577
|
+
:topology_preserve_simplify,
|
578
|
+
'LINESTRING (0 0, 5 10, 10 0, 10 9, 5 11, 0 9)',
|
668
579
|
'LINESTRING(0 0, 3 4, 5 10, 10 0, 10 9, 5 11, 0 9)',
|
669
|
-
|
580
|
+
2
|
670
581
|
)
|
671
582
|
end
|
672
583
|
|
673
584
|
def test_extract_unique_points
|
674
585
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:extract_unique_points)
|
675
586
|
|
676
|
-
writer.rounding_precision = 0
|
677
|
-
|
678
587
|
geom = read('GEOMETRYCOLLECTION (
|
679
588
|
MULTIPOLYGON (
|
680
589
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
@@ -690,9 +599,10 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
690
599
|
LINESTRING EMPTY
|
691
600
|
')
|
692
601
|
|
693
|
-
|
602
|
+
simple_tester(
|
603
|
+
:extract_unique_points,
|
694
604
|
'MULTIPOINT (0 0, 1 0, 1 1, 0 1, 10 10, 10 14, 14 14, 14 10, 11 11, 11 12, 12 12, 12 11, 2 3, 3 4, 9 0)',
|
695
|
-
|
605
|
+
geom.extract_unique_points
|
696
606
|
)
|
697
607
|
end
|
698
608
|
|
@@ -855,11 +765,9 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
855
765
|
assert_equal(location, write(ret[:location]))
|
856
766
|
}
|
857
767
|
|
858
|
-
writer.rounding_precision = 0
|
859
|
-
|
860
768
|
assert_nil(read('POINT(0 0)').valid_detail)
|
861
769
|
tester["Invalid Coordinate", 'POINT (0 nan)', 'POINT(0 NaN)', 0]
|
862
|
-
tester["Self-intersection", 'POINT (2 5)', 'POLYGON((0 0, 0 5, 5 5, 5 10, 0 0))', 0]
|
770
|
+
tester["Self-intersection", 'POINT (2.5 5)', 'POLYGON((0 0, 0 5, 5 5, 5 10, 0 0))', 0]
|
863
771
|
|
864
772
|
tester["Ring Self-intersection", 'POINT (0 0)', 'POLYGON((0 0, -10 10, 10 10, 0 0, 4 5, -4 5, 0 0)))', 0]
|
865
773
|
|
@@ -886,22 +794,17 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
886
794
|
end
|
887
795
|
|
888
796
|
def test_num_geometries
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
tester[2, 'MULTIPOINT (0 1, 2 3)']
|
896
|
-
tester[1, 'LINESTRING (0 0, 2 3)']
|
897
|
-
tester[2, 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))']
|
898
|
-
tester[1, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))']
|
899
|
-
tester[2, 'MULTIPOLYGON(
|
797
|
+
simple_tester(:num_geometries, 1, 'POINT(0 0)')
|
798
|
+
simple_tester(:num_geometries, 2, 'MULTIPOINT (0 1, 2 3)')
|
799
|
+
simple_tester(:num_geometries, 1, 'LINESTRING (0 0, 2 3)')
|
800
|
+
simple_tester(:num_geometries, 2, 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))')
|
801
|
+
simple_tester(:num_geometries, 1, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
802
|
+
simple_tester(:num_geometries, 2, 'MULTIPOLYGON(
|
900
803
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
901
804
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
902
805
|
(11 11, 11 12, 12 12, 12 11, 11 11)))'
|
903
|
-
|
904
|
-
|
806
|
+
)
|
807
|
+
simple_tester(:num_geometries, 6, 'GEOMETRYCOLLECTION (
|
905
808
|
MULTIPOLYGON (
|
906
809
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
907
810
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
@@ -912,73 +815,48 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
912
815
|
LINESTRING (0 0, 2 3),
|
913
816
|
MULTIPOINT (0 0, 2 3),
|
914
817
|
POINT (9 0))'
|
915
|
-
|
818
|
+
)
|
916
819
|
end
|
917
820
|
|
918
821
|
# get_geometry_n is segfaulting in the binary GEOS build
|
919
822
|
def test_get_geometry_n
|
920
823
|
skip unless defined?(Geos::FFIGeos)
|
921
824
|
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
if expected.nil?
|
927
|
-
assert_nil(result)
|
928
|
-
else
|
929
|
-
assert_geom_eql_exact(result, read(expected))
|
930
|
-
end
|
931
|
-
}
|
932
|
-
|
933
|
-
tester['POINT(0 1)', 'MULTIPOINT (0 1, 2 3)', 0]
|
934
|
-
tester['POINT(2 3)', 'MULTIPOINT (0 1, 2 3)', 1]
|
935
|
-
tester[nil, 'MULTIPOINT (0 1, 2 3)', 2]
|
825
|
+
simple_tester(:get_geometry_n, 'POINT (0 1)', 'MULTIPOINT (0 1, 2 3)', 0)
|
826
|
+
simple_tester(:get_geometry_n, 'POINT (2 3)', 'MULTIPOINT (0 1, 2 3)', 1)
|
827
|
+
simple_tester(:get_geometry_n, nil, 'MULTIPOINT (0 1, 2 3)', 2)
|
936
828
|
end
|
937
829
|
|
938
830
|
def test_num_interior_rings
|
939
|
-
|
940
|
-
|
941
|
-
assert_equal(expected, geom.num_interior_rings)
|
942
|
-
}
|
943
|
-
|
944
|
-
tester[0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))']
|
945
|
-
tester[1, 'POLYGON (
|
831
|
+
simple_tester(:num_interior_rings, 0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
832
|
+
simple_tester(:num_interior_rings, 1, 'POLYGON (
|
946
833
|
(10 10, 10 14, 14 14, 14 10, 10 10),
|
947
834
|
(11 11, 11 12, 12 12, 12 11, 11 11)
|
948
|
-
)'
|
949
|
-
|
835
|
+
)')
|
836
|
+
simple_tester(:num_interior_rings, 2, 'POLYGON (
|
950
837
|
(10 10, 10 14, 14 14, 14 10, 10 10),
|
951
838
|
(11 11, 11 12, 12 12, 12 11, 11 11),
|
952
839
|
(13 11, 13 12, 13.5 12, 13.5 11, 13 11))'
|
953
|
-
|
840
|
+
)
|
954
841
|
|
955
842
|
assert_raises(NoMethodError) do
|
956
|
-
|
843
|
+
read('POINT (0 0)').num_interior_rings
|
957
844
|
end
|
958
845
|
end
|
959
846
|
|
960
847
|
def test_interior_ring_n
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
if expected.nil?
|
966
|
-
assert_nil(result)
|
967
|
-
else
|
968
|
-
assert_geom_eql_exact(result, read(expected))
|
969
|
-
end
|
970
|
-
}
|
971
|
-
|
972
|
-
tester[
|
973
|
-
'LINEARRING(11 11, 11 12, 12 12, 12 11, 11 11)',
|
848
|
+
simple_tester(
|
849
|
+
:interior_ring_n,
|
850
|
+
'LINEARRING (11 11, 11 12, 12 12, 12 11, 11 11)',
|
974
851
|
'POLYGON(
|
975
852
|
(10 10, 10 14, 14 14, 14 10, 10 10),
|
976
853
|
(11 11, 11 12, 12 12, 12 11, 11 11)
|
977
854
|
)',
|
978
855
|
0
|
979
|
-
|
856
|
+
)
|
980
857
|
|
981
|
-
|
858
|
+
simple_tester(
|
859
|
+
:interior_ring_n,
|
982
860
|
'LINEARRING (11 11, 11 12, 12 12, 12 11, 11 11)',
|
983
861
|
'POLYGON (
|
984
862
|
(10 10, 10 14, 14 14, 14 10, 10 10),
|
@@ -986,9 +864,10 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
986
864
|
(13 11, 13 12, 13.5 12, 13.5 11, 13 11)
|
987
865
|
)',
|
988
866
|
0
|
989
|
-
|
867
|
+
)
|
990
868
|
|
991
|
-
|
869
|
+
simple_tester(
|
870
|
+
:interior_ring_n,
|
992
871
|
'LINEARRING (13 11, 13 12, 13.5 12, 13.5 11, 13 11)',
|
993
872
|
'POLYGON (
|
994
873
|
(10 10, 10 14, 14 14, 14 10, 10 10),
|
@@ -996,76 +875,54 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
996
875
|
(13 11, 13 12, 13.5 12, 13.5 11, 13 11)
|
997
876
|
)',
|
998
877
|
1
|
999
|
-
|
878
|
+
)
|
1000
879
|
|
1001
|
-
assert_raises(
|
1002
|
-
|
880
|
+
assert_raises(Geos::IndexBoundsError) do
|
881
|
+
simple_tester(
|
882
|
+
:interior_ring_n,
|
1003
883
|
nil,
|
1004
884
|
'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))',
|
1005
885
|
0
|
1006
|
-
|
886
|
+
)
|
1007
887
|
end
|
1008
888
|
|
1009
889
|
assert_raises(NoMethodError) do
|
1010
|
-
|
890
|
+
simple_tester(
|
891
|
+
:interior_ring_n,
|
1011
892
|
nil,
|
1012
893
|
'POINT (0 0)',
|
1013
894
|
0
|
1014
|
-
|
895
|
+
)
|
1015
896
|
end
|
1016
897
|
end
|
1017
898
|
|
1018
899
|
def test_exterior_ring
|
1019
|
-
|
1020
|
-
|
1021
|
-
result = geom.exterior_ring
|
1022
|
-
|
1023
|
-
if expected.nil?
|
1024
|
-
assert_nil(result)
|
1025
|
-
else
|
1026
|
-
assert_geom_eql_exact(result, read(expected))
|
1027
|
-
end
|
1028
|
-
}
|
1029
|
-
|
1030
|
-
tester[
|
900
|
+
simple_tester(
|
901
|
+
:exterior_ring,
|
1031
902
|
'LINEARRING (10 10, 10 14, 14 14, 14 10, 10 10)',
|
1032
903
|
'POLYGON (
|
1033
904
|
(10 10, 10 14, 14 14, 14 10, 10 10),
|
1034
905
|
(11 11, 11 12, 12 12, 12 11, 11 11)
|
1035
906
|
)'
|
1036
|
-
|
907
|
+
)
|
1037
908
|
|
1038
909
|
assert_raises(NoMethodError) do
|
1039
|
-
|
1040
|
-
nil,
|
1041
|
-
'POINT (0 0)'
|
1042
|
-
]
|
910
|
+
read('POINT (0 0)').exterior_ring
|
1043
911
|
end
|
1044
912
|
end
|
1045
913
|
|
1046
914
|
def test_interior_rings
|
1047
|
-
|
1048
|
-
|
1049
|
-
result = geom.interior_rings
|
1050
|
-
|
1051
|
-
if expected.nil?
|
1052
|
-
assert_nil(result)
|
1053
|
-
else
|
1054
|
-
assert_equal(expected, result.collect { |r| write(r) } )
|
1055
|
-
end
|
1056
|
-
}
|
1057
|
-
|
1058
|
-
writer.trim = true
|
1059
|
-
|
1060
|
-
tester[
|
915
|
+
array_tester(
|
916
|
+
:interior_rings,
|
1061
917
|
[ 'LINEARRING (11 11, 11 12, 12 12, 12 11, 11 11)' ],
|
1062
918
|
'POLYGON(
|
1063
919
|
(10 10, 10 14, 14 14, 14 10, 10 10),
|
1064
920
|
(11 11, 11 12, 12 12, 12 11, 11 11)
|
1065
921
|
)'
|
1066
|
-
|
922
|
+
)
|
1067
923
|
|
1068
|
-
|
924
|
+
array_tester(
|
925
|
+
:interior_rings,
|
1069
926
|
[
|
1070
927
|
'LINEARRING (11 11, 11 12, 12 12, 12 11, 11 11)',
|
1071
928
|
'LINEARRING (13 11, 13 12, 13.5 12, 13.5 11, 13 11)'
|
@@ -1075,30 +932,23 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1075
932
|
(11 11, 11 12, 12 12, 12 11, 11 11),
|
1076
933
|
(13 11, 13 12, 13.5 12, 13.5 11, 13 11)
|
1077
934
|
)'
|
1078
|
-
|
935
|
+
)
|
1079
936
|
end
|
1080
937
|
|
1081
938
|
def test_num_coordinates
|
1082
939
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:num_coordinates)
|
1083
940
|
|
1084
|
-
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1090
|
-
|
1091
|
-
tester[1, 'POINT(0 0)']
|
1092
|
-
tester[2, 'MULTIPOINT (0 1, 2 3)']
|
1093
|
-
tester[2, 'LINESTRING (0 0, 2 3)']
|
1094
|
-
tester[4, 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))']
|
1095
|
-
tester[5, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))']
|
1096
|
-
tester[15, 'MULTIPOLYGON (
|
941
|
+
simple_tester(:num_coordinates, 1, 'POINT(0 0)')
|
942
|
+
simple_tester(:num_coordinates, 2, 'MULTIPOINT (0 1, 2 3)')
|
943
|
+
simple_tester(:num_coordinates, 2, 'LINESTRING (0 0, 2 3)')
|
944
|
+
simple_tester(:num_coordinates, 4, 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))')
|
945
|
+
simple_tester(:num_coordinates, 5, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
946
|
+
simple_tester(:num_coordinates, 15, 'MULTIPOLYGON (
|
1097
947
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
1098
948
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
1099
949
|
(11 11, 11 12, 12 12, 12 11, 11 11))
|
1100
|
-
)'
|
1101
|
-
|
950
|
+
)')
|
951
|
+
simple_tester(:num_coordinates, 29, 'GEOMETRYCOLLECTION (
|
1102
952
|
MULTIPOLYGON (
|
1103
953
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
1104
954
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
@@ -1109,7 +959,7 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1109
959
|
LINESTRING (0 0, 2 3),
|
1110
960
|
MULTIPOINT ((0 0), (2 3)),
|
1111
961
|
POINT (9 0)
|
1112
|
-
)'
|
962
|
+
)')
|
1113
963
|
end
|
1114
964
|
|
1115
965
|
def test_coord_seq
|
@@ -1128,13 +978,6 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1128
978
|
end
|
1129
979
|
|
1130
980
|
def test_dimensions
|
1131
|
-
tester = lambda { |expected, g|
|
1132
|
-
geom = read(g)
|
1133
|
-
result = geom.dimensions
|
1134
|
-
|
1135
|
-
assert_equal(expected, result)
|
1136
|
-
}
|
1137
|
-
|
1138
981
|
types = {
|
1139
982
|
:dontcare => -3,
|
1140
983
|
:non_empty => -2,
|
@@ -1144,17 +987,17 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1144
987
|
:surface => 2
|
1145
988
|
}
|
1146
989
|
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
990
|
+
simple_tester(:dimensions, types[:point], 'POINT(0 0)')
|
991
|
+
simple_tester(:dimensions, types[:point], 'MULTIPOINT (0 1, 2 3)')
|
992
|
+
simple_tester(:dimensions, types[:curve], 'LINESTRING (0 0, 2 3)')
|
993
|
+
simple_tester(:dimensions, types[:curve], 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))')
|
994
|
+
simple_tester(:dimensions, types[:surface], 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
995
|
+
simple_tester(:dimensions, types[:surface], 'MULTIPOLYGON (
|
1153
996
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
1154
997
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
1155
|
-
(11 11, 11 12, 12 12, 12 11, 11 11))
|
1156
|
-
|
1157
|
-
|
998
|
+
(11 11, 11 12, 12 12, 12 11, 11 11))
|
999
|
+
)')
|
1000
|
+
simple_tester(:dimensions, types[:surface], 'GEOMETRYCOLLECTION (
|
1158
1001
|
MULTIPOLYGON (
|
1159
1002
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
1160
1003
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
@@ -1165,7 +1008,7 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1165
1008
|
LINESTRING (0 0, 2 3),
|
1166
1009
|
MULTIPOINT (0 0, 2 3),
|
1167
1010
|
POINT (9 0)
|
1168
|
-
)'
|
1011
|
+
)')
|
1169
1012
|
end
|
1170
1013
|
|
1171
1014
|
def test_project_and_project_normalized
|
@@ -1175,7 +1018,7 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1175
1018
|
geom_b = read('POINT(3 4)')
|
1176
1019
|
|
1177
1020
|
# The method only accept lineal geometries
|
1178
|
-
assert_raises(
|
1021
|
+
assert_raises(Geos::GEOSException) do
|
1179
1022
|
geom_a.project(geom_b)
|
1180
1023
|
end
|
1181
1024
|
|
@@ -1183,45 +1026,43 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1183
1026
|
geom_b = read('POINT(0 0)')
|
1184
1027
|
assert_equal(0, geom_a.project(geom_b))
|
1185
1028
|
assert_equal(0, geom_a.project(geom_b, true))
|
1029
|
+
assert_equal(0, geom_a.project_normalized(geom_b))
|
1186
1030
|
|
1187
1031
|
geom_b = read('POINT(10 0)')
|
1188
1032
|
assert_equal(10, geom_a.project(geom_b))
|
1189
1033
|
assert_equal(1, geom_a.project(geom_b, true))
|
1034
|
+
assert_equal(1, geom_a.project_normalized(geom_b))
|
1190
1035
|
|
1191
1036
|
geom_b = read('POINT(5 0)')
|
1192
1037
|
assert_equal(5, geom_a.project(geom_b))
|
1193
1038
|
assert_equal(0.5, geom_a.project(geom_b, true))
|
1039
|
+
assert_equal(0.5, geom_a.project_normalized(geom_b))
|
1194
1040
|
|
1195
1041
|
geom_a = read('MULTILINESTRING((0 0, 10 0),(20 10, 20 20))')
|
1196
1042
|
geom_b = read('POINT(20 0)')
|
1197
1043
|
assert_equal(10, geom_a.project(geom_b))
|
1198
1044
|
assert_equal(0.5, geom_a.project(geom_b, true))
|
1045
|
+
assert_equal(0.5, geom_a.project_normalized(geom_b))
|
1199
1046
|
|
1200
1047
|
geom_b = read('POINT(20 5)')
|
1201
1048
|
assert_equal(10, geom_a.project(geom_b))
|
1202
1049
|
assert_equal(0.5, geom_a.project(geom_b, true))
|
1050
|
+
assert_equal(0.5, geom_a.project_normalized(geom_b))
|
1203
1051
|
end
|
1204
1052
|
|
1205
1053
|
def test_interpolate
|
1206
1054
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:interpolate)
|
1207
1055
|
|
1208
|
-
|
1209
|
-
|
1210
|
-
assert_equal(expected, write(geom.interpolate(d, normalize)))
|
1211
|
-
}
|
1056
|
+
simple_tester(:interpolate, 'POINT (0 0)', 'LINESTRING(0 0, 10 0)', 0, false)
|
1057
|
+
simple_tester(:interpolate, 'POINT (0 0)', 'LINESTRING(0 0, 10 0)', 0, true)
|
1212
1058
|
|
1213
|
-
|
1059
|
+
simple_tester(:interpolate, 'POINT (5 0)', 'LINESTRING(0 0, 10 0)', 5, false)
|
1060
|
+
simple_tester(:interpolate, 'POINT (5 0)', 'LINESTRING(0 0, 10 0)', 0.5, true)
|
1214
1061
|
|
1215
|
-
|
1216
|
-
|
1062
|
+
simple_tester(:interpolate, 'POINT (10 0)', 'LINESTRING(0 0, 10 0)', 20, false)
|
1063
|
+
simple_tester(:interpolate, 'POINT (10 0)', 'LINESTRING(0 0, 10 0)', 2, true)
|
1217
1064
|
|
1218
|
-
|
1219
|
-
tester['POINT (5 0)', 'LINESTRING(0 0, 10 0)', 0.5, true]
|
1220
|
-
|
1221
|
-
tester['POINT (10 0)', 'LINESTRING(0 0, 10 0)', 20, false]
|
1222
|
-
tester['POINT (10 0)', 'LINESTRING(0 0, 10 0)', 2, true]
|
1223
|
-
|
1224
|
-
assert_raises(RuntimeError) do
|
1065
|
+
assert_raises(Geos::GEOSException) do
|
1225
1066
|
read('POINT(1 2)').interpolate(0)
|
1226
1067
|
end
|
1227
1068
|
end
|
@@ -1240,7 +1081,7 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1240
1081
|
tester['POINT (5 0)', 'LINESTRING(0 0, 10 0)', 0.5]
|
1241
1082
|
tester['POINT (10 0)', 'LINESTRING(0 0, 10 0)', 2]
|
1242
1083
|
|
1243
|
-
assert_raises(
|
1084
|
+
assert_raises(Geos::GEOSException) do
|
1244
1085
|
read('POINT(1 2)').interpolate_normalized(0)
|
1245
1086
|
end
|
1246
1087
|
end
|
@@ -1248,52 +1089,32 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1248
1089
|
def test_start_and_end_points
|
1249
1090
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:start_point)
|
1250
1091
|
|
1251
|
-
writer.rounding_precision = 0
|
1252
|
-
|
1253
|
-
tester = lambda { |expected, method, geom|
|
1254
|
-
assert_equal(expected, write(geom.send(method)))
|
1255
|
-
}
|
1256
|
-
|
1257
1092
|
geom = read('LINESTRING (10 10, 10 14, 14 14, 14 10)')
|
1258
|
-
|
1259
|
-
|
1093
|
+
simple_tester(:start_point, 'POINT (10 10)', geom)
|
1094
|
+
simple_tester(:end_point, 'POINT (14 10)', geom)
|
1260
1095
|
|
1261
1096
|
geom = read('LINEARRING (11 11, 11 12, 12 11, 11 11)')
|
1262
|
-
|
1263
|
-
|
1097
|
+
simple_tester(:start_point, 'POINT (11 11)', geom)
|
1098
|
+
simple_tester(:start_point, 'POINT (11 11)', geom)
|
1264
1099
|
end
|
1265
1100
|
|
1266
1101
|
def test_area
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
tester[1.0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))']
|
1272
|
-
tester[0.0, 'POINT (0 0)']
|
1273
|
-
tester[0.0, 'LINESTRING (0 0 , 10 0)']
|
1102
|
+
simple_tester(:area, 1.0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
1103
|
+
simple_tester(:area, 0.0, 'POINT (0 0)')
|
1104
|
+
simple_tester(:area, 0.0, 'LINESTRING (0 0 , 10 0)')
|
1274
1105
|
end
|
1275
1106
|
|
1276
1107
|
def test_length
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
tester[4.0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))']
|
1282
|
-
tester[0.0, 'POINT (0 0)']
|
1283
|
-
tester[10.0, 'LINESTRING (0 0 , 10 0)']
|
1108
|
+
simple_tester(:length, 4.0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
1109
|
+
simple_tester(:length, 0.0, 'POINT (0 0)')
|
1110
|
+
simple_tester(:length, 10.0, 'LINESTRING (0 0 , 10 0)')
|
1284
1111
|
end
|
1285
1112
|
|
1286
1113
|
def test_distance
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
}
|
1292
|
-
|
1293
|
-
g = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
|
1294
|
-
tester[0.0, g, 'POINT(0.5 0.5)']
|
1295
|
-
tester[1.0, g, 'POINT (-1 0)']
|
1296
|
-
tester[2.0, g, 'LINESTRING (3 0 , 10 0)']
|
1114
|
+
geom = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
|
1115
|
+
simple_tester(:distance, 0.0, geom, read('POINT(0.5 0.5)'))
|
1116
|
+
simple_tester(:distance, 1.0, geom, read('POINT (-1 0)'))
|
1117
|
+
simple_tester(:distance, 2.0, geom, read('LINESTRING (3 0 , 10 0)'))
|
1297
1118
|
end
|
1298
1119
|
|
1299
1120
|
def test_hausdorff_distance
|
@@ -1360,24 +1181,14 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1360
1181
|
def test_snap
|
1361
1182
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:snap)
|
1362
1183
|
|
1363
|
-
|
1364
|
-
|
1365
|
-
|
1366
|
-
assert_geom_eql_exact(read(expected), geom_a.snap(geom_b, tolerance))
|
1367
|
-
}
|
1368
|
-
|
1369
|
-
writer.trim = true
|
1370
|
-
|
1371
|
-
geom = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
|
1372
|
-
tester['POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))', geom, 'POINT(0.1 0)', 0]
|
1373
|
-
tester['POLYGON ((0.1 0, 1 0, 1 1, 0 1, 0.1 0))', geom, 'POINT(0.1 0)', 0.5]
|
1184
|
+
geom = read('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
1185
|
+
simple_tester(:snap, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))', geom, read('POINT(0.1 0)'), 0)
|
1186
|
+
simple_tester(:snap, 'POLYGON ((0.1 0, 1 0, 1 1, 0 1, 0.1 0))', geom, read('POINT(0.1 0)'), 0.5)
|
1374
1187
|
end
|
1375
1188
|
|
1376
1189
|
def test_polygonize
|
1377
1190
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize)
|
1378
1191
|
|
1379
|
-
writer.rounding_precision = 0
|
1380
|
-
|
1381
1192
|
geom_a = read(
|
1382
1193
|
'GEOMETRYCOLLECTION(
|
1383
1194
|
LINESTRING(0 0, 10 10),
|
@@ -1404,8 +1215,6 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1404
1215
|
def test_polygonize_cut_edges
|
1405
1216
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_cut_edges)
|
1406
1217
|
|
1407
|
-
writer.rounding_precision = 0
|
1408
|
-
|
1409
1218
|
geom_a = read(
|
1410
1219
|
'GEOMETRYCOLLECTION(
|
1411
1220
|
LINESTRING(0 0, 10 10),
|
@@ -1424,7 +1233,7 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1424
1233
|
def test_polygonize_full
|
1425
1234
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_full)
|
1426
1235
|
|
1427
|
-
writer.rounding_precision =
|
1236
|
+
writer.rounding_precision = 3
|
1428
1237
|
|
1429
1238
|
geom_a = read(
|
1430
1239
|
'GEOMETRYCOLLECTION(
|
@@ -1490,7 +1299,6 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1490
1299
|
|
1491
1300
|
assert_raises(ArgumentError) do
|
1492
1301
|
geom = read('POINT(0 0)')
|
1493
|
-
|
1494
1302
|
geom.polygonize(geom, 'gibberish')
|
1495
1303
|
end
|
1496
1304
|
end
|
@@ -1498,8 +1306,6 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1498
1306
|
def test_shared_paths
|
1499
1307
|
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:shared_paths)
|
1500
1308
|
|
1501
|
-
writer.rounding_precision = 0
|
1502
|
-
|
1503
1309
|
geom_a = read('LINESTRING(0 0, 50 0)')
|
1504
1310
|
geom_b = read('MULTILINESTRING((5 0, 15 0),(40 0, 30 0))')
|
1505
1311
|
|
@@ -1556,8 +1362,6 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1556
1362
|
end
|
1557
1363
|
|
1558
1364
|
def test_normalize
|
1559
|
-
writer.trim = true
|
1560
|
-
|
1561
1365
|
geom = read('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))')
|
1562
1366
|
geom.normalize
|
1563
1367
|
assert_equal('POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))', write(geom))
|
@@ -1567,8 +1371,6 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1567
1371
|
end
|
1568
1372
|
|
1569
1373
|
def test_normalize_bang
|
1570
|
-
writer.trim = true
|
1571
|
-
|
1572
1374
|
geom = read('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))')
|
1573
1375
|
geom.normalize!
|
1574
1376
|
assert_equal('POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))', write(geom))
|