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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +2 -2
  3. data/.rbenv-vars +1 -0
  4. data/.rubocop.yml +538 -92
  5. data/.rubocop_todo.yml +28 -18
  6. data/ffi-geos.gemspec +2 -2
  7. data/lib/ffi-geos/coordinate_sequence.rb +2 -1
  8. data/lib/ffi-geos/geometry.rb +95 -1
  9. data/lib/ffi-geos/point.rb +9 -0
  10. data/lib/ffi-geos/version.rb +1 -1
  11. data/lib/ffi-geos.rb +78 -3
  12. data/test/coordinate_sequence_tests.rb +22 -4
  13. data/test/geojson_reader_tests.rb +6 -2
  14. data/test/geometry/area_tests.rb +18 -0
  15. data/test/geometry/boundary_tests.rb +36 -0
  16. data/test/geometry/buffer_tests.rb +116 -0
  17. data/test/geometry/build_area_tests.rb +20 -0
  18. data/test/geometry/centroid_tests.rb +37 -0
  19. data/test/geometry/clip_by_rect_tests.rb +56 -0
  20. data/test/geometry/clone_tests.rb +29 -0
  21. data/test/geometry/concave_hull_of_polygons_tests.rb +28 -0
  22. data/test/geometry/concave_hull_tests.rb +38 -0
  23. data/test/geometry/convex_hull_tests.rb +26 -0
  24. data/test/geometry/coord_seq_tests.rb +27 -0
  25. data/test/geometry/delaunay_triangulation_tests.rb +82 -0
  26. data/test/geometry/densify_tests.rb +95 -0
  27. data/test/geometry/difference_tests.rb +108 -0
  28. data/test/geometry/dimensions_tests.rb +46 -0
  29. data/test/geometry/distance_tests.rb +29 -0
  30. data/test/geometry/dump_points_tests.rb +60 -0
  31. data/test/geometry/dup_tests.rb +29 -0
  32. data/test/geometry/empty_tests.rb +23 -0
  33. data/test/geometry/envelope_tests.rb +26 -0
  34. data/test/geometry/equal_identical_tests.rb +78 -0
  35. data/test/geometry/equal_tests.rb +62 -0
  36. data/test/geometry/exterior_ring_tests.rb +27 -0
  37. data/test/geometry/extract_unique_points_tests.rb +41 -0
  38. data/test/geometry/frecet_distance_tests.rb +24 -0
  39. data/test/geometry/get_geometry_n_tests.rb +21 -0
  40. data/test/geometry/hausdorff_distance_tests.rb +46 -0
  41. data/test/geometry/hilbert_code_tests.rb +45 -0
  42. data/test/geometry/interior_ring_n_tests.rb +64 -0
  43. data/test/geometry/interior_rings_tests.rb +36 -0
  44. data/test/geometry/interpolate_tests.rb +49 -0
  45. data/test/geometry/intersection_tests.rb +49 -0
  46. data/test/geometry/largest_empty_circle_tests.rb +26 -0
  47. data/test/geometry/length_tests.rb +18 -0
  48. data/test/geometry/line_merge_directed_tests.rb +28 -0
  49. data/test/geometry/line_merge_tests.rb +25 -0
  50. data/test/geometry/line_string_enumerator_tests.rb +20 -0
  51. data/test/geometry/line_substring_tests.rb +76 -0
  52. data/test/geometry/make_valid_tests.rb +27 -0
  53. data/test/geometry/maximum_inscribed_circle_tests.rb +21 -0
  54. data/test/geometry/minimum_bounding_circle_tests.rb +23 -0
  55. data/test/geometry/minimum_clearance_tests.rb +58 -0
  56. data/test/geometry/minimum_rotated_rectangle_tests.rb +28 -0
  57. data/test/geometry/minimum_width_tests.rb +26 -0
  58. data/test/geometry/misc_tests.rb +24 -0
  59. data/test/geometry/nearest_points_tests.rb +46 -0
  60. data/test/geometry/node_tests.rb +22 -0
  61. data/test/geometry/normalize_tests.rb +34 -0
  62. data/test/geometry/num_coordinates_tests.rb +39 -0
  63. data/test/geometry/num_goemetries_tests.rb +35 -0
  64. data/test/geometry/num_interior_rings_tests.rb +28 -0
  65. data/test/geometry/orient_polygons_tests.rb +101 -0
  66. data/test/geometry/point_on_surface_tests.rb +37 -0
  67. data/test/geometry/polygon_hull_simplify_tests.rb +55 -0
  68. data/test/geometry/polygonize_tests.rb +173 -0
  69. data/test/geometry/precision_tests.rb +42 -0
  70. data/test/geometry/project_tests.rb +56 -0
  71. data/test/geometry/relate_tests.rb +73 -0
  72. data/test/geometry/relationships_tests.rb +138 -0
  73. data/test/geometry/reverse_tests.rb +44 -0
  74. data/test/geometry/ring_tests.rb +18 -0
  75. data/test/geometry/shared_path_tests.rb +31 -0
  76. data/test/geometry/simple_tests.rb +18 -0
  77. data/test/geometry/simplify_tests.rb +21 -0
  78. data/test/geometry/snap_tests.rb +20 -0
  79. data/test/geometry/srid_copy_policy_tests.rb +94 -0
  80. data/test/geometry/start_and_end_point_tests.rb +24 -0
  81. data/test/geometry/sym_difference_tests.rb +114 -0
  82. data/test/geometry/topology_preserve_simplify_tests.rb +21 -0
  83. data/test/geometry/union_tests.rb +216 -0
  84. data/test/geometry/valid_tests.rb +56 -0
  85. data/test/geometry/voronoi_diagram_tests.rb +62 -0
  86. data/test/geometry_collection_tests.rb +14 -2
  87. data/test/interrupt_tests.rb +1 -1
  88. data/test/line_string_tests.rb +24 -3
  89. data/test/misc_tests.rb +1 -1
  90. data/test/point/has_m_tests.rb +43 -0
  91. data/test/point/x_y_z_m_tests.rb +51 -0
  92. data/test/point_tests.rb +25 -3
  93. data/test/polygon_tests.rb +14 -1
  94. data/test/prepared_geometry_tests.rb +6 -5
  95. data/test/strtree_tests.rb +11 -18
  96. data/test/test_helper.rb +2 -0
  97. data/test/tools_tests.rb +7 -0
  98. data/test/utils_tests.rb +14 -3
  99. data/test/wkb_reader_tests.rb +1 -0
  100. data/test/wkb_writer_tests.rb +26 -5
  101. data/test/wkt_reader_tests.rb +2 -0
  102. data/test/wkt_writer_tests.rb +20 -2
  103. metadata +154 -7
  104. data/test/geometry_tests.rb +0 -2114
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryDimensionsTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_dimensions
14
+ types = {
15
+ dontcare: -3,
16
+ non_empty: -2,
17
+ empty: -1,
18
+ point: 0,
19
+ curve: 1,
20
+ surface: 2
21
+ }
22
+
23
+ simple_tester(:dimensions, types[:point], 'POINT(0 0)')
24
+ simple_tester(:dimensions, types[:point], 'MULTIPOINT (0 1, 2 3)')
25
+ simple_tester(:dimensions, types[:curve], 'LINESTRING (0 0, 2 3)')
26
+ simple_tester(:dimensions, types[:curve], 'MULTILINESTRING ((0 1, 2 3), (10 10, 3 4))')
27
+ simple_tester(:dimensions, types[:surface], 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
28
+ simple_tester(:dimensions, types[:surface], 'MULTIPOLYGON (
29
+ ((0 0, 1 0, 1 1, 0 1, 0 0)),
30
+ ((10 10, 10 14, 14 14, 14 10, 10 10),
31
+ (11 11, 11 12, 12 12, 12 11, 11 11))
32
+ )')
33
+ simple_tester(:dimensions, types[:surface], 'GEOMETRYCOLLECTION (
34
+ MULTIPOLYGON (
35
+ ((0 0, 1 0, 1 1, 0 1, 0 0)),
36
+ ((10 10, 10 14, 14 14, 14 10, 10 10),
37
+ (11 11, 11 12, 12 12, 12 11, 11 11))
38
+ ),
39
+ POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)),
40
+ MULTILINESTRING ((0 0, 2 3), (10 10, 3 4)),
41
+ LINESTRING (0 0, 2 3),
42
+ MULTIPOINT (0 0, 2 3),
43
+ POINT (9 0)
44
+ )')
45
+ end
46
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryDistanceTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_distance
14
+ geom = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
15
+ simple_tester(:distance, 0.0, geom, read('POINT(0.5 0.5)'))
16
+ simple_tester(:distance, 1.0, geom, read('POINT (-1 0)'))
17
+ simple_tester(:distance, 2.0, geom, read('LINESTRING (3 0 , 10 0)'))
18
+ end
19
+
20
+ def test_distance_indexed
21
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:distance_indexed)
22
+
23
+ geom_a = read('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
24
+ geom_b = read('POLYGON ((20 30, 10 10, 13 14, 7 8, 20 30))')
25
+
26
+ assert_in_delta(9.219544457292887, geom_a.distance_indexed(geom_b), TOLERANCE)
27
+ assert_in_delta(9.219544457292887, geom_b.distance_indexed(geom_a), TOLERANCE)
28
+ end
29
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryDumpPointsTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_dump_points
14
+ geom = read('GEOMETRYCOLLECTION(
15
+ MULTILINESTRING((0 0, 10 10, 20 20), (100 100, 200 200, 300 300)),
16
+
17
+ POINT(10 10),
18
+
19
+ POLYGON((0 0, 5 0, 5 5, 0 5, 0 0), (1 1, 4 1, 4 4, 1 4, 1 1))
20
+ )')
21
+
22
+ assert_equal([
23
+ [
24
+ [
25
+ Geos.create_point(0, 0),
26
+ Geos.create_point(10, 10),
27
+ Geos.create_point(20, 20)
28
+ ],
29
+
30
+ [
31
+ Geos.create_point(100, 100),
32
+ Geos.create_point(200, 200),
33
+ Geos.create_point(300, 300)
34
+ ]
35
+ ],
36
+
37
+ [
38
+ Geos.create_point(10, 10)
39
+ ],
40
+
41
+ [
42
+ [
43
+ Geos.create_point(0, 0),
44
+ Geos.create_point(5, 0),
45
+ Geos.create_point(5, 5),
46
+ Geos.create_point(0, 5),
47
+ Geos.create_point(0, 0)
48
+ ],
49
+
50
+ [
51
+ Geos.create_point(1, 1),
52
+ Geos.create_point(4, 1),
53
+ Geos.create_point(4, 4),
54
+ Geos.create_point(1, 4),
55
+ Geos.create_point(1, 1)
56
+ ]
57
+ ]
58
+ ], geom.dump_points)
59
+ end
60
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryDupTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_dup
14
+ geom_a = read('POINT(0 0)')
15
+ geom_b = geom_a.dup
16
+
17
+ assert_equal(geom_a, geom_b)
18
+ end
19
+
20
+ def test_dup_srid
21
+ srid = 4326
22
+ geom_a = read('POINT(0 0)')
23
+ geom_a.srid = srid
24
+ geom_b = geom_a.dup
25
+
26
+ assert_equal(geom_a, geom_b)
27
+ assert_equal(srid, geom_b.srid)
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryEmptyTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_empty
14
+ refute_geom_empty(read('POINT(0 0)'))
15
+ assert_geom_empty(read('POINT EMPTY'))
16
+ refute_geom_empty(read('LINESTRING(0 0, 10 0)'))
17
+ assert_geom_empty(read('LINESTRING EMPTY'))
18
+ refute_geom_empty(read('POLYGON((0 0, 10 0, 10 10, 0 0))'))
19
+ assert_geom_empty(read('POLYGON EMPTY'))
20
+ refute_geom_empty(read('GEOMETRYCOLLECTION(POINT(0 0))'))
21
+ assert_geom_empty(read('GEOMETRYCOLLECTION EMPTY'))
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryEnvelopeTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_envelope
14
+ simple_tester(
15
+ :envelope,
16
+ 'POINT (0 0)',
17
+ 'POINT(0 0)'
18
+ )
19
+
20
+ simple_tester(
21
+ :envelope,
22
+ 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))',
23
+ 'LINESTRING(0 0, 10 10)'
24
+ )
25
+ end
26
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryEqualIdenticalTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def tester(expected, geom_a, geom_b)
14
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:eql_identical?)
15
+
16
+ assert_equal(expected, read(geom_a).eql_identical?(read(geom_b)))
17
+ end
18
+
19
+ def test_different_types
20
+ tester(false, 'POINT EMPTY', 'LINESTRING EMPTY')
21
+ end
22
+
23
+ def test_different_dimensions_empty
24
+ tester(false, 'POINT EMPTY', 'POINT Z EMPTY')
25
+ end
26
+
27
+ def test_different_dimensions
28
+ tester(false, 'POINT Z (1 2 3)', 'POINT M (1 2 3)')
29
+ end
30
+
31
+ def test_different_dimensions_zm_versus_m
32
+ tester(false, 'POINT ZM (1 2 3 4)', 'POINT Z (1 2 3)')
33
+ end
34
+
35
+ def test_different_structure
36
+ tester(false, 'LINESTRING (1 1, 2 2)', 'MULTILINESTRING ((1 1, 2 2))')
37
+ end
38
+
39
+ def test_different_types_geometry_collection
40
+ tester(false, 'GEOMETRYCOLLECTION (LINESTRING (1 1, 2 2))', 'MULTILINESTRING ((1 1, 2 2))')
41
+ end
42
+
43
+ def test_non_finite_values
44
+ tester(true, 'POINT(inf inf)', 'POINT(inf inf)')
45
+ end
46
+
47
+ def test_equal_lines
48
+ tester(true, 'LINESTRING M (1 1 0, 2 2 1)', 'LINESTRING M (1 1 0, 2 2 1)')
49
+ end
50
+
51
+ def test_different_lines
52
+ tester(false, 'LINESTRING M (1 1 0, 2 2 1)', 'LINESTRING M (1 1 1, 2 2 1)')
53
+ end
54
+
55
+ def test_equal_polygons
56
+ tester(true, 'POLYGON ((0 0, 1 0, 1 1, 0 0))', 'POLYGON ((0 0, 1 0, 1 1, 0 0))')
57
+ end
58
+
59
+ def test_different_polygons
60
+ tester(false, 'POLYGON ((0 0, 1 0, 1 1, 0 0))', 'POLYGON ((1 0, 1 1, 0 0, 1 0))')
61
+ end
62
+
63
+ def test_equal_polygons_with_holes
64
+ tester(false, 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 1))', 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 2 1, 2 2, 1 1), (3 3, 4 3, 4 4, 3 3))')
65
+ end
66
+
67
+ def test_identical_collections
68
+ tester(true, 'MULTILINESTRING ((1 1, 2 2), (2 2, 3 3))', 'MULTILINESTRING ((1 1, 2 2), (2 2, 3 3))')
69
+ end
70
+
71
+ def test_different_collection_structure
72
+ tester(false, 'MULTILINESTRING ((1 1, 2 2), (2 2, 3 3))', 'MULTILINESTRING ((2 2, 3 3), (1 1, 2 2))')
73
+ end
74
+
75
+ def test_negative_zeo_and_positive_zero
76
+ tester(true, 'POINT(1 0)', 'POINT(1 -0)')
77
+ end
78
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryEqualTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_eql
14
+ geom_a = read('POINT(1.0 1.0)')
15
+ geom_b = read('POINT(2.0 2.0)')
16
+
17
+ %w{ eql? equals? }.each do |method|
18
+ assert(geom_a.send(method, geom_a), "Expected geoms to be equal using #{method}")
19
+ refute(geom_a.send(method, geom_b), "Expected geoms to not be equal using #{method}")
20
+ end
21
+ end
22
+
23
+ def test_equals_operator
24
+ geom_a = read('POINT(1.0 1.0)')
25
+ geom_b = read('POINT(2.0 2.0)')
26
+
27
+ refute_equal(geom_a, geom_b, 'Expected geoms to not be equal using ==')
28
+ refute_equal(geom_a, 'test', 'Expected geoms to not be equal using ==')
29
+ end
30
+
31
+ def test_eql_exact
32
+ geom_a = read('POINT(1.0 1.0)')
33
+ geom_b = read('POINT(2.0 2.0)')
34
+
35
+ %w{ eql_exact? equals_exact? exactly_equals? }.each do |method|
36
+ refute(geom_a.send(method, geom_b, 0.001), "Expected geoms to not be equal using #{method}")
37
+ end
38
+ end
39
+
40
+ def test_eql_almost_default
41
+ geom = read('POINT (1 1)')
42
+ geom_a = read('POINT (1.0000001 1.0000001)')
43
+ geom_b = read('POINT (1.000001 1.000001)')
44
+
45
+ %w{ eql_almost? equals_almost? almost_equals? }.each do |method|
46
+ assert(geom.send(method, geom_a), "Expected geoms to be equal using #{method}")
47
+ refute(geom.send(method, geom_b), "Expected geoms to not be equal using #{method}")
48
+ end
49
+ end
50
+
51
+ def test_eql_almost
52
+ geom_a = read('POINT(1.0 1.0)')
53
+ geom_b = read('POINT(1.1 1.1)')
54
+
55
+ refute_equal(geom_a, geom_b)
56
+
57
+ %w{ eql_almost? equals_almost? almost_equals? }.each do |method|
58
+ assert(geom_a.send(method, geom_b, 0), "Expected geoms to be equal using #{method}")
59
+ refute(geom_a.send(method, geom_b, 1), "Expected geoms to not be equal using #{method}")
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryInteriorRingTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_exterior_ring
14
+ simple_tester(
15
+ :exterior_ring,
16
+ 'LINEARRING (10 10, 10 14, 14 14, 14 10, 10 10)',
17
+ 'POLYGON (
18
+ (10 10, 10 14, 14 14, 14 10, 10 10),
19
+ (11 11, 11 12, 12 12, 12 11, 11 11)
20
+ )'
21
+ )
22
+
23
+ assert_raises(NoMethodError) do
24
+ read('POINT (0 0)').exterior_ring
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryExtractUniquePointsTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_extract_unique_points
14
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:extract_unique_points)
15
+
16
+ geom = read('GEOMETRYCOLLECTION (
17
+ MULTIPOLYGON (
18
+ ((0 0, 1 0, 1 1, 0 1, 0 0)),
19
+ ((10 10, 10 14, 14 14, 14 10, 10 10),
20
+ (11 11, 11 12, 12 12, 12 11, 11 11))
21
+ ),
22
+ POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)),
23
+ MULTILINESTRING ((0 0, 2 3), (10 10, 3 4)),
24
+ LINESTRING (0 0, 2 3),
25
+ MULTIPOINT (0 0, 2 3),
26
+ POINT (9 0),
27
+ POINT (1 0),
28
+ LINESTRING EMPTY
29
+ )')
30
+
31
+ simple_tester(
32
+ :extract_unique_points,
33
+ if Geos::GEOS_NICE_VERSION >= '031200'
34
+ '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))'
35
+ else
36
+ '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)'
37
+ end,
38
+ geom.extract_unique_points
39
+ )
40
+ end
41
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryFrechetDistanceTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_frechet_distance
14
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:frechet_distance)
15
+
16
+ assert_in_delta(read('LINESTRING (0 0, 100 0)').frechet_distance(read('LINESTRING (0 0, 50 50, 100 0)')), 70.7106781186548, TOLERANCE)
17
+ end
18
+
19
+ def test_frechet_distance_with_densify
20
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:frechet_distance)
21
+
22
+ assert_in_delta(read('LINESTRING (0 0, 100 0)').frechet_distance(read('LINESTRING (0 0, 50 50, 100 0)'), 0.5), 50.0, TOLERANCE)
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryGetGeometryNTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ # get_geometry_n is segfaulting in the binary GEOS build
14
+ def test_get_geometry_n
15
+ skip unless defined?(Geos::FFIGeos)
16
+
17
+ simple_tester(:get_geometry_n, 'POINT (0 1)', 'MULTIPOINT (0 1, 2 3)', 0)
18
+ simple_tester(:get_geometry_n, 'POINT (2 3)', 'MULTIPOINT (0 1, 2 3)', 1)
19
+ simple_tester(:get_geometry_n, nil, 'MULTIPOINT (0 1, 2 3)', 2)
20
+ end
21
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryHausdorffDistanceTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_hausdorff_distance
14
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:hausdorff_distance)
15
+
16
+ tester = lambda { |expected, g_1, g_2|
17
+ geom_1 = read(g_1)
18
+ geom_2 = read(g_2)
19
+
20
+ assert_in_delta(expected, geom_1.hausdorff_distance(geom_2), TOLERANCE)
21
+ }
22
+
23
+ geom_a = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
24
+
25
+ tester[10.0498756211209, geom_a, 'POINT(0 10)']
26
+ tester[2.23606797749979, geom_a, 'POINT(-1 0)']
27
+ tester[9.0, geom_a, 'LINESTRING (3 0 , 10 0)']
28
+ end
29
+
30
+ def test_hausdorff_distance_with_densify_fract
31
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:hausdorff_distance)
32
+
33
+ tester = lambda { |expected, g_1, g_2|
34
+ geom_1 = read(g_1)
35
+ geom_2 = read(g_2)
36
+
37
+ assert_in_delta(expected, geom_1.hausdorff_distance(geom_2, 0.001), TOLERANCE)
38
+ }
39
+
40
+ geom_a = 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'
41
+
42
+ tester[10.0498756211209, geom_a, 'POINT(0 10)']
43
+ tester[2.23606797749979, geom_a, 'POINT(-1 0)']
44
+ tester[9.0, geom_a, 'LINESTRING (3 0 , 10 0)']
45
+ end
46
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ describe '#hilbert_code' do
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ it 'handles various points on the Hilbert curve' do
14
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:hilbert_code)
15
+
16
+ geom_a = read('POINT (0 0)')
17
+ geom_b = read('POINT (1 1)')
18
+ extent = read('POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))')
19
+
20
+ assert_equal(0, geom_a.hilbert_code(extent, 1))
21
+ assert_equal(0, geom_a.hilbert_code(extent, 16))
22
+ assert_equal(10, geom_b.hilbert_code(extent, 2))
23
+ assert_equal(43690, geom_b.hilbert_code(extent, 8))
24
+ assert_equal(2863311530, geom_b.hilbert_code(extent, 16))
25
+ end
26
+
27
+ it 'can calculate the midpoint' do
28
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:hilbert_code)
29
+
30
+ extent = read('POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))')
31
+
32
+ assert_equal(2, extent.hilbert_code(extent, 2))
33
+ end
34
+
35
+ it 'handles out of bounds' do
36
+ skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:hilbert_code)
37
+
38
+ geom = read('POINT (0 0)')
39
+ extent = read('POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))')
40
+
41
+ assert_raises(Geos::GEOSException) do
42
+ geom.hilbert_code(extent, 17)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryInteriorRingNTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_interior_ring_n
14
+ simple_tester(
15
+ :interior_ring_n,
16
+ 'LINEARRING (11 11, 11 12, 12 12, 12 11, 11 11)',
17
+ 'POLYGON(
18
+ (10 10, 10 14, 14 14, 14 10, 10 10),
19
+ (11 11, 11 12, 12 12, 12 11, 11 11)
20
+ )',
21
+ 0
22
+ )
23
+
24
+ simple_tester(
25
+ :interior_ring_n,
26
+ 'LINEARRING (11 11, 11 12, 12 12, 12 11, 11 11)',
27
+ 'POLYGON (
28
+ (10 10, 10 14, 14 14, 14 10, 10 10),
29
+ (11 11, 11 12, 12 12, 12 11, 11 11),
30
+ (13 11, 13 12, 13.5 12, 13.5 11, 13 11)
31
+ )',
32
+ 0
33
+ )
34
+
35
+ simple_tester(
36
+ :interior_ring_n,
37
+ 'LINEARRING (13 11, 13 12, 13.5 12, 13.5 11, 13 11)',
38
+ 'POLYGON (
39
+ (10 10, 10 14, 14 14, 14 10, 10 10),
40
+ (11 11, 11 12, 12 12, 12 11, 11 11),
41
+ (13 11, 13 12, 13.5 12, 13.5 11, 13 11)
42
+ )',
43
+ 1
44
+ )
45
+
46
+ assert_raises(Geos::IndexBoundsError) do
47
+ simple_tester(
48
+ :interior_ring_n,
49
+ nil,
50
+ 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))',
51
+ 0
52
+ )
53
+ end
54
+
55
+ assert_raises(NoMethodError) do
56
+ simple_tester(
57
+ :interior_ring_n,
58
+ nil,
59
+ 'POINT (0 0)',
60
+ 0
61
+ )
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class GeometryInteriorRingsTests < Minitest::Test
6
+ include TestHelper
7
+
8
+ def setup
9
+ super
10
+ writer.trim = true
11
+ end
12
+
13
+ def test_interior_rings
14
+ array_tester(
15
+ :interior_rings,
16
+ ['LINEARRING (11 11, 11 12, 12 12, 12 11, 11 11)'],
17
+ 'POLYGON(
18
+ (10 10, 10 14, 14 14, 14 10, 10 10),
19
+ (11 11, 11 12, 12 12, 12 11, 11 11)
20
+ )'
21
+ )
22
+
23
+ array_tester(
24
+ :interior_rings,
25
+ [
26
+ 'LINEARRING (11 11, 11 12, 12 12, 12 11, 11 11)',
27
+ 'LINEARRING (13 11, 13 12, 13.5 12, 13.5 11, 13 11)'
28
+ ],
29
+ 'POLYGON (
30
+ (10 10, 10 14, 14 14, 14 10, 10 10),
31
+ (11 11, 11 12, 12 12, 12 11, 11 11),
32
+ (13 11, 13 12, 13.5 12, 13.5 11, 13 11)
33
+ )'
34
+ )
35
+ end
36
+ end