ffi-geos 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.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,116 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryBufferTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_buffer
         
     | 
| 
      
 14 
     | 
    
         
            +
                simple_tester(
         
     | 
| 
      
 15 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 16 
     | 
    
         
            +
                  'POLYGON EMPTY',
         
     | 
| 
      
 17 
     | 
    
         
            +
                  'POINT(0 0)',
         
     | 
| 
      
 18 
     | 
    
         
            +
                  0
         
     | 
| 
      
 19 
     | 
    
         
            +
                )
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 22 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 23 
     | 
    
         
            +
                  'POLYGON ((10 0, 10 -2, 9 -4, 8 -6, 7 -7, 6 -8, 4 -9, 2 -10, 0 -10, -2 -10, -4 -9, -6 -8, -7 -7, -8 -6, -9 -4, -10 -2, -10 0, -10 2, -9 4, -8 6, -7 7, -6 8, -4 9, -2 10, 0 10, 2 10, 4 9, 6 8, 7 7, 8 6, 9 4, 10 2, 10 0))',
         
     | 
| 
      
 24 
     | 
    
         
            +
                  'POINT(0 0)',
         
     | 
| 
      
 25 
     | 
    
         
            +
                  10
         
     | 
| 
      
 26 
     | 
    
         
            +
                )
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                # One segment per quadrant
         
     | 
| 
      
 29 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 30 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 31 
     | 
    
         
            +
                  'POLYGON ((10 0, 0 -10, -10 0, 0 10, 10 0))',
         
     | 
| 
      
 32 
     | 
    
         
            +
                  'POINT(0 0)',
         
     | 
| 
      
 33 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 34 
     | 
    
         
            +
                  quad_segs: 1
         
     | 
| 
      
 35 
     | 
    
         
            +
                )
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                # End cap styles
         
     | 
| 
      
 38 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 39 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 40 
     | 
    
         
            +
                  'POLYGON ((100 10, 110 0, 100 -10, 0 -10, -10 0, 0 10, 100 10))',
         
     | 
| 
      
 41 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0)',
         
     | 
| 
      
 42 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 43 
     | 
    
         
            +
                  quad_segs: 1, endcap: :round
         
     | 
| 
      
 44 
     | 
    
         
            +
                )
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 47 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 48 
     | 
    
         
            +
                  'POLYGON ((100 10, 100 -10, 0 -10, 0 10, 100 10))',
         
     | 
| 
      
 49 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0)',
         
     | 
| 
      
 50 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 51 
     | 
    
         
            +
                  quad_segs: 1, endcap: :flat
         
     | 
| 
      
 52 
     | 
    
         
            +
                )
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 55 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 56 
     | 
    
         
            +
                  'POLYGON ((100 10, 110 10, 110 -10, 0 -10, -10 -10, -10 10, 100 10))',
         
     | 
| 
      
 57 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0)',
         
     | 
| 
      
 58 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 59 
     | 
    
         
            +
                  quad_segs: 1, endcap: :square
         
     | 
| 
      
 60 
     | 
    
         
            +
                )
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                # Join styles
         
     | 
| 
      
 63 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 64 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 65 
     | 
    
         
            +
                  'POLYGON ((90 10, 90 100, 93 107, 100 110, 107 107, 110 100, 110 0, 107 -7, 100 -10, 0 -10, -7 -7, -10 0, -7 7, 0 10, 90 10))',
         
     | 
| 
      
 66 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0, 100 100)',
         
     | 
| 
      
 67 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 68 
     | 
    
         
            +
                  quad_segs: 2, join: :round
         
     | 
| 
      
 69 
     | 
    
         
            +
                )
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 72 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 73 
     | 
    
         
            +
                  'POLYGON ((90 10, 90 100, 93 107, 100 110, 107 107, 110 100, 110 0, 100 -10, 0 -10, -7 -7, -10 0, -7 7, 0 10, 90 10))',
         
     | 
| 
      
 74 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0, 100 100)',
         
     | 
| 
      
 75 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 76 
     | 
    
         
            +
                  quad_segs: 2, join: :bevel
         
     | 
| 
      
 77 
     | 
    
         
            +
                )
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 80 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 81 
     | 
    
         
            +
                  'POLYGON ((90 10, 90 100, 93 107, 100 110, 107 107, 110 100, 110 -10, 0 -10, -7 -7, -10 0, -7 7, 0 10, 90 10))',
         
     | 
| 
      
 82 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0, 100 100)',
         
     | 
| 
      
 83 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 84 
     | 
    
         
            +
                  quad_segs: 2, join: :mitre
         
     | 
| 
      
 85 
     | 
    
         
            +
                )
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 88 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 89 
     | 
    
         
            +
                  if Geos::GEOS_NICE_VERSION >= '031100'
         
     | 
| 
      
 90 
     | 
    
         
            +
                    'POLYGON ((90 10, 90 100, 93 107, 100 110, 107 107, 110 100, 110 -4, 104 -10, 0 -10, -7 -7, -10 0, -7 7, 0 10, 90 10))'
         
     | 
| 
      
 91 
     | 
    
         
            +
                  else
         
     | 
| 
      
 92 
     | 
    
         
            +
                    'POLYGON ((90 10, 90 100, 93 107, 100 110, 107 107, 110 100, 109 -5, 105 -9, 0 -10, -7 -7, -10 0, -7 7, 0 10, 90 10))'
         
     | 
| 
      
 93 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 94 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0, 100 100)',
         
     | 
| 
      
 95 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 96 
     | 
    
         
            +
                  quad_segs: 2, join: :mitre, mitre_limit: 1.0
         
     | 
| 
      
 97 
     | 
    
         
            +
                )
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
                # Single-sided buffering
         
     | 
| 
      
 100 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 101 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 102 
     | 
    
         
            +
                  'POLYGON ((100 0, 0 0, 0 10, 100 10, 100 0))',
         
     | 
| 
      
 103 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0)',
         
     | 
| 
      
 104 
     | 
    
         
            +
                  10,
         
     | 
| 
      
 105 
     | 
    
         
            +
                  single_sided: true
         
     | 
| 
      
 106 
     | 
    
         
            +
                )
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
                snapped_tester(
         
     | 
| 
      
 109 
     | 
    
         
            +
                  :buffer,
         
     | 
| 
      
 110 
     | 
    
         
            +
                  'POLYGON ((0 0, 100 0, 100 -10, 0 -10, 0 0))',
         
     | 
| 
      
 111 
     | 
    
         
            +
                  'LINESTRING(0 0, 100 0)',
         
     | 
| 
      
 112 
     | 
    
         
            +
                  -10,
         
     | 
| 
      
 113 
     | 
    
         
            +
                  single_sided: true
         
     | 
| 
      
 114 
     | 
    
         
            +
                )
         
     | 
| 
      
 115 
     | 
    
         
            +
              end
         
     | 
| 
      
 116 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,20 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryBuildAreaTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_build_area
         
     | 
| 
      
 14 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:build_area)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                geom = read('GEOMETRYCOLLECTION (LINESTRING(0 0, 0 1, 1 1), LINESTRING (1 1, 1 0, 0 0))')
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                assert_equal('POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))', write(geom.build_area))
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryCentroidTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_centroid_and_center
         
     | 
| 
      
 14 
     | 
    
         
            +
                %w{
         
     | 
| 
      
 15 
     | 
    
         
            +
                  centroid
         
     | 
| 
      
 16 
     | 
    
         
            +
                  center
         
     | 
| 
      
 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 5)',
         
     | 
| 
      
 27 
     | 
    
         
            +
                    'LINESTRING(0 0, 10 10)'
         
     | 
| 
      
 28 
     | 
    
         
            +
                  )
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  snapped_tester(
         
     | 
| 
      
 31 
     | 
    
         
            +
                    method,
         
     | 
| 
      
 32 
     | 
    
         
            +
                    'POINT (5 4)',
         
     | 
| 
      
 33 
     | 
    
         
            +
                    'POLYGON((0 0, 0 10, 5 5, 10 10, 10 0, 0 0))'
         
     | 
| 
      
 34 
     | 
    
         
            +
                  )
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryClipByRectTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_clip_by_rect
         
     | 
| 
      
 14 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:clip_by_rect)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                %w{
         
     | 
| 
      
 17 
     | 
    
         
            +
                  clip_by_rect
         
     | 
| 
      
 18 
     | 
    
         
            +
                  clip_by_rectangle
         
     | 
| 
      
 19 
     | 
    
         
            +
                }.each do |method|
         
     | 
| 
      
 20 
     | 
    
         
            +
                  simple_tester(
         
     | 
| 
      
 21 
     | 
    
         
            +
                    method,
         
     | 
| 
      
 22 
     | 
    
         
            +
                    'POINT (0 0)',
         
     | 
| 
      
 23 
     | 
    
         
            +
                    'POINT (0 0)',
         
     | 
| 
      
 24 
     | 
    
         
            +
                    -1, -1, 1, 1
         
     | 
| 
      
 25 
     | 
    
         
            +
                  )
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  simple_tester(
         
     | 
| 
      
 28 
     | 
    
         
            +
                    method,
         
     | 
| 
      
 29 
     | 
    
         
            +
                    'GEOMETRYCOLLECTION EMPTY',
         
     | 
| 
      
 30 
     | 
    
         
            +
                    'POINT (0 0)',
         
     | 
| 
      
 31 
     | 
    
         
            +
                    0, 0, 2, 2
         
     | 
| 
      
 32 
     | 
    
         
            +
                  )
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  simple_tester(
         
     | 
| 
      
 35 
     | 
    
         
            +
                    method,
         
     | 
| 
      
 36 
     | 
    
         
            +
                    'LINESTRING (1 0, 2 0)',
         
     | 
| 
      
 37 
     | 
    
         
            +
                    'LINESTRING (0 0, 10 0)',
         
     | 
| 
      
 38 
     | 
    
         
            +
                    1, -1, 2, 1
         
     | 
| 
      
 39 
     | 
    
         
            +
                  )
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  simple_tester(
         
     | 
| 
      
 42 
     | 
    
         
            +
                    method,
         
     | 
| 
      
 43 
     | 
    
         
            +
                    'POLYGON ((1 1, 1 5, 5 5, 5 1, 1 1))',
         
     | 
| 
      
 44 
     | 
    
         
            +
                    'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))',
         
     | 
| 
      
 45 
     | 
    
         
            +
                    1, 1, 5, 5
         
     | 
| 
      
 46 
     | 
    
         
            +
                  )
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  simple_tester(
         
     | 
| 
      
 49 
     | 
    
         
            +
                    method,
         
     | 
| 
      
 50 
     | 
    
         
            +
                    'POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))',
         
     | 
| 
      
 51 
     | 
    
         
            +
                    'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))',
         
     | 
| 
      
 52 
     | 
    
         
            +
                    -1, -1, 5, 5
         
     | 
| 
      
 53 
     | 
    
         
            +
                  )
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryCloneTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_clone
         
     | 
| 
      
 14 
     | 
    
         
            +
                geom_a = read('POINT(0 0)')
         
     | 
| 
      
 15 
     | 
    
         
            +
                geom_b = geom_a.clone
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                assert_equal(geom_a, geom_b)
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              def test_clone_srid
         
     | 
| 
      
 21 
     | 
    
         
            +
                srid = 4326
         
     | 
| 
      
 22 
     | 
    
         
            +
                geom_a = read('POINT(0 0)')
         
     | 
| 
      
 23 
     | 
    
         
            +
                geom_a.srid = srid
         
     | 
| 
      
 24 
     | 
    
         
            +
                geom_b = geom_a.clone
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                assert_equal(geom_a, geom_b)
         
     | 
| 
      
 27 
     | 
    
         
            +
                assert_equal(srid, geom_b.srid)
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe 'Concave Hull Of Polygons Tests' do
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              it 'handles empty polygons' do
         
     | 
| 
      
 14 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:concave_hull_of_polygons)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                geom = read('POLYGON EMPTY')
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                assert(geom.concave_hull_of_polygons(0.7).eql?(read('POLYGON EMPTY')))
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              it 'handles a multipolygon' do
         
     | 
| 
      
 22 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:concave_hull_of_polygons)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                geom = read('MULTIPOLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)))')
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                assert(geom.concave_hull_of_polygons(0.7).eql?(read('MULTIPOLYGON(((0 0, 0 1, 1 1, 1 0, 0 0)))')))
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe 'Geometry Concave Hull Tests' do
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def tester(expected, geom, **options)
         
     | 
| 
      
 14 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:concave_hull)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                simple_tester(
         
     | 
| 
      
 17 
     | 
    
         
            +
                  :concave_hull,
         
     | 
| 
      
 18 
     | 
    
         
            +
                  expected,
         
     | 
| 
      
 19 
     | 
    
         
            +
                  geom,
         
     | 
| 
      
 20 
     | 
    
         
            +
                  **options
         
     | 
| 
      
 21 
     | 
    
         
            +
                )
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              it 'returns a concave hull' do
         
     | 
| 
      
 25 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 26 
     | 
    
         
            +
                  'POLYGON ((30 70, 10 90, 60 72, 90 90, 90 60, 90 10, 60 30, 10 10, 40 40, 60 50, 47 66, 40 60, 30 70))',
         
     | 
| 
      
 27 
     | 
    
         
            +
                  'MULTIPOINT ((10 90), (10 10), (90 10), (90 90), (40 40), (60 30), (30 70), (40 60), (60 50), (60 72), (47 66), (90 60))'
         
     | 
| 
      
 28 
     | 
    
         
            +
                )
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              it 'handles a concave hull by length' do
         
     | 
| 
      
 32 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 33 
     | 
    
         
            +
                  'POLYGON ((30 70, 10 90, 60 72, 90 90, 90 60, 90 10, 60 30, 10 10, 40 40, 30 70))',
         
     | 
| 
      
 34 
     | 
    
         
            +
                  'MULTIPOINT ((10 90), (10 10), (90 10), (90 90), (40 40), (60 30), (30 70), (40 60), (60 50), (60 72), (47 66), (90 60))',
         
     | 
| 
      
 35 
     | 
    
         
            +
                  length: 50
         
     | 
| 
      
 36 
     | 
    
         
            +
                )
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryConvexHullTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_convex_hull
         
     | 
| 
      
 14 
     | 
    
         
            +
                geom = read('POINT(0 0)')
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                assert_geom_eql_exact(read('POINT(0 0)'), geom.convex_hull)
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                geom = read('LINESTRING(0 0, 10 10)')
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                assert_geom_eql_exact(read('LINESTRING(0 0, 10 10)'), geom.convex_hull)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                geom = read('POLYGON((0 0, 0 10, 5 5, 10 10, 10 0, 0 0))')
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                assert_geom_eql_exact(read('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'), geom.convex_hull)
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryCoordSeqTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_coord_seq
         
     | 
| 
      
 14 
     | 
    
         
            +
                tester = lambda { |expected, g|
         
     | 
| 
      
 15 
     | 
    
         
            +
                  geom = read(g)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  cs = geom.coord_seq
         
     | 
| 
      
 17 
     | 
    
         
            +
                  expected.each_with_index do |c, i|
         
     | 
| 
      
 18 
     | 
    
         
            +
                    assert_equal(c[0], cs.get_x(i))
         
     | 
| 
      
 19 
     | 
    
         
            +
                    assert_equal(c[1], cs.get_y(i))
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                }
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                tester[[[0, 0]], 'POINT(0 0)']
         
     | 
| 
      
 24 
     | 
    
         
            +
                tester[[[0, 0], [2, 3]], 'LINESTRING (0 0, 2 3)']
         
     | 
| 
      
 25 
     | 
    
         
            +
                tester[[[0, 0], [0, 5], [5, 5], [5, 0], [0, 0]], 'LINEARRING(0 0, 0 5, 5 5, 5 0, 0 0)']
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,82 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryDelaunayTriangulationTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_delaunay_triangulation
         
     | 
| 
      
 14 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:delaunay_triangulation)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                tester = lambda { |expected, geom, *args|
         
     | 
| 
      
 17 
     | 
    
         
            +
                  geom = read(geom)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  geom_tri = geom.delaunay_triangulation(*args)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  geom_tri.normalize!
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  assert_equal(expected, write(geom_tri))
         
     | 
| 
      
 22 
     | 
    
         
            +
                }
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                # empty polygon
         
     | 
| 
      
 27 
     | 
    
         
            +
                tester['GEOMETRYCOLLECTION EMPTY', 'POLYGON EMPTY', 0]
         
     | 
| 
      
 28 
     | 
    
         
            +
                tester['MULTILINESTRING EMPTY', 'POLYGON EMPTY', 0, only_edges: true]
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                # single point
         
     | 
| 
      
 31 
     | 
    
         
            +
                tester['GEOMETRYCOLLECTION EMPTY', 'POINT (0 0)', 0]
         
     | 
| 
      
 32 
     | 
    
         
            +
                tester['MULTILINESTRING EMPTY', 'POINT (0 0)', 0, only_edges: true]
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                # three collinear points
         
     | 
| 
      
 35 
     | 
    
         
            +
                tester['GEOMETRYCOLLECTION EMPTY', 'MULTIPOINT(0 0, 5 0, 10 0)', 0]
         
     | 
| 
      
 36 
     | 
    
         
            +
                tester['MULTILINESTRING ((5 0, 10 0), (0 0, 5 0))', 'MULTIPOINT(0 0, 5 0, 10 0)', 0, only_edges: true]
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                # three points
         
     | 
| 
      
 39 
     | 
    
         
            +
                tester['GEOMETRYCOLLECTION (POLYGON ((0 0, 10 10, 5 0, 0 0)))', 'MULTIPOINT(0 0, 5 0, 10 10)', 0]
         
     | 
| 
      
 40 
     | 
    
         
            +
                tester['MULTILINESTRING ((5 0, 10 10), (0 0, 10 10), (0 0, 5 0))', 'MULTIPOINT(0 0, 5 0, 10 10)', 0, only_edges: true]
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                # polygon with a hole
         
     | 
| 
      
 43 
     | 
    
         
            +
                tester[
         
     | 
| 
      
 44 
     | 
    
         
            +
                  'GEOMETRYCOLLECTION (POLYGON ((8 2, 10 10, 8.5 1, 8 2)), POLYGON ((7 8, 10 10, 8 2, 7 8)), POLYGON ((3 8, 10 10, 7 8, 3 8)), ' \
         
     | 
| 
      
 45 
     | 
    
         
            +
                  'POLYGON ((2 2, 8 2, 8.5 1, 2 2)), POLYGON ((2 2, 7 8, 8 2, 2 2)), POLYGON ((2 2, 3 8, 7 8, 2 2)), POLYGON ((0.5 9, 10 10, 3 8, 0.5 9)), ' \
         
     | 
| 
      
 46 
     | 
    
         
            +
                  'POLYGON ((0.5 9, 3 8, 2 2, 0.5 9)), POLYGON ((0 0, 2 2, 8.5 1, 0 0)), POLYGON ((0 0, 0.5 9, 2 2, 0 0)))',
         
     | 
| 
      
 47 
     | 
    
         
            +
                  'POLYGON((0 0, 8.5 1, 10 10, 0.5 9, 0 0),(2 2, 3 8, 7 8, 8 2, 2 2))',
         
     | 
| 
      
 48 
     | 
    
         
            +
                  0
         
     | 
| 
      
 49 
     | 
    
         
            +
                ]
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                tester[
         
     | 
| 
      
 52 
     | 
    
         
            +
                  'MULTILINESTRING ((8.5 1, 10 10), (8 2, 10 10), (8 2, 8.5 1), (7 8, 10 10), (7 8, 8 2), (3 8, 10 10), (3 8, 7 8), (2 2, 8.5 1), (2 2, 8 2), (2 2, 7 8), (2 2, 3 8), (0.5 9, 10 10), (0.5 9, 3 8), (0.5 9, 2 2), (0 0, 8.5 1), (0 0, 2 2), (0 0, 0.5 9))',
         
     | 
| 
      
 53 
     | 
    
         
            +
                  'POLYGON((0 0, 8.5 1, 10 10, 0.5 9, 0 0),(2 2, 3 8, 7 8, 8 2, 2 2))',
         
     | 
| 
      
 54 
     | 
    
         
            +
                  0,
         
     | 
| 
      
 55 
     | 
    
         
            +
                  only_edges: true
         
     | 
| 
      
 56 
     | 
    
         
            +
                ]
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                # four points with a tolerance making one collapse
         
     | 
| 
      
 59 
     | 
    
         
            +
                tester['MULTILINESTRING ((10 0, 10 10), (0 0, 10 10), (0 0, 10 0))', 'MULTIPOINT(0 0, 10 0, 10 10, 11 10)', 2.0, only_edges: true]
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                # tolerance as an option
         
     | 
| 
      
 62 
     | 
    
         
            +
                tester['MULTILINESTRING ((10 0, 10 10), (0 0, 10 10), (0 0, 10 0))', 'MULTIPOINT(0 0, 10 0, 10 10, 11 10)', tolerance: 2.0, only_edges: true]
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
              def test_constrained_delaunay_triangulation
         
     | 
| 
      
 66 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:constrained_delaunay_triangulation)
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                tester = lambda { |expected, geom|
         
     | 
| 
      
 69 
     | 
    
         
            +
                  geom = read(geom)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  geom_tri = geom.constrained_delaunay_triangulation
         
     | 
| 
      
 71 
     | 
    
         
            +
                  geom_tri.normalize!
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                  assert_equal(write(read(expected).normalize), write(geom_tri))
         
     | 
| 
      
 74 
     | 
    
         
            +
                }
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                tester['GEOMETRYCOLLECTION EMPTY', 'POLYGON EMPTY']
         
     | 
| 
      
 79 
     | 
    
         
            +
                tester['GEOMETRYCOLLECTION EMPTY', 'POINT(0 0)']
         
     | 
| 
      
 80 
     | 
    
         
            +
                tester['GEOMETRYCOLLECTION (POLYGON ((10 10, 20 40, 90 10, 10 10)), POLYGON ((90 90, 20 40, 90 10, 90 90)))', 'POLYGON ((10 10, 20 40, 90 90, 90 10, 10 10))']
         
     | 
| 
      
 81 
     | 
    
         
            +
              end
         
     | 
| 
      
 82 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,95 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe 'Geometry Densify Tests' do
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def tester(expected, geom, tolerence)
         
     | 
| 
      
 14 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::Geometry.method_defined?(:densify)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                simple_tester(
         
     | 
| 
      
 17 
     | 
    
         
            +
                  :densify,
         
     | 
| 
      
 18 
     | 
    
         
            +
                  expected,
         
     | 
| 
      
 19 
     | 
    
         
            +
                  geom,
         
     | 
| 
      
 20 
     | 
    
         
            +
                  tolerence
         
     | 
| 
      
 21 
     | 
    
         
            +
                )
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              it 'can densify with tolerance greater than or equal to length of all edges' do
         
     | 
| 
      
 25 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 26 
     | 
    
         
            +
                  'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))',
         
     | 
| 
      
 27 
     | 
    
         
            +
                  'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))',
         
     | 
| 
      
 28 
     | 
    
         
            +
                  10.0
         
     | 
| 
      
 29 
     | 
    
         
            +
                )
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              it 'can densify with a tolerance that evenly subdivides all outer and inner edges' do
         
     | 
| 
      
 33 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 34 
     | 
    
         
            +
                  'POLYGON ((0 0, 5 0, 10 0, 10 5, 10 10, 5 10, 0 10, 0 5, 0 0), (1 1, 1 4, 1 7, 4 7, 7 7, 7 4, 7 1, 4 1, 1 1))',
         
     | 
| 
      
 35 
     | 
    
         
            +
                  'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (1 1, 1 7, 7 7, 7 1, 1 1))',
         
     | 
| 
      
 36 
     | 
    
         
            +
                  5.0
         
     | 
| 
      
 37 
     | 
    
         
            +
                )
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              it 'can densify a LINESTRING' do
         
     | 
| 
      
 41 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 42 
     | 
    
         
            +
                  'LINESTRING (0 0, 0 3, 0 6)',
         
     | 
| 
      
 43 
     | 
    
         
            +
                  'LINESTRING (0 0, 0 6 )',
         
     | 
| 
      
 44 
     | 
    
         
            +
                  3.0
         
     | 
| 
      
 45 
     | 
    
         
            +
                )
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              it 'can ensure that tolerance results in the right number of subdivisions' do
         
     | 
| 
      
 49 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 50 
     | 
    
         
            +
                  'LINESTRING (0 0, 0 2, 0 4, 0 6)',
         
     | 
| 
      
 51 
     | 
    
         
            +
                  'LINESTRING (0 0, 0 6 )',
         
     | 
| 
      
 52 
     | 
    
         
            +
                  2.9999999
         
     | 
| 
      
 53 
     | 
    
         
            +
                )
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              it 'can densify a LINEARRING' do
         
     | 
| 
      
 57 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 58 
     | 
    
         
            +
                  'LINEARRING (0 0, 0 3, 0 6, 3 6, 6 6, 4 4, 2 2, 0 0)',
         
     | 
| 
      
 59 
     | 
    
         
            +
                  'LINEARRING (0 0, 0 6, 6 6, 0 0)',
         
     | 
| 
      
 60 
     | 
    
         
            +
                  3.0
         
     | 
| 
      
 61 
     | 
    
         
            +
                )
         
     | 
| 
      
 62 
     | 
    
         
            +
              end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
              it 'can densify a POINT' do
         
     | 
| 
      
 65 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 66 
     | 
    
         
            +
                  'POINT (0 0)',
         
     | 
| 
      
 67 
     | 
    
         
            +
                  'POINT (0 0)',
         
     | 
| 
      
 68 
     | 
    
         
            +
                  3.0
         
     | 
| 
      
 69 
     | 
    
         
            +
                )
         
     | 
| 
      
 70 
     | 
    
         
            +
              end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
              it 'can densify a MULTIPOINT' do
         
     | 
| 
      
 73 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 74 
     | 
    
         
            +
                  'MULTIPOINT ((0 0), (10 10))',
         
     | 
| 
      
 75 
     | 
    
         
            +
                  'MULTIPOINT ((0 0), (10 10))',
         
     | 
| 
      
 76 
     | 
    
         
            +
                  3.0
         
     | 
| 
      
 77 
     | 
    
         
            +
                )
         
     | 
| 
      
 78 
     | 
    
         
            +
              end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
              it 'can densify an empty polygon' do
         
     | 
| 
      
 81 
     | 
    
         
            +
                tester(
         
     | 
| 
      
 82 
     | 
    
         
            +
                  'POLYGON EMPTY',
         
     | 
| 
      
 83 
     | 
    
         
            +
                  'POLYGON EMPTY',
         
     | 
| 
      
 84 
     | 
    
         
            +
                  3.0
         
     | 
| 
      
 85 
     | 
    
         
            +
                )
         
     | 
| 
      
 86 
     | 
    
         
            +
              end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
              it 'densify with an invalid tolerances should fail' do
         
     | 
| 
      
 89 
     | 
    
         
            +
                geom = read('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                assert_raises(Geos::GEOSException, 'IllegalArgumentException: Tolerance must be positive') do
         
     | 
| 
      
 92 
     | 
    
         
            +
                  geom.densify(-1.0)
         
     | 
| 
      
 93 
     | 
    
         
            +
                end
         
     | 
| 
      
 94 
     | 
    
         
            +
              end
         
     | 
| 
      
 95 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,108 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'test_helper'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            class GeometryDifferenceTests < Minitest::Test
         
     | 
| 
      
 6 
     | 
    
         
            +
              include TestHelper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 9 
     | 
    
         
            +
                super
         
     | 
| 
      
 10 
     | 
    
         
            +
                writer.trim = true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def test_difference
         
     | 
| 
      
 14 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 15 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 16 
     | 
    
         
            +
                  EMPTY_GEOMETRY,
         
     | 
| 
      
 17 
     | 
    
         
            +
                  'POINT(0 0)',
         
     | 
| 
      
 18 
     | 
    
         
            +
                  'POINT(0 0)'
         
     | 
| 
      
 19 
     | 
    
         
            +
                )
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 22 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 23 
     | 
    
         
            +
                  'POINT (0 0)',
         
     | 
| 
      
 24 
     | 
    
         
            +
                  'POINT(0 0)',
         
     | 
| 
      
 25 
     | 
    
         
            +
                  'POINT(1 0)'
         
     | 
| 
      
 26 
     | 
    
         
            +
                )
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 29 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 30 
     | 
    
         
            +
                  'LINESTRING (0 0, 10 0)',
         
     | 
| 
      
 31 
     | 
    
         
            +
                  'LINESTRING(0 0, 10 0)',
         
     | 
| 
      
 32 
     | 
    
         
            +
                  'POINT(5 0)'
         
     | 
| 
      
 33 
     | 
    
         
            +
                )
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 36 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 37 
     | 
    
         
            +
                  EMPTY_GEOMETRY,
         
     | 
| 
      
 38 
     | 
    
         
            +
                  'POINT(5 0)',
         
     | 
| 
      
 39 
     | 
    
         
            +
                  'LINESTRING(0 0, 10 0)'
         
     | 
| 
      
 40 
     | 
    
         
            +
                )
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 43 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 44 
     | 
    
         
            +
                  'POINT (5 0)',
         
     | 
| 
      
 45 
     | 
    
         
            +
                  'POINT(5 0)',
         
     | 
| 
      
 46 
     | 
    
         
            +
                  'LINESTRING(0 1, 10 1)'
         
     | 
| 
      
 47 
     | 
    
         
            +
                )
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 50 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 51 
     | 
    
         
            +
                  'MULTILINESTRING ((0 0, 5 0), (5 0, 10 0))',
         
     | 
| 
      
 52 
     | 
    
         
            +
                  'LINESTRING(0 0, 10 0)',
         
     | 
| 
      
 53 
     | 
    
         
            +
                  'LINESTRING(5 -10, 5 10)'
         
     | 
| 
      
 54 
     | 
    
         
            +
                )
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 57 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 58 
     | 
    
         
            +
                  'LINESTRING (0 0, 5 0)',
         
     | 
| 
      
 59 
     | 
    
         
            +
                  'LINESTRING(0 0, 10 0)',
         
     | 
| 
      
 60 
     | 
    
         
            +
                  'LINESTRING(5 0, 20 0)'
         
     | 
| 
      
 61 
     | 
    
         
            +
                )
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 64 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 65 
     | 
    
         
            +
                  if Geos::GEOS_NICE_VERSION > '030900'
         
     | 
| 
      
 66 
     | 
    
         
            +
                    'POLYGON ((0 10, 5 10, 10 10, 10 0, 5 0, 0 0, 0 10))'
         
     | 
| 
      
 67 
     | 
    
         
            +
                  else
         
     | 
| 
      
 68 
     | 
    
         
            +
                    'POLYGON ((0 0, 0 10, 5 10, 10 10, 10 0, 5 0, 0 0))'
         
     | 
| 
      
 69 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 70 
     | 
    
         
            +
                  'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
         
     | 
| 
      
 71 
     | 
    
         
            +
                  'LINESTRING(5 -10, 5 10)'
         
     | 
| 
      
 72 
     | 
    
         
            +
                )
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 75 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 76 
     | 
    
         
            +
                  if Geos::GEOS_NICE_VERSION > '030900'
         
     | 
| 
      
 77 
     | 
    
         
            +
                    'POLYGON ((0 10, 10 10, 10 0, 0 0, 0 10))'
         
     | 
| 
      
 78 
     | 
    
         
            +
                  else
         
     | 
| 
      
 79 
     | 
    
         
            +
                    'POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0))'
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 81 
     | 
    
         
            +
                  'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
         
     | 
| 
      
 82 
     | 
    
         
            +
                  'LINESTRING(10 0, 20 0)'
         
     | 
| 
      
 83 
     | 
    
         
            +
                )
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 86 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 87 
     | 
    
         
            +
                  if Geos::GEOS_NICE_VERSION > '030900'
         
     | 
| 
      
 88 
     | 
    
         
            +
                    'POLYGON ((0 10, 10 10, 10 5, 5 5, 5 0, 0 0, 0 10))'
         
     | 
| 
      
 89 
     | 
    
         
            +
                  else
         
     | 
| 
      
 90 
     | 
    
         
            +
                    'POLYGON ((0 0, 0 10, 10 10, 10 5, 5 5, 5 0, 0 0))'
         
     | 
| 
      
 91 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 92 
     | 
    
         
            +
                  'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))',
         
     | 
| 
      
 93 
     | 
    
         
            +
                  'POLYGON((5 -5, 5 5, 15 5, 15 -5, 5 -5))'
         
     | 
| 
      
 94 
     | 
    
         
            +
                )
         
     | 
| 
      
 95 
     | 
    
         
            +
              end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
              def test_difference_with_precision
         
     | 
| 
      
 98 
     | 
    
         
            +
                skip unless ENV['FORCE_TESTS'] || Geos::FFIGeos.respond_to?(:GEOSDifferencePrec_r)
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                comparison_tester(
         
     | 
| 
      
 101 
     | 
    
         
            +
                  :difference,
         
     | 
| 
      
 102 
     | 
    
         
            +
                  'MULTILINESTRING ((2 8, 4 8), (6 8, 10 8))',
         
     | 
| 
      
 103 
     | 
    
         
            +
                  'LINESTRING (2 8, 10 8)',
         
     | 
| 
      
 104 
     | 
    
         
            +
                  'LINESTRING (3.9 8.1, 6.1 7.9)',
         
     | 
| 
      
 105 
     | 
    
         
            +
                  precision: 2
         
     | 
| 
      
 106 
     | 
    
         
            +
                )
         
     | 
| 
      
 107 
     | 
    
         
            +
              end
         
     | 
| 
      
 108 
     | 
    
         
            +
            end
         
     |