ffi-geos 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/ffi-geos.rb +1 -0
- data/lib/ffi-geos/coordinate_sequence.rb +22 -18
- data/lib/ffi-geos/geometry.rb +19 -16
- data/lib/ffi-geos/point.rb +9 -9
- data/lib/ffi-geos/version.rb +1 -1
- data/test/geometry_collection_tests.rb +46 -44
- data/test/geometry_tests.rb +360 -356
- data/test/line_string_tests.rb +116 -116
- data/test/prepared_geometry_tests.rb +93 -70
- data/test/strtree_tests.rb +161 -142
- data/test/utils_tests.rb +139 -129
- data/test/wkb_writer_tests.rb +8 -9
- data/test/wkt_writer_tests.rb +107 -103
- metadata +10 -14
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OTIxMDI2MjAzYTBlNmI2MTJlNDU2NzVkN2I2ZGJhY2U5MmVmMWNmYQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MjY3YWI1MzAzMTNkZDhlNDEyMzRkNTlmOGE1NzA5MWQ3NzliNWU1Yw==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZjRhYjc0ZDdjMWE3YzllYmRlYmQ4MmZjMDM1MWFhNTZjNTFjOTUzNWY0YmFm
|
10
|
+
ODcxNzY0MTBkOWVhNmUxNzdjZjE2ZTZiOTA4YTM2OGI5YTRiNDgzMWM4Mzdk
|
11
|
+
YWQ3NWNjOThmM2VlOThmMTI4YmQwNDQyMjcxOTMzOWZkMjcwNGE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YjU2NTI1NjZjM2VhNDE0ZmI4Y2NlMzhmYmEwNzY3OWQzNjk3NWY4ZmE1MDhl
|
14
|
+
NzAxOGJlYmJmZWIxMTcyZTlmZGI1YzBmODMwNmFmM2Y2MDBhZTZjZGFiMzUz
|
15
|
+
MTljMGQ3NThjYTYxMTdlODYyMWQzMjhjMjIwMGRmNWFmMzNlOTM=
|
data/lib/ffi-geos.rb
CHANGED
@@ -55,6 +55,7 @@ module Geos
|
|
55
55
|
ENV['PATH'].split(File::PATH_SEPARATOR)
|
56
56
|
else
|
57
57
|
[ '/usr/local/{lib64,lib}', '/opt/local/{lib64,lib}', '/usr/{lib64,lib}' ]
|
58
|
+
[ '/usr/local/{lib64,lib}', '/opt/local/{lib64,lib}', '/usr/{lib64,lib}', '/usr/lib/{x86_64,i386}-linux-gnu' ]
|
58
59
|
end
|
59
60
|
end
|
60
61
|
end
|
@@ -186,38 +186,38 @@ module Geos
|
|
186
186
|
# Gets the x value of a coordinate. Can also be retrieved via #x[].
|
187
187
|
def get_x(idx)
|
188
188
|
self.check_bounds(idx)
|
189
|
-
FFI::MemoryPointer.new(:double)
|
190
|
-
|
191
|
-
|
189
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
190
|
+
FFIGeos.GEOSCoordSeq_getX_r(Geos.current_handle, self.ptr, idx, double_ptr)
|
191
|
+
double_ptr.read_double
|
192
192
|
end
|
193
193
|
|
194
194
|
# Gets the y value of a coordinate. Can also be retrieved via #y[].
|
195
195
|
def get_y(idx)
|
196
196
|
self.check_bounds(idx)
|
197
|
-
FFI::MemoryPointer.new(:double)
|
198
|
-
|
199
|
-
|
197
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
198
|
+
FFIGeos.GEOSCoordSeq_getY_r(Geos.current_handle, self.ptr, idx, double_ptr)
|
199
|
+
double_ptr.read_double
|
200
200
|
end
|
201
201
|
|
202
202
|
# Gets the z value of a coordinate. Can also be retrieved via #z[].
|
203
203
|
def get_z(idx)
|
204
204
|
self.check_bounds(idx)
|
205
|
-
FFI::MemoryPointer.new(:double)
|
206
|
-
|
207
|
-
|
205
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
206
|
+
FFIGeos.GEOSCoordSeq_getZ_r(Geos.current_handle, self.ptr, idx, double_ptr)
|
207
|
+
double_ptr.read_double
|
208
208
|
end
|
209
209
|
|
210
210
|
def get_ordinate(idx, dim)
|
211
211
|
self.check_bounds(idx)
|
212
|
-
FFI::MemoryPointer.new(:double)
|
213
|
-
|
214
|
-
|
212
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
213
|
+
FFIGeos.GEOSCoordSeq_getOrdinate_r(Geos.current_handle, self.ptr, idx, dim, double_ptr)
|
214
|
+
double_ptr.read_double
|
215
215
|
end
|
216
216
|
|
217
217
|
def length
|
218
|
-
FFI::MemoryPointer.new(:int)
|
219
|
-
|
220
|
-
|
218
|
+
int_ptr = FFI::MemoryPointer.new(:int)
|
219
|
+
FFIGeos.GEOSCoordSeq_getSize_r(Geos.current_handle, self.ptr, int_ptr)
|
220
|
+
int_ptr.read_int
|
221
221
|
end
|
222
222
|
alias :size :length
|
223
223
|
|
@@ -226,9 +226,13 @@ module Geos
|
|
226
226
|
end
|
227
227
|
|
228
228
|
def dimensions
|
229
|
-
@dimensions
|
230
|
-
|
231
|
-
|
229
|
+
if defined?(@dimensions)
|
230
|
+
@dimensions
|
231
|
+
else
|
232
|
+
int_ptr = FFI::MemoryPointer.new(:int)
|
233
|
+
FFIGeos.GEOSCoordSeq_getDimensions_r(Geos.current_handle, self.ptr, int_ptr)
|
234
|
+
@dimensions = int_ptr.read_int
|
235
|
+
end
|
232
236
|
end
|
233
237
|
|
234
238
|
def to_point(options = {})
|
data/lib/ffi-geos/geometry.rb
CHANGED
@@ -431,9 +431,9 @@ module Geos
|
|
431
431
|
if self.empty?
|
432
432
|
0
|
433
433
|
else
|
434
|
-
FFI::MemoryPointer.new(:double)
|
435
|
-
|
436
|
-
|
434
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
435
|
+
FFIGeos.GEOSArea_r(Geos.current_handle, self.ptr, double_ptr)
|
436
|
+
double_ptr.read_double
|
437
437
|
end
|
438
438
|
end
|
439
439
|
|
@@ -441,28 +441,31 @@ module Geos
|
|
441
441
|
if self.empty?
|
442
442
|
0
|
443
443
|
else
|
444
|
-
FFI::MemoryPointer.new(:double)
|
445
|
-
|
446
|
-
|
444
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
445
|
+
FFIGeos.GEOSLength_r(Geos.current_handle, self.ptr, double_ptr)
|
446
|
+
double_ptr.read_double
|
447
447
|
end
|
448
448
|
end
|
449
449
|
|
450
450
|
def distance(geom)
|
451
451
|
check_geometry(geom)
|
452
|
-
FFI::MemoryPointer.new(:double)
|
453
|
-
|
454
|
-
|
452
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
453
|
+
FFIGeos.GEOSDistance_r(Geos.current_handle, self.ptr, geom.ptr, double_ptr)
|
454
|
+
double_ptr.read_double
|
455
455
|
end
|
456
456
|
|
457
457
|
def hausdorff_distance(geom, densify_frac = nil)
|
458
458
|
check_geometry(geom)
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
459
|
+
|
460
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
461
|
+
|
462
|
+
if densify_frac
|
463
|
+
FFIGeos.GEOSHausdorffDistanceDensify_r(Geos.current_handle, self.ptr, geom.ptr, densify_frac, double_ptr)
|
464
|
+
else
|
465
|
+
FFIGeos.GEOSHausdorffDistance_r(Geos.current_handle, self.ptr, geom.ptr, double_ptr)
|
466
|
+
end
|
467
|
+
|
468
|
+
double_ptr.read_double
|
466
469
|
end
|
467
470
|
|
468
471
|
def snap(geom, tolerance)
|
data/lib/ffi-geos/point.rb
CHANGED
@@ -4,9 +4,9 @@ module Geos
|
|
4
4
|
class Point < Geometry
|
5
5
|
if FFIGeos.respond_to?(:GEOSGeomGetX_r)
|
6
6
|
def get_x
|
7
|
-
FFI::MemoryPointer.new(:double)
|
8
|
-
|
9
|
-
|
7
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
8
|
+
FFIGeos.GEOSGeomGetX_r(Geos.current_handle, self.ptr, double_ptr)
|
9
|
+
double_ptr.read_double
|
10
10
|
end
|
11
11
|
else
|
12
12
|
def get_x
|
@@ -17,9 +17,9 @@ module Geos
|
|
17
17
|
|
18
18
|
if FFIGeos.respond_to?(:GEOSGeomGetY_r)
|
19
19
|
def get_y
|
20
|
-
FFI::MemoryPointer.new(:double)
|
21
|
-
|
22
|
-
|
20
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
21
|
+
FFIGeos.GEOSGeomGetY_r(Geos.current_handle, self.ptr, double_ptr)
|
22
|
+
double_ptr.read_double
|
23
23
|
end
|
24
24
|
else
|
25
25
|
def get_y
|
@@ -30,9 +30,9 @@ module Geos
|
|
30
30
|
|
31
31
|
if FFIGeos.respond_to?(:GEOSGeomGetZ_r)
|
32
32
|
def get_z
|
33
|
-
FFI::MemoryPointer.new(:double)
|
34
|
-
|
35
|
-
|
33
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
34
|
+
FFIGeos.GEOSGeomGetZ_r(Geos.current_handle, self.ptr, double_ptr)
|
35
|
+
double_ptr.read_double
|
36
36
|
end
|
37
37
|
else
|
38
38
|
def get_z
|
data/lib/ffi-geos/version.rb
CHANGED
@@ -6,52 +6,54 @@ require 'test_helper'
|
|
6
6
|
class GeometryCollectionTests < MiniTest::Unit::TestCase
|
7
7
|
include TestHelper
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def test_geometry_collection_array
|
18
|
-
writer.trim = true
|
19
|
-
geom = read('GEOMETRYCOLLECTION(
|
20
|
-
LINESTRING(0 0, 1 1, 2 2, 3 3),
|
21
|
-
POINT(10 20),
|
22
|
-
POLYGON((0 0, 0 5, 5 5, 5 0, 0 0)),
|
23
|
-
POINT(10 20)
|
24
|
-
)')
|
25
|
-
|
26
|
-
assert_equal('LINESTRING (0 0, 1 1, 2 2, 3 3)', write(geom[0]))
|
27
|
-
assert_equal('POINT (10 20)', write(geom[-1]))
|
28
|
-
|
29
|
-
assert_equal([
|
30
|
-
'LINESTRING (0 0, 1 1, 2 2, 3 3)',
|
31
|
-
'POINT (10 20)'
|
32
|
-
], geom[0, 2].collect { |g| write(g) })
|
33
|
-
|
34
|
-
assert_equal(nil, geom[0, -1])
|
35
|
-
assert_equal([], geom[-1, 0])
|
36
|
-
assert_equal([
|
37
|
-
'POINT (10 20)',
|
38
|
-
'POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))'
|
39
|
-
], geom[1..2].collect { |g| write(g) })
|
40
|
-
end
|
9
|
+
def test_geometry_collection_enumerator
|
10
|
+
skip unless ENV['FORCE_TESTS'] || Geos::GeometryCollection.method_defined?(:[])
|
11
|
+
|
12
|
+
geom = read('GEOMETRYCOLLECTION(POINT(0 0))')
|
13
|
+
assert_kind_of(Enumerable, geom.each)
|
14
|
+
assert_kind_of(Enumerable, geom.to_enum)
|
15
|
+
assert_equal(geom, geom.each {})
|
41
16
|
end
|
42
17
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
)
|
52
|
-
|
53
|
-
|
54
|
-
|
18
|
+
def test_geometry_collection_array
|
19
|
+
skip unless ENV['FORCE_TESTS'] || Geos::GeometryCollection.method_defined?(:[])
|
20
|
+
|
21
|
+
writer.trim = true
|
22
|
+
geom = read('GEOMETRYCOLLECTION(
|
23
|
+
LINESTRING(0 0, 1 1, 2 2, 3 3),
|
24
|
+
POINT(10 20),
|
25
|
+
POLYGON((0 0, 0 5, 5 5, 5 0, 0 0)),
|
26
|
+
POINT(10 20)
|
27
|
+
)')
|
28
|
+
|
29
|
+
assert_equal('LINESTRING (0 0, 1 1, 2 2, 3 3)', write(geom[0]))
|
30
|
+
assert_equal('POINT (10 20)', write(geom[-1]))
|
31
|
+
|
32
|
+
assert_equal([
|
33
|
+
'LINESTRING (0 0, 1 1, 2 2, 3 3)',
|
34
|
+
'POINT (10 20)'
|
35
|
+
], geom[0, 2].collect { |g| write(g) })
|
36
|
+
|
37
|
+
assert_equal(nil, geom[0, -1])
|
38
|
+
assert_equal([], geom[-1, 0])
|
39
|
+
assert_equal([
|
40
|
+
'POINT (10 20)',
|
41
|
+
'POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))'
|
42
|
+
], geom[1..2].collect { |g| write(g) })
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_geometry_collection_enumerable
|
46
|
+
skip unless ENV['FORCE_TESTS'] || Geos::GeometryCollection.method_defined?(:detect)
|
47
|
+
|
48
|
+
writer.trim = true
|
49
|
+
geom = read('GEOMETRYCOLLECTION(
|
50
|
+
LINESTRING(0 0, 1 1, 2 2, 3 3, 10 0, 2 2),
|
51
|
+
POINT(10 20),
|
52
|
+
POLYGON((0 0, 0 5, 5 5, 5 0, 0 0)),
|
53
|
+
POINT(10 20)
|
54
|
+
)')
|
55
|
+
|
56
|
+
assert_equal(2, geom.select { |point| point == read('POINT(10 20)') }.length)
|
55
57
|
end
|
56
58
|
|
57
59
|
def test_default_srid
|
data/test/geometry_tests.rb
CHANGED
@@ -443,42 +443,42 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
443
443
|
)
|
444
444
|
end
|
445
445
|
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
))
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
)
|
462
|
-
|
446
|
+
def test_union_cascaded
|
447
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:union_cascaded)
|
448
|
+
|
449
|
+
self_tester(
|
450
|
+
:union_cascaded,
|
451
|
+
'MULTIPOLYGON(
|
452
|
+
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
453
|
+
((10 10, 10 14, 14 14, 14 10, 10 10),
|
454
|
+
(11 11, 11 12, 12 12, 12 11, 11 11)),
|
455
|
+
((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))'
|
462
|
+
)
|
463
463
|
end
|
464
464
|
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
))
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
)
|
481
|
-
|
465
|
+
def test_unary_union
|
466
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:unary_union)
|
467
|
+
|
468
|
+
self_tester(
|
469
|
+
:unary_union,
|
470
|
+
'MULTIPOLYGON(
|
471
|
+
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
472
|
+
((10 10, 10 14, 14 14, 14 10, 10 10),
|
473
|
+
(11 11, 11 12, 12 12, 12 11, 11 11)),
|
474
|
+
((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))'
|
481
|
+
)
|
482
482
|
end
|
483
483
|
|
484
484
|
def test_union_without_arguments
|
@@ -513,8 +513,8 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
513
513
|
|
514
514
|
self_tester(
|
515
515
|
:point_on_surface,
|
516
|
-
'POLYGON((0 0,
|
517
|
-
'POINT (
|
516
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
517
|
+
'POINT (5 5)'
|
518
518
|
)
|
519
519
|
end
|
520
520
|
|
@@ -527,14 +527,14 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
527
527
|
|
528
528
|
self_tester(
|
529
529
|
:representative_point,
|
530
|
-
'LINESTRING(0 0, 5
|
531
|
-
'POINT (5
|
530
|
+
'LINESTRING(0 0, 5 0, 10 0)',
|
531
|
+
'POINT (5 0)'
|
532
532
|
)
|
533
533
|
|
534
534
|
self_tester(
|
535
535
|
:representative_point,
|
536
|
-
'POLYGON((0 0,
|
537
|
-
'POINT (
|
536
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
|
537
|
+
'POINT (5 5)'
|
538
538
|
)
|
539
539
|
end
|
540
540
|
|
@@ -614,20 +614,20 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
614
614
|
tester['T*******2', geom_a, geom_b, false]
|
615
615
|
end
|
616
616
|
|
617
|
-
|
618
|
-
|
619
|
-
geom_a = read('LINESTRING(0 0, 2 4, 5 5, 0 0)')
|
620
|
-
geom_b = read('POINT(0 0)')
|
617
|
+
def test_relate_boundary_node_rule
|
618
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:relate_boundary_node_rule)
|
621
619
|
|
622
|
-
|
623
|
-
|
620
|
+
geom_a = read('LINESTRING(0 0, 2 4, 5 5, 0 0)')
|
621
|
+
geom_b = read('POINT(0 0)')
|
624
622
|
|
625
|
-
|
626
|
-
|
623
|
+
ret = geom_a.relate_boundary_node_rule(geom_b, :ogc)
|
624
|
+
assert_equal('0F1FFFFF2', ret)
|
627
625
|
|
628
|
-
|
629
|
-
|
630
|
-
|
626
|
+
ret = geom_a.relate_boundary_node_rule(geom_b, :endpoint)
|
627
|
+
assert_equal('FF10FFFF2', ret)
|
628
|
+
|
629
|
+
assert_raises(TypeError) do
|
630
|
+
geom_a.relate_boundary_node_rule(geom_b, :gibberish)
|
631
631
|
end
|
632
632
|
end
|
633
633
|
|
@@ -660,30 +660,30 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
660
660
|
)
|
661
661
|
end
|
662
662
|
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
)
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
)
|
686
|
-
|
663
|
+
def test_extract_unique_points
|
664
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:extract_unique_points)
|
665
|
+
|
666
|
+
writer.rounding_precision = 0
|
667
|
+
|
668
|
+
geom = read('GEOMETRYCOLLECTION (
|
669
|
+
MULTIPOLYGON (
|
670
|
+
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
671
|
+
((10 10, 10 14, 14 14, 14 10, 10 10),
|
672
|
+
(11 11, 11 12, 12 12, 12 11, 11 11))
|
673
|
+
),
|
674
|
+
POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)),
|
675
|
+
MULTILINESTRING ((0 0, 2 3), (10 10, 3 4)),
|
676
|
+
LINESTRING (0 0, 2 3),
|
677
|
+
MULTIPOINT (0 0, 2 3),
|
678
|
+
POINT (9 0),
|
679
|
+
POINT(1 0)),
|
680
|
+
LINESTRING EMPTY
|
681
|
+
')
|
682
|
+
|
683
|
+
assert_equal(
|
684
|
+
'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)',
|
685
|
+
write(geom.extract_unique_points)
|
686
|
+
)
|
687
687
|
end
|
688
688
|
|
689
689
|
def test_relationships
|
@@ -827,35 +827,35 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
827
827
|
refute_geom_valid(read('POINT(0 nan)'))
|
828
828
|
end
|
829
829
|
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
830
|
+
def test_valid_reason
|
831
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:valid_reason)
|
832
|
+
|
833
|
+
assert_equal("Valid Geometry", read('POINT(0 0)').valid_reason)
|
834
|
+
assert_equal("Invalid Coordinate[0 nan]", read('POINT(0 NaN)').valid_reason)
|
835
|
+
assert_equal("Invalid Coordinate[0 nan]", read('POINT(0 nan)').valid_reason)
|
836
|
+
assert_equal("Self-intersection[2.5 5]", read('POLYGON((0 0, 0 5, 5 5, 5 10, 0 0))').valid_reason)
|
837
837
|
end
|
838
838
|
|
839
|
-
|
840
|
-
|
841
|
-
tester = lambda { |detail, location, geom, flags|
|
842
|
-
ret = read(geom).valid_detail(flags)
|
843
|
-
assert_equal(detail, ret[:detail])
|
844
|
-
assert_equal(location, write(ret[:location]))
|
845
|
-
}
|
839
|
+
def test_valid_detail
|
840
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:valid_detail)
|
846
841
|
|
847
|
-
|
842
|
+
tester = lambda { |detail, location, geom, flags|
|
843
|
+
ret = read(geom).valid_detail(flags)
|
844
|
+
assert_equal(detail, ret[:detail])
|
845
|
+
assert_equal(location, write(ret[:location]))
|
846
|
+
}
|
848
847
|
|
849
|
-
|
850
|
-
tester["Invalid Coordinate", 'POINT (0 nan)', 'POINT(0 NaN)', 0]
|
851
|
-
tester["Self-intersection", 'POINT (2 5)', 'POLYGON((0 0, 0 5, 5 5, 5 10, 0 0))', 0]
|
848
|
+
writer.rounding_precision = 0
|
852
849
|
|
853
|
-
|
850
|
+
assert_nil(read('POINT(0 0)').valid_detail)
|
851
|
+
tester["Invalid Coordinate", 'POINT (0 nan)', 'POINT(0 NaN)', 0]
|
852
|
+
tester["Self-intersection", 'POINT (2 5)', 'POLYGON((0 0, 0 5, 5 5, 5 10, 0 0))', 0]
|
854
853
|
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
854
|
+
tester["Ring Self-intersection", 'POINT (0 0)', 'POLYGON((0 0, -10 10, 10 10, 0 0, 4 5, -4 5, 0 0)))', 0]
|
855
|
+
|
856
|
+
assert_nil(read('POLYGON((0 0, -10 10, 10 10, 0 0, 4 5, -4 5, 0 0)))').valid_detail(
|
857
|
+
:allow_selftouching_ring_forming_hole
|
858
|
+
))
|
859
859
|
end
|
860
860
|
|
861
861
|
def test_simple
|
@@ -906,23 +906,23 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
906
906
|
end
|
907
907
|
|
908
908
|
# get_geometry_n is segfaulting in the binary GEOS build
|
909
|
-
|
910
|
-
|
911
|
-
tester = lambda { |expected, g, n|
|
912
|
-
geom = read(g)
|
913
|
-
result = geom.get_geometry_n(n)
|
914
|
-
|
915
|
-
if expected.nil?
|
916
|
-
assert_nil(result)
|
917
|
-
else
|
918
|
-
assert_geom_eql_exact(result, read(expected))
|
919
|
-
end
|
920
|
-
}
|
909
|
+
def test_get_geometry_n
|
910
|
+
skip unless defined?(Geos::FFIGeos)
|
921
911
|
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
912
|
+
tester = lambda { |expected, g, n|
|
913
|
+
geom = read(g)
|
914
|
+
result = geom.get_geometry_n(n)
|
915
|
+
|
916
|
+
if expected.nil?
|
917
|
+
assert_nil(result)
|
918
|
+
else
|
919
|
+
assert_geom_eql_exact(result, read(expected))
|
920
|
+
end
|
921
|
+
}
|
922
|
+
|
923
|
+
tester['POINT(0 1)', 'MULTIPOINT (0 1, 2 3)', 0]
|
924
|
+
tester['POINT(2 3)', 'MULTIPOINT (0 1, 2 3)', 1]
|
925
|
+
tester[nil, 'MULTIPOINT (0 1, 2 3)', 2]
|
926
926
|
end
|
927
927
|
|
928
928
|
def test_num_interior_rings
|
@@ -1068,38 +1068,38 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1068
1068
|
]
|
1069
1069
|
end
|
1070
1070
|
|
1071
|
-
|
1072
|
-
|
1073
|
-
tester = lambda { |expected, g|
|
1074
|
-
geom = read(g)
|
1075
|
-
result = geom.num_coordinates
|
1071
|
+
def test_num_coordinates
|
1072
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:num_coordinates)
|
1076
1073
|
|
1077
|
-
|
1078
|
-
|
1074
|
+
tester = lambda { |expected, g|
|
1075
|
+
geom = read(g)
|
1076
|
+
result = geom.num_coordinates
|
1077
|
+
|
1078
|
+
assert_equal(expected, result)
|
1079
|
+
}
|
1079
1080
|
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1081
|
+
tester[1, 'POINT(0 0)']
|
1082
|
+
tester[2, 'MULTIPOINT (0 1, 2 3)']
|
1083
|
+
tester[2, 'LINESTRING (0 0, 2 3)']
|
1084
|
+
tester[4, 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))']
|
1085
|
+
tester[5, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))']
|
1086
|
+
tester[15, 'MULTIPOLYGON (
|
1087
|
+
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
1088
|
+
((10 10, 10 14, 14 14, 14 10, 10 10),
|
1089
|
+
(11 11, 11 12, 12 12, 12 11, 11 11))
|
1090
|
+
)']
|
1091
|
+
tester[29, 'GEOMETRYCOLLECTION (
|
1092
|
+
MULTIPOLYGON (
|
1086
1093
|
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
1087
1094
|
((10 10, 10 14, 14 14, 14 10, 10 10),
|
1088
1095
|
(11 11, 11 12, 12 12, 12 11, 11 11))
|
1089
|
-
)
|
1090
|
-
|
1091
|
-
|
1092
|
-
|
1093
|
-
|
1094
|
-
|
1095
|
-
|
1096
|
-
POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)),
|
1097
|
-
MULTILINESTRING ((0 0, 2 3), (10 10, 3 4)),
|
1098
|
-
LINESTRING (0 0, 2 3),
|
1099
|
-
MULTIPOINT ((0 0), (2 3)),
|
1100
|
-
POINT (9 0)
|
1101
|
-
)']
|
1102
|
-
end
|
1096
|
+
),
|
1097
|
+
POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)),
|
1098
|
+
MULTILINESTRING ((0 0, 2 3), (10 10, 3 4)),
|
1099
|
+
LINESTRING (0 0, 2 3),
|
1100
|
+
MULTIPOINT ((0 0), (2 3)),
|
1101
|
+
POINT (9 0)
|
1102
|
+
)']
|
1103
1103
|
end
|
1104
1104
|
|
1105
1105
|
def test_coord_seq
|
@@ -1158,80 +1158,80 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1158
1158
|
)']
|
1159
1159
|
end
|
1160
1160
|
|
1161
|
-
|
1162
|
-
|
1163
|
-
geom_a = read('POINT(1 2)')
|
1164
|
-
geom_b = read('POINT(3 4)')
|
1161
|
+
def test_project_and_project_normalized
|
1162
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:project)
|
1165
1163
|
|
1166
|
-
|
1167
|
-
|
1168
|
-
geom_a.project(geom_b)
|
1169
|
-
end
|
1164
|
+
geom_a = read('POINT(1 2)')
|
1165
|
+
geom_b = read('POINT(3 4)')
|
1170
1166
|
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1167
|
+
# The method only accept lineal geometries
|
1168
|
+
assert_raises(RuntimeError) do
|
1169
|
+
geom_a.project(geom_b)
|
1170
|
+
end
|
1175
1171
|
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1172
|
+
geom_a = read('LINESTRING(0 0, 10 0)')
|
1173
|
+
geom_b = read('POINT(0 0)')
|
1174
|
+
assert_equal(0, geom_a.project(geom_b))
|
1175
|
+
assert_equal(0, geom_a.project(geom_b, true))
|
1179
1176
|
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1177
|
+
geom_b = read('POINT(10 0)')
|
1178
|
+
assert_equal(10, geom_a.project(geom_b))
|
1179
|
+
assert_equal(1, geom_a.project(geom_b, true))
|
1183
1180
|
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
assert_equal(0.5, geom_a.project(geom_b, true))
|
1181
|
+
geom_b = read('POINT(5 0)')
|
1182
|
+
assert_equal(5, geom_a.project(geom_b))
|
1183
|
+
assert_equal(0.5, geom_a.project(geom_b, true))
|
1188
1184
|
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1185
|
+
geom_a = read('MULTILINESTRING((0 0, 10 0),(20 10, 20 20))')
|
1186
|
+
geom_b = read('POINT(20 0)')
|
1187
|
+
assert_equal(10, geom_a.project(geom_b))
|
1188
|
+
assert_equal(0.5, geom_a.project(geom_b, true))
|
1189
|
+
|
1190
|
+
geom_b = read('POINT(20 5)')
|
1191
|
+
assert_equal(10, geom_a.project(geom_b))
|
1192
|
+
assert_equal(0.5, geom_a.project(geom_b, true))
|
1193
1193
|
end
|
1194
1194
|
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1195
|
+
def test_interpolate
|
1196
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:interpolate)
|
1197
|
+
|
1198
|
+
tester = lambda { |expected, g, d, normalize|
|
1199
|
+
geom = read(g)
|
1200
|
+
assert_equal(expected, write(geom.interpolate(d, normalize)))
|
1201
|
+
}
|
1201
1202
|
|
1202
|
-
|
1203
|
+
writer.trim = true
|
1203
1204
|
|
1204
|
-
|
1205
|
-
|
1205
|
+
tester['POINT (0 0)', 'LINESTRING(0 0, 10 0)', 0, false]
|
1206
|
+
tester['POINT (0 0)', 'LINESTRING(0 0, 10 0)', 0, true]
|
1206
1207
|
|
1207
|
-
|
1208
|
-
|
1208
|
+
tester['POINT (5 0)', 'LINESTRING(0 0, 10 0)', 5, false]
|
1209
|
+
tester['POINT (5 0)', 'LINESTRING(0 0, 10 0)', 0.5, true]
|
1209
1210
|
|
1210
|
-
|
1211
|
-
|
1211
|
+
tester['POINT (10 0)', 'LINESTRING(0 0, 10 0)', 20, false]
|
1212
|
+
tester['POINT (10 0)', 'LINESTRING(0 0, 10 0)', 2, true]
|
1212
1213
|
|
1213
|
-
|
1214
|
-
|
1215
|
-
end
|
1214
|
+
assert_raises(RuntimeError) do
|
1215
|
+
read('POINT(1 2)').interpolate(0)
|
1216
1216
|
end
|
1217
1217
|
end
|
1218
1218
|
|
1219
|
-
|
1220
|
-
|
1221
|
-
writer.rounding_precision = 0
|
1219
|
+
def test_start_and_end_points
|
1220
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:start_point)
|
1222
1221
|
|
1223
|
-
|
1224
|
-
assert_equal(expected, write(geom.send(method)))
|
1225
|
-
}
|
1222
|
+
writer.rounding_precision = 0
|
1226
1223
|
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1224
|
+
tester = lambda { |expected, method, geom|
|
1225
|
+
assert_equal(expected, write(geom.send(method)))
|
1226
|
+
}
|
1230
1227
|
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1228
|
+
geom = read('LINESTRING (10 10, 10 14, 14 14, 14 10)')
|
1229
|
+
tester['POINT (10 10)', :start_point, geom]
|
1230
|
+
tester['POINT (14 10)', :end_point, geom]
|
1231
|
+
|
1232
|
+
geom = read('LINEARRING (11 11, 11 12, 12 11, 11 11)')
|
1233
|
+
tester['POINT (11 11)', :start_point, geom]
|
1234
|
+
tester['POINT (11 11)', :end_point, geom]
|
1235
1235
|
end
|
1236
1236
|
|
1237
1237
|
def test_area
|
@@ -1267,192 +1267,196 @@ class GeometryTests < MiniTest::Unit::TestCase
|
|
1267
1267
|
tester[2.0, g, 'LINESTRING (3 0 , 10 0)']
|
1268
1268
|
end
|
1269
1269
|
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
|
1270
|
+
def test_hausdorff_distance
|
1271
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:hausdorff_distance)
|
1272
|
+
|
1273
|
+
tester = lambda { |expected, g1, g2|
|
1274
|
+
geom_1 = read(g1)
|
1275
|
+
geom_2 = read(g2)
|
1276
|
+
assert_in_delta(expected, geom_1.hausdorff_distance(geom_2), TOLERANCE)
|
1277
|
+
}
|
1277
1278
|
|
1278
|
-
|
1279
|
+
geom_a = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
|
1279
1280
|
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1281
|
+
tester[10.0498756211209, geom_a, 'POINT(0 10)']
|
1282
|
+
tester[2.23606797749979, geom_a, 'POINT(-1 0)']
|
1283
|
+
tester[9.0, geom_a, 'LINESTRING (3 0 , 10 0)']
|
1284
|
+
end
|
1285
|
+
|
1286
|
+
def test_hausdorff_distance_with_densify_fract
|
1287
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:hausdorff_distance)
|
1284
1288
|
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
}
|
1289
|
+
tester = lambda { |expected, g1, g2|
|
1290
|
+
geom_1 = read(g1)
|
1291
|
+
geom_2 = read(g2)
|
1292
|
+
assert_in_delta(expected, geom_1.hausdorff_distance(geom_2, 0.001), TOLERANCE)
|
1293
|
+
}
|
1291
1294
|
|
1292
|
-
|
1295
|
+
geom_a = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
|
1293
1296
|
|
1294
|
-
|
1295
|
-
|
1296
|
-
|
1297
|
-
end
|
1297
|
+
tester[10.0498756211209, geom_a, 'POINT(0 10)']
|
1298
|
+
tester[2.23606797749979, geom_a, 'POINT(-1 0)']
|
1299
|
+
tester[9.0, geom_a, 'LINESTRING (3 0 , 10 0)']
|
1298
1300
|
end
|
1299
1301
|
|
1300
|
-
|
1301
|
-
|
1302
|
-
tester = lambda { |expected, g1, g2, tolerance|
|
1303
|
-
geom_a = read(g1)
|
1304
|
-
geom_b = read(g2)
|
1305
|
-
assert_geom_eql_exact(read(expected), geom_a.snap(geom_b, tolerance))
|
1306
|
-
}
|
1302
|
+
def test_snap
|
1303
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:snap)
|
1307
1304
|
|
1308
|
-
|
1305
|
+
tester = lambda { |expected, g1, g2, tolerance|
|
1306
|
+
geom_a = read(g1)
|
1307
|
+
geom_b = read(g2)
|
1308
|
+
assert_geom_eql_exact(read(expected), geom_a.snap(geom_b, tolerance))
|
1309
|
+
}
|
1309
1310
|
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1311
|
+
writer.trim = true
|
1312
|
+
|
1313
|
+
geom = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
|
1314
|
+
tester['POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))', geom, 'POINT(0.1 0)', 0]
|
1315
|
+
tester['POLYGON ((0.1 0, 1 0, 1 1, 0 1, 0.1 0))', geom, 'POINT(0.1 0)', 0.5]
|
1314
1316
|
end
|
1315
1317
|
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
)
|
1329
|
-
)
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
)
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
)
|
1341
|
-
|
1318
|
+
def test_polygonize
|
1319
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize)
|
1320
|
+
|
1321
|
+
writer.rounding_precision = 0
|
1322
|
+
|
1323
|
+
geom_a = read(
|
1324
|
+
'GEOMETRYCOLLECTION(
|
1325
|
+
LINESTRING(0 0, 10 10),
|
1326
|
+
LINESTRING(185 221, 100 100),
|
1327
|
+
LINESTRING(185 221, 88 275, 180 316),
|
1328
|
+
LINESTRING(185 221, 292 281, 180 316),
|
1329
|
+
LINESTRING(189 98, 83 187, 185 221),
|
1330
|
+
LINESTRING(189 98, 325 168, 185 221)
|
1331
|
+
)'
|
1332
|
+
)
|
1333
|
+
|
1334
|
+
polygonized = geom_a.polygonize
|
1335
|
+
assert_equal(2, polygonized.length)
|
1336
|
+
assert_equal(
|
1337
|
+
'POLYGON ((185 221, 88 275, 180 316, 292 281, 185 221))',
|
1338
|
+
write(polygonized[0])
|
1339
|
+
)
|
1340
|
+
assert_equal(
|
1341
|
+
'POLYGON ((189 98, 83 187, 185 221, 325 168, 189 98))',
|
1342
|
+
write(polygonized[1])
|
1343
|
+
)
|
1342
1344
|
end
|
1343
1345
|
|
1344
|
-
|
1345
|
-
|
1346
|
-
writer.rounding_precision = 0
|
1346
|
+
def test_polygonize_cut_edges
|
1347
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_cut_edges)
|
1347
1348
|
|
1348
|
-
|
1349
|
-
'GEOMETRYCOLLECTION(
|
1350
|
-
LINESTRING(0 0, 10 10),
|
1351
|
-
LINESTRING(185 221, 100 100),
|
1352
|
-
LINESTRING(185 221, 88 275, 180 316),
|
1353
|
-
LINESTRING(185 221, 292 281, 180 316),
|
1354
|
-
LINESTRING(189 98, 83 187, 185 221),
|
1355
|
-
LINESTRING(189 98, 325 168, 185 221)
|
1356
|
-
)'
|
1357
|
-
)
|
1349
|
+
writer.rounding_precision = 0
|
1358
1350
|
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1351
|
+
geom_a = read(
|
1352
|
+
'GEOMETRYCOLLECTION(
|
1353
|
+
LINESTRING(0 0, 10 10),
|
1354
|
+
LINESTRING(185 221, 100 100),
|
1355
|
+
LINESTRING(185 221, 88 275, 180 316),
|
1356
|
+
LINESTRING(185 221, 292 281, 180 316),
|
1357
|
+
LINESTRING(189 98, 83 187, 185 221),
|
1358
|
+
LINESTRING(189 98, 325 168, 185 221)
|
1359
|
+
)'
|
1360
|
+
)
|
1361
|
+
|
1362
|
+
cut_edges = geom_a.polygonize_cut_edges
|
1363
|
+
assert_equal(0, cut_edges.length)
|
1362
1364
|
end
|
1363
1365
|
|
1364
|
-
|
1365
|
-
|
1366
|
-
writer.rounding_precision = 0
|
1367
|
-
|
1368
|
-
geom_a = read(
|
1369
|
-
'GEOMETRYCOLLECTION(
|
1370
|
-
LINESTRING(0 0, 10 10),
|
1371
|
-
LINESTRING(185 221, 100 100),
|
1372
|
-
LINESTRING(185 221, 88 275, 180 316),
|
1373
|
-
LINESTRING(185 221, 292 281, 180 316),
|
1374
|
-
LINESTRING(189 98, 83 187, 185 221),
|
1375
|
-
LINESTRING(189 98, 325 168, 185 221)
|
1376
|
-
)')
|
1377
|
-
|
1378
|
-
polygonized = geom_a.polygonize_full
|
1379
|
-
|
1380
|
-
assert_kind_of(Array, polygonized[:rings])
|
1381
|
-
assert_kind_of(Array, polygonized[:cuts])
|
1382
|
-
assert_kind_of(Array, polygonized[:dangles])
|
1383
|
-
assert_kind_of(Array, polygonized[:invalid_rings])
|
1384
|
-
|
1385
|
-
assert_equal(2, polygonized[:rings].length)
|
1386
|
-
assert_equal(0, polygonized[:cuts].length)
|
1387
|
-
assert_equal(2, polygonized[:dangles].length)
|
1388
|
-
assert_equal(0, polygonized[:invalid_rings].length)
|
1389
|
-
|
1390
|
-
assert_equal(
|
1391
|
-
'POLYGON ((185 221, 88 275, 180 316, 292 281, 185 221))',
|
1392
|
-
write(polygonized[:rings][0])
|
1393
|
-
)
|
1394
|
-
|
1395
|
-
assert_equal(
|
1396
|
-
'POLYGON ((189 98, 83 187, 185 221, 325 168, 189 98))',
|
1397
|
-
write(polygonized[:rings][1])
|
1398
|
-
)
|
1399
|
-
|
1400
|
-
assert_equal(
|
1401
|
-
'LINESTRING (185 221, 100 100)',
|
1402
|
-
write(polygonized[:dangles][0])
|
1403
|
-
)
|
1404
|
-
|
1405
|
-
assert_equal(
|
1406
|
-
'LINESTRING (0 0, 10 10)',
|
1407
|
-
write(polygonized[:dangles][1])
|
1408
|
-
)
|
1409
|
-
|
1410
|
-
geom_b = geom_a.union(read('POINT(0 0)'))
|
1411
|
-
polygonized = geom_b.polygonize_full
|
1412
|
-
|
1413
|
-
assert_equal(2, polygonized[:dangles].length)
|
1414
|
-
assert_equal(0, polygonized[:invalid_rings].length)
|
1415
|
-
|
1416
|
-
assert_equal(
|
1417
|
-
'LINESTRING (132 146, 100 100)',
|
1418
|
-
write(polygonized[:dangles][0])
|
1419
|
-
)
|
1420
|
-
|
1421
|
-
assert_equal(
|
1422
|
-
'LINESTRING (0 0, 10 10)',
|
1423
|
-
write(polygonized[:dangles][1])
|
1424
|
-
)
|
1425
|
-
end
|
1366
|
+
def test_polygonize_full
|
1367
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_full)
|
1426
1368
|
|
1427
|
-
|
1428
|
-
assert_raises(ArgumentError) do
|
1429
|
-
geom = read('POINT(0 0)')
|
1369
|
+
writer.rounding_precision = 0
|
1430
1370
|
|
1431
|
-
|
1432
|
-
|
1433
|
-
|
1371
|
+
geom_a = read(
|
1372
|
+
'GEOMETRYCOLLECTION(
|
1373
|
+
LINESTRING(0 0, 10 10),
|
1374
|
+
LINESTRING(185 221, 100 100),
|
1375
|
+
LINESTRING(185 221, 88 275, 180 316),
|
1376
|
+
LINESTRING(185 221, 292 281, 180 316),
|
1377
|
+
LINESTRING(189 98, 83 187, 185 221),
|
1378
|
+
LINESTRING(189 98, 325 168, 185 221)
|
1379
|
+
)')
|
1380
|
+
|
1381
|
+
polygonized = geom_a.polygonize_full
|
1382
|
+
|
1383
|
+
assert_kind_of(Array, polygonized[:rings])
|
1384
|
+
assert_kind_of(Array, polygonized[:cuts])
|
1385
|
+
assert_kind_of(Array, polygonized[:dangles])
|
1386
|
+
assert_kind_of(Array, polygonized[:invalid_rings])
|
1387
|
+
|
1388
|
+
assert_equal(2, polygonized[:rings].length)
|
1389
|
+
assert_equal(0, polygonized[:cuts].length)
|
1390
|
+
assert_equal(2, polygonized[:dangles].length)
|
1391
|
+
assert_equal(0, polygonized[:invalid_rings].length)
|
1392
|
+
|
1393
|
+
assert_equal(
|
1394
|
+
'POLYGON ((185 221, 88 275, 180 316, 292 281, 185 221))',
|
1395
|
+
write(polygonized[:rings][0])
|
1396
|
+
)
|
1397
|
+
|
1398
|
+
assert_equal(
|
1399
|
+
'POLYGON ((189 98, 83 187, 185 221, 325 168, 189 98))',
|
1400
|
+
write(polygonized[:rings][1])
|
1401
|
+
)
|
1402
|
+
|
1403
|
+
assert_equal(
|
1404
|
+
'LINESTRING (185 221, 100 100)',
|
1405
|
+
write(polygonized[:dangles][0])
|
1406
|
+
)
|
1407
|
+
|
1408
|
+
assert_equal(
|
1409
|
+
'LINESTRING (0 0, 10 10)',
|
1410
|
+
write(polygonized[:dangles][1])
|
1411
|
+
)
|
1412
|
+
|
1413
|
+
geom_b = geom_a.union(read('POINT(0 0)'))
|
1414
|
+
polygonized = geom_b.polygonize_full
|
1415
|
+
|
1416
|
+
assert_equal(2, polygonized[:dangles].length)
|
1417
|
+
assert_equal(0, polygonized[:invalid_rings].length)
|
1418
|
+
|
1419
|
+
assert_equal(
|
1420
|
+
'LINESTRING (132 146, 100 100)',
|
1421
|
+
write(polygonized[:dangles][0])
|
1422
|
+
)
|
1423
|
+
|
1424
|
+
assert_equal(
|
1425
|
+
'LINESTRING (0 0, 10 10)',
|
1426
|
+
write(polygonized[:dangles][1])
|
1427
|
+
)
|
1434
1428
|
end
|
1435
1429
|
|
1436
|
-
|
1437
|
-
|
1438
|
-
writer.rounding_precision = 0
|
1430
|
+
def test_polygonize_with_bad_arguments
|
1431
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_full)
|
1439
1432
|
|
1440
|
-
|
1441
|
-
|
1433
|
+
assert_raises(ArgumentError) do
|
1434
|
+
geom = read('POINT(0 0)')
|
1442
1435
|
|
1443
|
-
|
1444
|
-
assert_equal(2, paths.length)
|
1445
|
-
assert_equal(
|
1446
|
-
'MULTILINESTRING ((5 0, 15 0))',
|
1447
|
-
write(paths[0])
|
1448
|
-
)
|
1449
|
-
assert_equal(
|
1450
|
-
'MULTILINESTRING ((30 0, 40 0))',
|
1451
|
-
write(paths[1])
|
1452
|
-
)
|
1436
|
+
geom.polygonize(geom, 'gibberish')
|
1453
1437
|
end
|
1454
1438
|
end
|
1455
1439
|
|
1440
|
+
def test_shared_paths
|
1441
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:shared_paths)
|
1442
|
+
|
1443
|
+
writer.rounding_precision = 0
|
1444
|
+
|
1445
|
+
geom_a = read('LINESTRING(0 0, 50 0)')
|
1446
|
+
geom_b = read('MULTILINESTRING((5 0, 15 0),(40 0, 30 0))')
|
1447
|
+
|
1448
|
+
paths = geom_a.shared_paths(geom_b)
|
1449
|
+
assert_equal(2, paths.length)
|
1450
|
+
assert_equal(
|
1451
|
+
'MULTILINESTRING ((5 0, 15 0))',
|
1452
|
+
write(paths[0])
|
1453
|
+
)
|
1454
|
+
assert_equal(
|
1455
|
+
'MULTILINESTRING ((30 0, 40 0))',
|
1456
|
+
write(paths[1])
|
1457
|
+
)
|
1458
|
+
end
|
1459
|
+
|
1456
1460
|
def test_clone
|
1457
1461
|
geom_a = read('POINT(0 0)')
|
1458
1462
|
geom_b = geom_a.clone
|