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,35 @@
|
|
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_num_geometries
|
14
|
+
simple_tester(:num_geometries, 1, 'POINT(0 0)')
|
15
|
+
simple_tester(:num_geometries, 2, 'MULTIPOINT (0 1, 2 3)')
|
16
|
+
simple_tester(:num_geometries, 1, 'LINESTRING (0 0, 2 3)')
|
17
|
+
simple_tester(:num_geometries, 2, 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))')
|
18
|
+
simple_tester(:num_geometries, 1, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
19
|
+
simple_tester(:num_geometries, 2, 'MULTIPOLYGON(
|
20
|
+
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
21
|
+
((10 10, 10 14, 14 14, 14 10, 10 10),
|
22
|
+
(11 11, 11 12, 12 12, 12 11, 11 11)))')
|
23
|
+
simple_tester(:num_geometries, 6, 'GEOMETRYCOLLECTION (
|
24
|
+
MULTIPOLYGON (
|
25
|
+
((0 0, 1 0, 1 1, 0 1, 0 0)),
|
26
|
+
((10 10, 10 14, 14 14, 14 10, 10 10),
|
27
|
+
(11 11, 11 12, 12 12, 12 11, 11 11))
|
28
|
+
),
|
29
|
+
POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)),
|
30
|
+
MULTILINESTRING ((0 0, 2 3), (10 10, 3 4)),
|
31
|
+
LINESTRING (0 0, 2 3),
|
32
|
+
MULTIPOINT (0 0, 2 3),
|
33
|
+
POINT (9 0))')
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryNumInteriorRingsTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_num_interior_rings
|
14
|
+
simple_tester(:num_interior_rings, 0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
15
|
+
simple_tester(:num_interior_rings, 1, 'POLYGON (
|
16
|
+
(10 10, 10 14, 14 14, 14 10, 10 10),
|
17
|
+
(11 11, 11 12, 12 12, 12 11, 11 11)
|
18
|
+
)')
|
19
|
+
simple_tester(:num_interior_rings, 2, 'POLYGON (
|
20
|
+
(10 10, 10 14, 14 14, 14 10, 10 10),
|
21
|
+
(11 11, 11 12, 12 12, 12 11, 11 11),
|
22
|
+
(13 11, 13 12, 13.5 12, 13.5 11, 13 11))')
|
23
|
+
|
24
|
+
assert_raises(NoMethodError) do
|
25
|
+
read('POINT (0 0)').num_interior_rings
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe '#orient_polygons' do
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'does not overwrite the original geometry' do
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:orient_polygons)
|
15
|
+
|
16
|
+
geom = read('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))')
|
17
|
+
|
18
|
+
result = geom.orient_polygons(true)
|
19
|
+
|
20
|
+
assert_equal('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))', write(geom))
|
21
|
+
assert_equal('POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))', write(result))
|
22
|
+
refute_same(geom, result)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'does overwrite the original geometry with bang method' do
|
26
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:orient_polygons!)
|
27
|
+
|
28
|
+
geom = read('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))')
|
29
|
+
|
30
|
+
result = geom.orient_polygons!(true)
|
31
|
+
|
32
|
+
assert_equal('POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))', write(geom))
|
33
|
+
assert_equal('POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))', write(result))
|
34
|
+
assert_same(geom, result)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'handles empty polygons' do
|
38
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:orient_polygons)
|
39
|
+
|
40
|
+
simple_tester(
|
41
|
+
:orient_polygons,
|
42
|
+
'POLYGON EMPTY',
|
43
|
+
'POLYGON EMPTY'
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'hole orientation is opposite to shell' do
|
48
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:orient_polygons)
|
49
|
+
|
50
|
+
simple_tester(
|
51
|
+
:orient_polygons,
|
52
|
+
'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))',
|
53
|
+
'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))'
|
54
|
+
)
|
55
|
+
|
56
|
+
simple_tester(
|
57
|
+
:orient_polygons,
|
58
|
+
'POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))',
|
59
|
+
'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1))',
|
60
|
+
true
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'ensures all polygons in collection are processed' do
|
65
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:orient_polygons)
|
66
|
+
|
67
|
+
simple_tester(
|
68
|
+
:orient_polygons,
|
69
|
+
'MULTIPOLYGON (((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1)), ((100 100, 200 100, 200 200, 100 100)))',
|
70
|
+
'MULTIPOLYGON (((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((100 100, 200 100, 200 200, 100 100)))'
|
71
|
+
)
|
72
|
+
|
73
|
+
simple_tester(
|
74
|
+
:orient_polygons,
|
75
|
+
'MULTIPOLYGON (((0 0, 0 10, 10 10, 10 0, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((100 100, 200 200, 200 100, 100 100)))',
|
76
|
+
'MULTIPOLYGON (((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), ((100 100, 200 100, 200 200, 100 100)))',
|
77
|
+
true
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'polygons in collection are oriented, closed linestring unchanged' do
|
82
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:orient_polygons)
|
83
|
+
|
84
|
+
simple_tester(
|
85
|
+
:orient_polygons,
|
86
|
+
'GEOMETRYCOLLECTION (POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), LINESTRING (100 100, 200 100, 200 200, 100 100))',
|
87
|
+
'GEOMETRYCOLLECTION (POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 2, 1 1)), LINESTRING (100 100, 200 100, 200 200, 100 100))',
|
88
|
+
true
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'nested collection handled correctly' do
|
93
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:orient_polygons)
|
94
|
+
|
95
|
+
simple_tester(
|
96
|
+
:orient_polygons,
|
97
|
+
'GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (MULTIPOLYGON (((0 0, 10 0, 10 10, 0 10, 0 0)))))',
|
98
|
+
'GEOMETRYCOLLECTION (GEOMETRYCOLLECTION (MULTIPOLYGON (((0 0, 10 0, 10 10, 0 10, 0 0)))))'
|
99
|
+
)
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryPointOnSurfaceTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_point_on_surface_and_representative_point
|
14
|
+
%w{
|
15
|
+
point_on_surface
|
16
|
+
representative_point
|
17
|
+
}.each do |method|
|
18
|
+
simple_tester(
|
19
|
+
method,
|
20
|
+
'POINT (0 0)',
|
21
|
+
'POINT (0 0)'
|
22
|
+
)
|
23
|
+
|
24
|
+
simple_tester(
|
25
|
+
method,
|
26
|
+
'POINT (5 0)',
|
27
|
+
'LINESTRING(0 0, 5 0, 10 0)'
|
28
|
+
)
|
29
|
+
|
30
|
+
simple_tester(
|
31
|
+
method,
|
32
|
+
'POINT (5 5)',
|
33
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe '#polygon_hull_simplify' do
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def tester(expected, geom, *args, **options)
|
14
|
+
skip unless ENV['FORCE_TESTS'] || !geom.respond_to?(:polygon_hull_simplify)
|
15
|
+
|
16
|
+
simple_tester(:polygon_hull_simplify, expected, geom, *args, **options)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'handles a POLYGON' do
|
20
|
+
tester(
|
21
|
+
'POLYGON ((10 90, 50 90, 90 90, 90 10, 10 10, 10 90))',
|
22
|
+
'POLYGON ((10 90, 40 60, 20 40, 40 20, 70 50, 40 30, 30 40, 60 70, 50 90, 90 90, 90 10, 10 10, 10 90))',
|
23
|
+
0.5,
|
24
|
+
outer: true
|
25
|
+
)
|
26
|
+
|
27
|
+
tester(
|
28
|
+
'POLYGON ((10 90, 40 60, 30 40, 60 70, 50 90, 90 90, 90 10, 10 10, 10 90))',
|
29
|
+
'POLYGON ((10 90, 40 60, 20 40, 40 20, 70 50, 40 30, 30 40, 60 70, 50 90, 90 90, 90 10, 10 10, 10 90))',
|
30
|
+
0.7,
|
31
|
+
outer: true
|
32
|
+
)
|
33
|
+
|
34
|
+
tester(
|
35
|
+
'POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))',
|
36
|
+
'POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))',
|
37
|
+
0.7,
|
38
|
+
outer: true
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'handles an empty POLYGON' do
|
43
|
+
tester('POLYGON EMPTY', 'POLYGON EMPTY', 0.5, outer: true)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'handles a mode' do
|
47
|
+
tester(
|
48
|
+
'POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))',
|
49
|
+
'POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))',
|
50
|
+
0.7,
|
51
|
+
mode: :area_ratio,
|
52
|
+
outer: true
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryPolygonizeTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_polygonize
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize)
|
15
|
+
|
16
|
+
geom_a = read(
|
17
|
+
'GEOMETRYCOLLECTION(
|
18
|
+
LINESTRING(0 0, 10 10),
|
19
|
+
LINESTRING(185 221, 100 100),
|
20
|
+
LINESTRING(185 221, 88 275, 180 316),
|
21
|
+
LINESTRING(185 221, 292 281, 180 316),
|
22
|
+
LINESTRING(189 98, 83 187, 185 221),
|
23
|
+
LINESTRING(189 98, 325 168, 185 221)
|
24
|
+
)'
|
25
|
+
)
|
26
|
+
|
27
|
+
polygonized = geom_a.polygonize
|
28
|
+
|
29
|
+
assert_equal(2, polygonized.length)
|
30
|
+
assert_equal(
|
31
|
+
'POLYGON ((185 221, 88 275, 180 316, 292 281, 185 221))',
|
32
|
+
write(polygonized[0].snap_to_grid(0.1))
|
33
|
+
)
|
34
|
+
assert_equal(
|
35
|
+
'POLYGON ((189 98, 83 187, 185 221, 325 168, 189 98))',
|
36
|
+
write(polygonized[1].snap_to_grid(0.1))
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_polygonize_with_geometry_arguments
|
41
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize)
|
42
|
+
|
43
|
+
geom_a = read('LINESTRING (100 100, 100 300, 300 300, 300 100, 100 100)')
|
44
|
+
geom_b = read('LINESTRING (150 150, 150 250, 250 250, 250 150, 150 150)')
|
45
|
+
|
46
|
+
polygonized = geom_a.polygonize(geom_b)
|
47
|
+
|
48
|
+
assert_equal(2, polygonized.length)
|
49
|
+
assert_equal(
|
50
|
+
'POLYGON ((100 100, 100 300, 300 300, 300 100, 100 100), (150 150, 250 150, 250 250, 150 250, 150 150))',
|
51
|
+
write(polygonized[0].snap_to_grid(0.1))
|
52
|
+
)
|
53
|
+
assert_equal(
|
54
|
+
'POLYGON ((150 150, 150 250, 250 250, 250 150, 150 150))',
|
55
|
+
write(polygonized[1].snap_to_grid(0.1))
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_polygonize_valid
|
60
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_valid)
|
61
|
+
|
62
|
+
geom_a = read(
|
63
|
+
'GEOMETRYCOLLECTION(
|
64
|
+
LINESTRING (100 100, 100 300, 300 300, 300 100, 100 100),
|
65
|
+
LINESTRING (150 150, 150 250, 250 250, 250 150, 150 150)
|
66
|
+
)'
|
67
|
+
)
|
68
|
+
|
69
|
+
polygonized = geom_a.polygonize_valid
|
70
|
+
|
71
|
+
assert_equal(
|
72
|
+
'POLYGON ((100 100, 100 300, 300 300, 300 100, 100 100), (150 150, 250 150, 250 250, 150 250, 150 150))',
|
73
|
+
write(polygonized.snap_to_grid(0.1))
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_polygonize_cut_edges
|
78
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_cut_edges)
|
79
|
+
|
80
|
+
geom_a = read(
|
81
|
+
'GEOMETRYCOLLECTION(
|
82
|
+
LINESTRING(0 0, 10 10),
|
83
|
+
LINESTRING(185 221, 100 100),
|
84
|
+
LINESTRING(185 221, 88 275, 180 316),
|
85
|
+
LINESTRING(185 221, 292 281, 180 316),
|
86
|
+
LINESTRING(189 98, 83 187, 185 221),
|
87
|
+
LINESTRING(189 98, 325 168, 185 221)
|
88
|
+
)'
|
89
|
+
)
|
90
|
+
|
91
|
+
cut_edges = geom_a.polygonize_cut_edges
|
92
|
+
|
93
|
+
assert_equal(0, cut_edges.length)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_polygonize_full
|
97
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_full)
|
98
|
+
|
99
|
+
writer.rounding_precision = if Geos::GEOS_NICE_VERSION >= '031000'
|
100
|
+
0
|
101
|
+
else
|
102
|
+
3
|
103
|
+
end
|
104
|
+
|
105
|
+
geom_a = read(
|
106
|
+
'GEOMETRYCOLLECTION(
|
107
|
+
LINESTRING(0 0, 10 10),
|
108
|
+
LINESTRING(185 221, 100 100),
|
109
|
+
LINESTRING(185 221, 88 275, 180 316),
|
110
|
+
LINESTRING(185 221, 292 281, 180 316),
|
111
|
+
LINESTRING(189 98, 83 187, 185 221),
|
112
|
+
LINESTRING(189 98, 325 168, 185 221)
|
113
|
+
)'
|
114
|
+
)
|
115
|
+
|
116
|
+
polygonized = geom_a.polygonize_full
|
117
|
+
|
118
|
+
assert_kind_of(Array, polygonized[:rings])
|
119
|
+
assert_kind_of(Array, polygonized[:cuts])
|
120
|
+
assert_kind_of(Array, polygonized[:dangles])
|
121
|
+
assert_kind_of(Array, polygonized[:invalid_rings])
|
122
|
+
|
123
|
+
assert_equal(2, polygonized[:rings].length)
|
124
|
+
assert_equal(0, polygonized[:cuts].length)
|
125
|
+
assert_equal(2, polygonized[:dangles].length)
|
126
|
+
assert_equal(0, polygonized[:invalid_rings].length)
|
127
|
+
|
128
|
+
assert_equal(
|
129
|
+
'POLYGON ((185 221, 88 275, 180 316, 292 281, 185 221))',
|
130
|
+
write(polygonized[:rings][0])
|
131
|
+
)
|
132
|
+
|
133
|
+
assert_equal(
|
134
|
+
'POLYGON ((189 98, 83 187, 185 221, 325 168, 189 98))',
|
135
|
+
write(polygonized[:rings][1])
|
136
|
+
)
|
137
|
+
|
138
|
+
assert_equal(
|
139
|
+
'LINESTRING (185 221, 100 100)',
|
140
|
+
write(polygonized[:dangles][0])
|
141
|
+
)
|
142
|
+
|
143
|
+
assert_equal(
|
144
|
+
'LINESTRING (0 0, 10 10)',
|
145
|
+
write(polygonized[:dangles][1])
|
146
|
+
)
|
147
|
+
|
148
|
+
geom_b = geom_a.union(read('POINT(0 0)'))
|
149
|
+
polygonized = geom_b.polygonize_full
|
150
|
+
|
151
|
+
assert_equal(2, polygonized[:dangles].length)
|
152
|
+
assert_equal(0, polygonized[:invalid_rings].length)
|
153
|
+
|
154
|
+
assert_equal(
|
155
|
+
'LINESTRING (132 146, 100 100)',
|
156
|
+
write(polygonized[:dangles][0])
|
157
|
+
)
|
158
|
+
|
159
|
+
assert_equal(
|
160
|
+
'LINESTRING (0 0, 10 10)',
|
161
|
+
write(polygonized[:dangles][1])
|
162
|
+
)
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_polygonize_with_bad_arguments
|
166
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:polygonize_full)
|
167
|
+
|
168
|
+
assert_raises(ArgumentError) do
|
169
|
+
geom = read('POINT(0 0)')
|
170
|
+
geom.polygonize(geom, 'gibberish')
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryPrecisionTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_precision
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:precision)
|
15
|
+
|
16
|
+
geom = read('POLYGON EMPTY')
|
17
|
+
scale = geom.precision
|
18
|
+
|
19
|
+
assert_in_delta(0.0, scale)
|
20
|
+
|
21
|
+
geom_with_precision = geom.with_precision(2.0)
|
22
|
+
|
23
|
+
assert_equal('POLYGON EMPTY', write(geom_with_precision))
|
24
|
+
scale = geom_with_precision.precision
|
25
|
+
|
26
|
+
assert_in_delta(2.0, scale)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_with_precision
|
30
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:with_precision)
|
31
|
+
|
32
|
+
geom = read('LINESTRING(1 0, 2 0)')
|
33
|
+
|
34
|
+
geom_with_precision = geom.with_precision(5.0)
|
35
|
+
|
36
|
+
assert_equal('LINESTRING EMPTY', write(geom_with_precision))
|
37
|
+
|
38
|
+
geom_with_precision = geom.with_precision(5.0, keep_collapsed: true)
|
39
|
+
|
40
|
+
assert_equal('LINESTRING (0 0, 0 0)', write(geom_with_precision))
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryProjectTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_project_and_project_normalized
|
14
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:project)
|
15
|
+
|
16
|
+
geom_a = read('POINT(1 2)')
|
17
|
+
geom_b = read('POINT(3 4)')
|
18
|
+
|
19
|
+
# The method only accept lineal geometries
|
20
|
+
assert_raises(Geos::GEOSException) do
|
21
|
+
geom_a.project(geom_b)
|
22
|
+
end
|
23
|
+
|
24
|
+
geom_a = read('LINESTRING(0 0, 10 0)')
|
25
|
+
geom_b = read('POINT(0 0)')
|
26
|
+
|
27
|
+
assert_equal(0, geom_a.project(geom_b))
|
28
|
+
assert_equal(0, geom_a.project(geom_b, true))
|
29
|
+
assert_equal(0, geom_a.project_normalized(geom_b))
|
30
|
+
|
31
|
+
geom_b = read('POINT(10 0)')
|
32
|
+
|
33
|
+
assert_equal(10, geom_a.project(geom_b))
|
34
|
+
assert_equal(1, geom_a.project(geom_b, true))
|
35
|
+
assert_equal(1, geom_a.project_normalized(geom_b))
|
36
|
+
|
37
|
+
geom_b = read('POINT(5 0)')
|
38
|
+
|
39
|
+
assert_equal(5, geom_a.project(geom_b))
|
40
|
+
assert_in_delta(0.5, geom_a.project(geom_b, true))
|
41
|
+
assert_in_delta(0.5, geom_a.project_normalized(geom_b))
|
42
|
+
|
43
|
+
geom_a = read('MULTILINESTRING((0 0, 10 0),(20 10, 20 20))')
|
44
|
+
geom_b = read('POINT(20 0)')
|
45
|
+
|
46
|
+
assert_equal(10, geom_a.project(geom_b))
|
47
|
+
assert_in_delta(0.5, geom_a.project(geom_b, true))
|
48
|
+
assert_in_delta(0.5, geom_a.project_normalized(geom_b))
|
49
|
+
|
50
|
+
geom_b = read('POINT(20 5)')
|
51
|
+
|
52
|
+
assert_equal(10, geom_a.project(geom_b))
|
53
|
+
assert_in_delta(0.5, geom_a.project(geom_b, true))
|
54
|
+
assert_in_delta(0.5, geom_a.project_normalized(geom_b))
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryRelateTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_relate
|
14
|
+
tester = lambda { |expected, geom_a, geom_b|
|
15
|
+
assert_equal(expected, geom_a.relate(geom_b))
|
16
|
+
}
|
17
|
+
|
18
|
+
geom_a = read('POINT(0 0)')
|
19
|
+
geom_b = read('POINT(0 0)')
|
20
|
+
tester['0FFFFFFF2', geom_a, geom_b]
|
21
|
+
|
22
|
+
geom_a = read('POINT(0 0)')
|
23
|
+
geom_b = read('POINT(1 0)')
|
24
|
+
tester['FF0FFF0F2', geom_a, geom_b]
|
25
|
+
|
26
|
+
geom_a = read('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))')
|
27
|
+
geom_b = read('POINT(1 0)')
|
28
|
+
tester['FF20F1FF2', geom_a, geom_b]
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_relate_pattern
|
32
|
+
tester = lambda { |pattern, geom_a, geom_b, expected|
|
33
|
+
assert_equal(expected, geom_a.relate_pattern(geom_b, pattern))
|
34
|
+
}
|
35
|
+
|
36
|
+
geom_a = read('POINT(0 0)')
|
37
|
+
geom_b = read('POINT(0 0)')
|
38
|
+
tester['0FFFFFFF2', geom_a, geom_b, true]
|
39
|
+
tester['0*******T', geom_a, geom_b, true]
|
40
|
+
tester['0*******1', geom_a, geom_b, false]
|
41
|
+
|
42
|
+
geom_a = read('POINT(0 0)')
|
43
|
+
geom_b = read('POINT(1 0)')
|
44
|
+
tester['FF0FFF0F2', geom_a, geom_b, true]
|
45
|
+
tester['F*******2', geom_a, geom_b, true]
|
46
|
+
tester['T*******2', geom_a, geom_b, false]
|
47
|
+
|
48
|
+
geom_a = read('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))')
|
49
|
+
geom_b = read('POINT(1 0)')
|
50
|
+
tester['FF20F1FF2', geom_a, geom_b, true]
|
51
|
+
tester['F****T**T', geom_a, geom_b, true]
|
52
|
+
tester['T*******2', geom_a, geom_b, false]
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_relate_boundary_node_rule
|
56
|
+
skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:relate_boundary_node_rule)
|
57
|
+
|
58
|
+
geom_a = read('LINESTRING(0 0, 2 4, 5 5, 0 0)')
|
59
|
+
geom_b = read('POINT(0 0)')
|
60
|
+
|
61
|
+
ret = geom_a.relate_boundary_node_rule(geom_b, :ogc)
|
62
|
+
|
63
|
+
assert_equal('0F1FFFFF2', ret)
|
64
|
+
|
65
|
+
ret = geom_a.relate_boundary_node_rule(geom_b, :endpoint)
|
66
|
+
|
67
|
+
assert_equal('FF10FFFF2', ret)
|
68
|
+
|
69
|
+
assert_raises(TypeError) do
|
70
|
+
geom_a.relate_boundary_node_rule(geom_b, :gibberish)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|