ffi-geos 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +2 -2
- data/.rbenv-vars +1 -0
- data/.rubocop.yml +538 -92
- data/.rubocop_todo.yml +28 -18
- data/ffi-geos.gemspec +2 -2
- data/lib/ffi-geos/coordinate_sequence.rb +2 -1
- data/lib/ffi-geos/geometry.rb +95 -1
- data/lib/ffi-geos/point.rb +9 -0
- data/lib/ffi-geos/version.rb +1 -1
- data/lib/ffi-geos.rb +78 -3
- data/test/coordinate_sequence_tests.rb +22 -4
- data/test/geojson_reader_tests.rb +6 -2
- data/test/geometry/area_tests.rb +18 -0
- data/test/geometry/boundary_tests.rb +36 -0
- data/test/geometry/buffer_tests.rb +116 -0
- data/test/geometry/build_area_tests.rb +20 -0
- data/test/geometry/centroid_tests.rb +37 -0
- data/test/geometry/clip_by_rect_tests.rb +56 -0
- data/test/geometry/clone_tests.rb +29 -0
- data/test/geometry/concave_hull_of_polygons_tests.rb +28 -0
- data/test/geometry/concave_hull_tests.rb +38 -0
- data/test/geometry/convex_hull_tests.rb +26 -0
- data/test/geometry/coord_seq_tests.rb +27 -0
- data/test/geometry/delaunay_triangulation_tests.rb +82 -0
- data/test/geometry/densify_tests.rb +95 -0
- data/test/geometry/difference_tests.rb +108 -0
- data/test/geometry/dimensions_tests.rb +46 -0
- data/test/geometry/distance_tests.rb +29 -0
- data/test/geometry/dump_points_tests.rb +60 -0
- data/test/geometry/dup_tests.rb +29 -0
- data/test/geometry/empty_tests.rb +23 -0
- data/test/geometry/envelope_tests.rb +26 -0
- data/test/geometry/equal_identical_tests.rb +78 -0
- data/test/geometry/equal_tests.rb +62 -0
- data/test/geometry/exterior_ring_tests.rb +27 -0
- data/test/geometry/extract_unique_points_tests.rb +41 -0
- data/test/geometry/frecet_distance_tests.rb +24 -0
- data/test/geometry/get_geometry_n_tests.rb +21 -0
- data/test/geometry/hausdorff_distance_tests.rb +46 -0
- data/test/geometry/hilbert_code_tests.rb +45 -0
- data/test/geometry/interior_ring_n_tests.rb +64 -0
- data/test/geometry/interior_rings_tests.rb +36 -0
- data/test/geometry/interpolate_tests.rb +49 -0
- data/test/geometry/intersection_tests.rb +49 -0
- data/test/geometry/largest_empty_circle_tests.rb +26 -0
- data/test/geometry/length_tests.rb +18 -0
- data/test/geometry/line_merge_directed_tests.rb +28 -0
- data/test/geometry/line_merge_tests.rb +25 -0
- data/test/geometry/line_string_enumerator_tests.rb +20 -0
- data/test/geometry/line_substring_tests.rb +76 -0
- data/test/geometry/make_valid_tests.rb +27 -0
- data/test/geometry/maximum_inscribed_circle_tests.rb +21 -0
- data/test/geometry/minimum_bounding_circle_tests.rb +23 -0
- data/test/geometry/minimum_clearance_tests.rb +58 -0
- data/test/geometry/minimum_rotated_rectangle_tests.rb +28 -0
- data/test/geometry/minimum_width_tests.rb +26 -0
- data/test/geometry/misc_tests.rb +24 -0
- data/test/geometry/nearest_points_tests.rb +46 -0
- data/test/geometry/node_tests.rb +22 -0
- data/test/geometry/normalize_tests.rb +34 -0
- data/test/geometry/num_coordinates_tests.rb +39 -0
- data/test/geometry/num_goemetries_tests.rb +35 -0
- data/test/geometry/num_interior_rings_tests.rb +28 -0
- data/test/geometry/orient_polygons_tests.rb +101 -0
- data/test/geometry/point_on_surface_tests.rb +37 -0
- data/test/geometry/polygon_hull_simplify_tests.rb +55 -0
- data/test/geometry/polygonize_tests.rb +173 -0
- data/test/geometry/precision_tests.rb +42 -0
- data/test/geometry/project_tests.rb +56 -0
- data/test/geometry/relate_tests.rb +73 -0
- data/test/geometry/relationships_tests.rb +138 -0
- data/test/geometry/reverse_tests.rb +44 -0
- data/test/geometry/ring_tests.rb +18 -0
- data/test/geometry/shared_path_tests.rb +31 -0
- data/test/geometry/simple_tests.rb +18 -0
- data/test/geometry/simplify_tests.rb +21 -0
- data/test/geometry/snap_tests.rb +20 -0
- data/test/geometry/srid_copy_policy_tests.rb +94 -0
- data/test/geometry/start_and_end_point_tests.rb +24 -0
- data/test/geometry/sym_difference_tests.rb +114 -0
- data/test/geometry/topology_preserve_simplify_tests.rb +21 -0
- data/test/geometry/union_tests.rb +216 -0
- data/test/geometry/valid_tests.rb +56 -0
- data/test/geometry/voronoi_diagram_tests.rb +62 -0
- data/test/geometry_collection_tests.rb +14 -2
- data/test/interrupt_tests.rb +1 -1
- data/test/line_string_tests.rb +24 -3
- data/test/misc_tests.rb +1 -1
- data/test/point/has_m_tests.rb +43 -0
- data/test/point/x_y_z_m_tests.rb +51 -0
- data/test/point_tests.rb +25 -3
- data/test/polygon_tests.rb +14 -1
- data/test/prepared_geometry_tests.rb +6 -5
- data/test/strtree_tests.rb +11 -18
- data/test/test_helper.rb +2 -0
- data/test/tools_tests.rb +7 -0
- data/test/utils_tests.rb +14 -3
- data/test/wkb_reader_tests.rb +1 -0
- data/test/wkb_writer_tests.rb +26 -5
- data/test/wkt_reader_tests.rb +2 -0
- data/test/wkt_writer_tests.rb +20 -2
- metadata +154 -7
- data/test/geometry_tests.rb +0 -2114
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryInterpolateTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_interpolate
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:interpolate)
|
15
|
+
|
16
|
+
simple_tester(:interpolate, 'POINT (0 0)', 'LINESTRING(0 0, 10 0)', 0, false)
|
17
|
+
simple_tester(:interpolate, 'POINT (0 0)', 'LINESTRING(0 0, 10 0)', 0, true)
|
18
|
+
|
19
|
+
simple_tester(:interpolate, 'POINT (5 0)', 'LINESTRING(0 0, 10 0)', 5, false)
|
20
|
+
simple_tester(:interpolate, 'POINT (5 0)', 'LINESTRING(0 0, 10 0)', 0.5, true)
|
21
|
+
|
22
|
+
simple_tester(:interpolate, 'POINT (10 0)', 'LINESTRING(0 0, 10 0)', 20, false)
|
23
|
+
simple_tester(:interpolate, 'POINT (10 0)', 'LINESTRING(0 0, 10 0)', 2, true)
|
24
|
+
|
25
|
+
assert_raises(Geos::GEOSException) do
|
26
|
+
read('POINT(1 2)').interpolate(0)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_interpolate_normalized
|
31
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:interpolate_normalized)
|
32
|
+
|
33
|
+
tester = lambda { |expected, g, d|
|
34
|
+
geom = read(g)
|
35
|
+
|
36
|
+
assert_equal(expected, write(geom.interpolate_normalized(d)))
|
37
|
+
}
|
38
|
+
|
39
|
+
writer.trim = true
|
40
|
+
|
41
|
+
tester['POINT (0 0)', 'LINESTRING(0 0, 10 0)', 0]
|
42
|
+
tester['POINT (5 0)', 'LINESTRING(0 0, 10 0)', 0.5]
|
43
|
+
tester['POINT (10 0)', 'LINESTRING(0 0, 10 0)', 2]
|
44
|
+
|
45
|
+
assert_raises(Geos::GEOSException) do
|
46
|
+
read('POINT(1 2)').interpolate_normalized(0)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryIntersectionTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_intersection
|
14
|
+
comparison_tester(
|
15
|
+
:intersection,
|
16
|
+
if Geos::GEOS_NICE_VERSION > '030900'
|
17
|
+
'POLYGON ((10 10, 10 5, 5 5, 5 10, 10 10))'
|
18
|
+
else
|
19
|
+
'POLYGON ((5 10, 10 10, 10 5, 5 5, 5 10))'
|
20
|
+
end,
|
21
|
+
'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))',
|
22
|
+
'POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))'
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_intersection_with_precision
|
27
|
+
skip unless ENV['FORCE_TESTS'] || Geos::FFIGeos.respond_to?(:GEOSIntersectionPrec_r)
|
28
|
+
|
29
|
+
comparison_tester(
|
30
|
+
:intersection,
|
31
|
+
'GEOMETRYCOLLECTION (POLYGON ((1 2, 1 1, 0.5 1, 1 2)), POLYGON ((9.5 1, 2 1, 2 2, 9 2, 9.5 1)), LINESTRING (1 1, 2 1), LINESTRING (2 2, 1 2))',
|
32
|
+
'MULTIPOLYGON(((0 0,5 10,10 0,0 0),(1 1,1 2,2 2,2 1,1 1),(100 100,100 102,102 102,102 100,100 100)))',
|
33
|
+
'POLYGON((0 1,0 2,10 2,10 1,0 1))',
|
34
|
+
precision: 0
|
35
|
+
)
|
36
|
+
|
37
|
+
comparison_tester(
|
38
|
+
:intersection,
|
39
|
+
if Geos::GEOS_NICE_VERSION >= '031000'
|
40
|
+
'GEOMETRYCOLLECTION (LINESTRING (2 0, 4 0), POINT (10 0), POINT (0 0))'
|
41
|
+
else
|
42
|
+
'GEOMETRYCOLLECTION (LINESTRING (2 0, 4 0), POINT (0 0), POINT (10 0))'
|
43
|
+
end,
|
44
|
+
'LINESTRING(0 0, 10 0)',
|
45
|
+
'LINESTRING(9 0, 12 0, 12 20, 4 0, 2 0, 2 10, 0 10, 0 -10)',
|
46
|
+
precision: 2
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryLargestEmptyCircleTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_largest_empty_circle
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:largest_empty_circle)
|
15
|
+
|
16
|
+
geom = read('MULTIPOINT ((100 100), (100 200), (200 200), (200 100))')
|
17
|
+
output = geom.largest_empty_circle(0.001)
|
18
|
+
|
19
|
+
assert_equal('LINESTRING (150 150, 100 100)', write(output))
|
20
|
+
|
21
|
+
geom = read('MULTIPOINT ((100 100), (100 200), (200 200), (200 100))')
|
22
|
+
output = geom.largest_empty_circle(0.001, boundary: read('MULTIPOINT ((100 100), (100 200), (200 200), (200 100))'))
|
23
|
+
|
24
|
+
assert_equal('LINESTRING (100 100, 100 100)', write(output))
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryLengthTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_length
|
14
|
+
simple_tester(:length, 4.0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
15
|
+
simple_tester(:length, 0.0, 'POINT (0 0)')
|
16
|
+
simple_tester(:length, 10.0, 'LINESTRING (0 0 , 10 0)')
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe '#line_merge_directed' do
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'merges lines in MULTILINESTRINGs' do
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:line_merge_directed)
|
15
|
+
|
16
|
+
simple_tester(
|
17
|
+
:line_merge_directed,
|
18
|
+
'LINESTRING (0 -5, 0 0, 0 100)',
|
19
|
+
'MULTILINESTRING ((0 0, 0 100), (0 -5, 0 0))'
|
20
|
+
)
|
21
|
+
|
22
|
+
simple_tester(
|
23
|
+
:line_merge_directed,
|
24
|
+
'MULTILINESTRING ((0 0, 0 100), (0 0, 0 -5))',
|
25
|
+
'MULTILINESTRING ((0 0, 0 100), (0 0, 0 -5))'
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_line_merge
|
14
|
+
simple_tester(
|
15
|
+
:line_merge,
|
16
|
+
'LINESTRING (0 0, 10 10, 10 0, 5 0, 5 -5)',
|
17
|
+
'MULTILINESTRING(
|
18
|
+
(0 0, 10 10),
|
19
|
+
(10 10, 10 0),
|
20
|
+
(5 0, 10 0),
|
21
|
+
(5 -5, 5 0)
|
22
|
+
)'
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryLineStringEnumeratorTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_line_string_enumerator
|
14
|
+
geom = read('LINESTRING(0 0, 10 10)')
|
15
|
+
|
16
|
+
assert_kind_of(Enumerable, geom.each)
|
17
|
+
assert_kind_of(Enumerable, geom.to_enum)
|
18
|
+
assert_equal(geom, geom.each(&EMPTY_BLOCK))
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_line_substring
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:line_substring)
|
15
|
+
|
16
|
+
simple_tester(
|
17
|
+
:line_substring,
|
18
|
+
'LINESTRING (0 0, 1 1)',
|
19
|
+
'LINESTRING (0 0, 2 2)',
|
20
|
+
0,
|
21
|
+
0.5
|
22
|
+
)
|
23
|
+
|
24
|
+
simple_tester(
|
25
|
+
:line_substring,
|
26
|
+
'MULTILINESTRING ((0 52.5, 0 100), (0 -5, 0 0))',
|
27
|
+
'MULTILINESTRING((0 0, 0 100),(0 -5, 0 0))',
|
28
|
+
0.5,
|
29
|
+
1
|
30
|
+
)
|
31
|
+
|
32
|
+
simple_tester(
|
33
|
+
:line_substring,
|
34
|
+
'LINESTRING (1 1, 1 1)',
|
35
|
+
'LINESTRING (0 0, 2 2)',
|
36
|
+
0.5,
|
37
|
+
0.5
|
38
|
+
)
|
39
|
+
|
40
|
+
simple_tester(
|
41
|
+
:line_substring,
|
42
|
+
'LINESTRING (1 1, 1 1)',
|
43
|
+
'LINESTRING (0 0, 2 2)',
|
44
|
+
0.5,
|
45
|
+
0.5
|
46
|
+
)
|
47
|
+
|
48
|
+
assert_raises(Geos::GEOSException, 'IllegalArgumentException: end fraction must be <= 1') do
|
49
|
+
simple_tester(
|
50
|
+
:line_substring,
|
51
|
+
'',
|
52
|
+
'LINESTRING (0 0, 2 2)',
|
53
|
+
0.5,
|
54
|
+
1.5
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
assert_raises(Geos::GEOSException, 'IllegalArgumentException: end fraction must be <= 1') do
|
59
|
+
simple_tester(
|
60
|
+
:line_substring,
|
61
|
+
'',
|
62
|
+
'LINESTRING (0 0, 2 2)',
|
63
|
+
0.5,
|
64
|
+
-0.1
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
simple_tester(
|
69
|
+
:line_substring,
|
70
|
+
'LINESTRING (0.5 0.5, 0 0)',
|
71
|
+
'LINESTRING (0 0, 1 1)',
|
72
|
+
0.5,
|
73
|
+
0
|
74
|
+
)
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryMakeValidTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_make_valid
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:make_valid)
|
15
|
+
|
16
|
+
geom = read('POLYGON((0 0, 1 1, 0 1, 1 0, 0 0))')
|
17
|
+
|
18
|
+
assert_equal(
|
19
|
+
if Geos::GEOS_NICE_VERSION > '030900'
|
20
|
+
'MULTIPOLYGON (((1 0, 0 0, 0.5 0.5, 1 0)), ((1 1, 0.5 0.5, 0 1, 1 1)))'
|
21
|
+
else
|
22
|
+
'MULTIPOLYGON (((0 0, 0.5 0.5, 1 0, 0 0)), ((0.5 0.5, 0 1, 1 1, 0.5 0.5)))'
|
23
|
+
end,
|
24
|
+
write(geom.make_valid)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryMaximumInscribledCircleTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_maximum_inscribed_circle
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:maximum_inscribed_circle)
|
15
|
+
|
16
|
+
geom = read('POLYGON ((100 200, 200 200, 200 100, 100 100, 100 200))')
|
17
|
+
output = geom.maximum_inscribed_circle(0.001)
|
18
|
+
|
19
|
+
assert_equal('LINESTRING (150 150, 150 200)', write(output))
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryMinimumBoundingCircleTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_minimum_bounding_circle
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_bounding_circle)
|
15
|
+
|
16
|
+
geom = read('LINESTRING(0 10, 0 20)')
|
17
|
+
|
18
|
+
assert_equal(
|
19
|
+
'POLYGON ((5 15, 5 14, 5 13, 4 12, 4 11, 3 11, 2 10, 1 10, 0 10, -1 10, -2 10, -3 11, -4 11, -4 12, -5 13, -5 14, -5 15, -5 16, -5 17, -4 18, -4 19, -3 19, -2 20, -1 20, 0 20, 1 20, 2 20, 3 19, 4 19, 4 18, 5 17, 5 16, 5 15))',
|
20
|
+
write(geom.minimum_bounding_circle.snap_to_grid(1))
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryMinimumClearanceTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_minimum_clearance
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_clearance)
|
15
|
+
|
16
|
+
tester = lambda { |expected_clearance, geom|
|
17
|
+
geom = read(geom)
|
18
|
+
clearance = geom.minimum_clearance
|
19
|
+
|
20
|
+
if expected_clearance.eql?(Float::INFINITY)
|
21
|
+
assert_predicate(clearance, :infinite?)
|
22
|
+
else
|
23
|
+
assert_in_delta(expected_clearance, clearance, TOLERANCE)
|
24
|
+
end
|
25
|
+
}
|
26
|
+
|
27
|
+
tester[Float::INFINITY, 'LINESTRING EMPTY']
|
28
|
+
tester[20, 'LINESTRING (30 100, 10 100)']
|
29
|
+
tester[100, 'LINESTRING (200 200, 200 100)']
|
30
|
+
tester[3.49284983912134e-05, 'LINESTRING (-112.712119 33.575919, -112.712127 33.575885)']
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_minimum_clearance_line
|
34
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_clearance_line)
|
35
|
+
|
36
|
+
tester = lambda { |expected_geom, geom|
|
37
|
+
geom = read(geom)
|
38
|
+
clearance_geom = geom.minimum_clearance_line
|
39
|
+
|
40
|
+
assert_equal(expected_geom, write(clearance_geom))
|
41
|
+
}
|
42
|
+
|
43
|
+
tester['LINESTRING EMPTY', 'MULTIPOINT ((100 100), (100 100))']
|
44
|
+
tester['LINESTRING (30 100, 10 100)', 'MULTIPOINT ((100 100), (10 100), (30 100))']
|
45
|
+
tester['LINESTRING (200 200, 200 100)', 'POLYGON ((100 100, 300 100, 200 200, 100 100))']
|
46
|
+
tester[
|
47
|
+
'LINESTRING (-112.712119 33.575919, -112.712127 33.575885)',
|
48
|
+
'0106000000010000000103000000010000001a00000035d42824992d5cc01b834e081dca404073b9c150872d5cc03465a71fd4c940400ec00644882d5cc03b8a' \
|
49
|
+
'73d4d1c94040376dc669882d5cc0bf9cd9aed0c940401363997e892d5cc002f4fbfecdc94040ca4e3fa88b2d5cc0a487a1d5c9c940408f1ce90c8c2d5cc06989' \
|
50
|
+
'95d1c8c94040fab836548c2d5cc0bd175fb4c7c940409f1f46088f2d5cc0962023a0c2c940407b15191d902d5cc068041bd7bfc940400397c79a912d5cc0287d' \
|
51
|
+
'21e4bcc940403201bf46922d5cc065e3c116bbc940409d9d0c8e922d5cc0060fd3beb9c940400ef7915b932d5cc09012bbb6b7c940404fe61f7d932d5cc0e4a0' \
|
52
|
+
'8499b6c94040fc71fbe5932d5cc0ea9106b7b5c94040eaec6470942d5cc0c2323674b3c94040601dc70f952d5cc043588d25acc94040aea06989952d5cc03ecf' \
|
53
|
+
'9f36aac94040307f85cc952d5cc0e5eb32fca7c94040dd0a6135962d5cc01b615111a7c9404048a7ae7c962d5cc00a2aaa7ea5c94040f4328ae5962d5cc05eb8' \
|
54
|
+
'7361a4c94040c49448a2972d5cc04d81cccea2c940407c80eecb992d5cc06745d4449fc9404035d42824992d5cc01b834e081dca4040'
|
55
|
+
]
|
56
|
+
tester['LINESTRING EMPTY', 'POLYGON EMPTY']
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryMinimumRotatedRectangleTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_minimum_rotated_rectangle
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_rotated_rectangle)
|
15
|
+
|
16
|
+
geom = read('POLYGON ((1 6, 6 11, 11 6, 6 1, 1 6))')
|
17
|
+
minimum_rotated_rectangle = geom.minimum_rotated_rectangle
|
18
|
+
|
19
|
+
assert_equal(
|
20
|
+
if Geos::GEOS_NICE_VERSION >= '031200'
|
21
|
+
'POLYGON ((6 1, 1 6, 6 11, 11 6, 6 1))'
|
22
|
+
else
|
23
|
+
'POLYGON ((6 1, 11 6, 6 11, 1 6, 6 1))'
|
24
|
+
end,
|
25
|
+
write(minimum_rotated_rectangle)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryMinimumWidthTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_minimum_width
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:minimum_width)
|
15
|
+
|
16
|
+
geom = read('POLYGON ((0 0, 0 15, 5 10, 5 0, 0 0))')
|
17
|
+
output = geom.minimum_width
|
18
|
+
|
19
|
+
assert_equal('LINESTRING (0 0, 5 0)', write(output))
|
20
|
+
|
21
|
+
geom = read('LINESTRING (0 0,0 10, 10 10)')
|
22
|
+
output = geom.minimum_width
|
23
|
+
|
24
|
+
assert_equal('LINESTRING (5 5, 0 10)', write(output))
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryMiscTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_empty_geometry_has_0_area
|
14
|
+
assert_equal(0, read('POLYGON EMPTY').area)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_empty_geometry_has_0_length
|
18
|
+
assert_equal(0, read('POLYGON EMPTY').length)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_to_s
|
22
|
+
assert_match(/^\#<Geos::Point: .+>$/, read('POINT(0 0)').to_s)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryNearestPointsTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_nearest_points
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:nearest_points)
|
15
|
+
|
16
|
+
tester = lambda { |expected, g_1, g_2|
|
17
|
+
geom_1 = read(g_1)
|
18
|
+
geom_2 = read(g_2)
|
19
|
+
|
20
|
+
cs = geom_1.nearest_points(geom_2)
|
21
|
+
result = cs.to_s if cs
|
22
|
+
|
23
|
+
if expected.nil?
|
24
|
+
assert_nil(result)
|
25
|
+
else
|
26
|
+
assert_equal(expected, result)
|
27
|
+
end
|
28
|
+
}
|
29
|
+
|
30
|
+
tester[
|
31
|
+
nil,
|
32
|
+
'POINT EMPTY',
|
33
|
+
'POINT EMPTY'
|
34
|
+
]
|
35
|
+
|
36
|
+
tester[
|
37
|
+
if Geos::GEOS_NICE_VERSION >= '030800'
|
38
|
+
'5.0 5.0, 8.0 8.0'
|
39
|
+
else
|
40
|
+
'5.0 5.0 NaN, 8.0 8.0 NaN'
|
41
|
+
end,
|
42
|
+
'POLYGON((1 1, 1 5, 5 5, 5 1, 1 1))',
|
43
|
+
'POLYGON((8 8, 9 9, 9 10, 8 8))'
|
44
|
+
]
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryNodeTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_node
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:node)
|
15
|
+
|
16
|
+
simple_tester(
|
17
|
+
:node,
|
18
|
+
'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0, 5 -5, 5 0), (5 0, 5 5))',
|
19
|
+
'LINESTRING(0 0, 10 0, 5 -5, 5 5)'
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryNormalizeTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_normalize
|
14
|
+
geom = read('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))')
|
15
|
+
geom.normalize
|
16
|
+
|
17
|
+
assert_equal('POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))', write(geom))
|
18
|
+
|
19
|
+
geom = read('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))').normalize
|
20
|
+
|
21
|
+
assert_equal('POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))', write(geom))
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_normalize_bang
|
25
|
+
geom = read('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))')
|
26
|
+
geom.normalize!
|
27
|
+
|
28
|
+
assert_equal('POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))', write(geom))
|
29
|
+
|
30
|
+
geom = read('POLYGON((0 0, 5 0, 5 5, 0 5, 0 0))').normalize!
|
31
|
+
|
32
|
+
assert_equal('POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))', write(geom))
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryNumCoordinatesTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_num_coordinates
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:num_coordinates)
|
15
|
+
|
16
|
+
simple_tester(:num_coordinates, 1, 'POINT(0 0)')
|
17
|
+
simple_tester(:num_coordinates, 2, 'MULTIPOINT (0 1, 2 3)')
|
18
|
+
simple_tester(:num_coordinates, 2, 'LINESTRING (0 0, 2 3)')
|
19
|
+
simple_tester(:num_coordinates, 4, 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))')
|
20
|
+
simple_tester(:num_coordinates, 5, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
21
|
+
simple_tester(:num_coordinates, 15, 'MULTIPOLYGON (
|
22
|
+
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
23
|
+
((10 10, 10 14, 14 14, 14 10, 10 10),
|
24
|
+
(11 11, 11 12, 12 12, 12 11, 11 11))
|
25
|
+
)')
|
26
|
+
simple_tester(:num_coordinates, 29, 'GEOMETRYCOLLECTION (
|
27
|
+
MULTIPOLYGON (
|
28
|
+
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
29
|
+
((10 10, 10 14, 14 14, 14 10, 10 10),
|
30
|
+
(11 11, 11 12, 12 12, 12 11, 11 11))
|
31
|
+
),
|
32
|
+
POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)),
|
33
|
+
MULTILINESTRING ((0 0, 2 3), (10 10, 3 4)),
|
34
|
+
LINESTRING (0 0, 2 3),
|
35
|
+
MULTIPOINT ((0 0), (2 3)),
|
36
|
+
POINT (9 0)
|
37
|
+
)')
|
38
|
+
end
|
39
|
+
end
|