ffi-geos 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +2 -2
- data/.rbenv-vars +1 -0
- data/.rubocop.yml +538 -92
- data/.rubocop_todo.yml +28 -18
- data/ffi-geos.gemspec +2 -2
- data/lib/ffi-geos/coordinate_sequence.rb +2 -1
- data/lib/ffi-geos/geometry.rb +95 -1
- data/lib/ffi-geos/point.rb +9 -0
- data/lib/ffi-geos/version.rb +1 -1
- data/lib/ffi-geos.rb +78 -3
- data/test/coordinate_sequence_tests.rb +22 -4
- data/test/geojson_reader_tests.rb +6 -2
- data/test/geometry/area_tests.rb +18 -0
- data/test/geometry/boundary_tests.rb +36 -0
- data/test/geometry/buffer_tests.rb +116 -0
- data/test/geometry/build_area_tests.rb +20 -0
- data/test/geometry/centroid_tests.rb +37 -0
- data/test/geometry/clip_by_rect_tests.rb +56 -0
- data/test/geometry/clone_tests.rb +29 -0
- data/test/geometry/concave_hull_of_polygons_tests.rb +28 -0
- data/test/geometry/concave_hull_tests.rb +38 -0
- data/test/geometry/convex_hull_tests.rb +26 -0
- data/test/geometry/coord_seq_tests.rb +27 -0
- data/test/geometry/delaunay_triangulation_tests.rb +82 -0
- data/test/geometry/densify_tests.rb +95 -0
- data/test/geometry/difference_tests.rb +108 -0
- data/test/geometry/dimensions_tests.rb +46 -0
- data/test/geometry/distance_tests.rb +29 -0
- data/test/geometry/dump_points_tests.rb +60 -0
- data/test/geometry/dup_tests.rb +29 -0
- data/test/geometry/empty_tests.rb +23 -0
- data/test/geometry/envelope_tests.rb +26 -0
- data/test/geometry/equal_identical_tests.rb +78 -0
- data/test/geometry/equal_tests.rb +62 -0
- data/test/geometry/exterior_ring_tests.rb +27 -0
- data/test/geometry/extract_unique_points_tests.rb +41 -0
- data/test/geometry/frecet_distance_tests.rb +24 -0
- data/test/geometry/get_geometry_n_tests.rb +21 -0
- data/test/geometry/hausdorff_distance_tests.rb +46 -0
- data/test/geometry/hilbert_code_tests.rb +45 -0
- data/test/geometry/interior_ring_n_tests.rb +64 -0
- data/test/geometry/interior_rings_tests.rb +36 -0
- data/test/geometry/interpolate_tests.rb +49 -0
- data/test/geometry/intersection_tests.rb +49 -0
- data/test/geometry/largest_empty_circle_tests.rb +26 -0
- data/test/geometry/length_tests.rb +18 -0
- data/test/geometry/line_merge_directed_tests.rb +28 -0
- data/test/geometry/line_merge_tests.rb +25 -0
- data/test/geometry/line_string_enumerator_tests.rb +20 -0
- data/test/geometry/line_substring_tests.rb +76 -0
- data/test/geometry/make_valid_tests.rb +27 -0
- data/test/geometry/maximum_inscribed_circle_tests.rb +21 -0
- data/test/geometry/minimum_bounding_circle_tests.rb +23 -0
- data/test/geometry/minimum_clearance_tests.rb +58 -0
- data/test/geometry/minimum_rotated_rectangle_tests.rb +28 -0
- data/test/geometry/minimum_width_tests.rb +26 -0
- data/test/geometry/misc_tests.rb +24 -0
- data/test/geometry/nearest_points_tests.rb +46 -0
- data/test/geometry/node_tests.rb +22 -0
- data/test/geometry/normalize_tests.rb +34 -0
- data/test/geometry/num_coordinates_tests.rb +39 -0
- data/test/geometry/num_goemetries_tests.rb +35 -0
- data/test/geometry/num_interior_rings_tests.rb +28 -0
- data/test/geometry/orient_polygons_tests.rb +101 -0
- data/test/geometry/point_on_surface_tests.rb +37 -0
- data/test/geometry/polygon_hull_simplify_tests.rb +55 -0
- data/test/geometry/polygonize_tests.rb +173 -0
- data/test/geometry/precision_tests.rb +42 -0
- data/test/geometry/project_tests.rb +56 -0
- data/test/geometry/relate_tests.rb +73 -0
- data/test/geometry/relationships_tests.rb +138 -0
- data/test/geometry/reverse_tests.rb +44 -0
- data/test/geometry/ring_tests.rb +18 -0
- data/test/geometry/shared_path_tests.rb +31 -0
- data/test/geometry/simple_tests.rb +18 -0
- data/test/geometry/simplify_tests.rb +21 -0
- data/test/geometry/snap_tests.rb +20 -0
- data/test/geometry/srid_copy_policy_tests.rb +94 -0
- data/test/geometry/start_and_end_point_tests.rb +24 -0
- data/test/geometry/sym_difference_tests.rb +114 -0
- data/test/geometry/topology_preserve_simplify_tests.rb +21 -0
- data/test/geometry/union_tests.rb +216 -0
- data/test/geometry/valid_tests.rb +56 -0
- data/test/geometry/voronoi_diagram_tests.rb +62 -0
- data/test/geometry_collection_tests.rb +14 -2
- data/test/interrupt_tests.rb +1 -1
- data/test/line_string_tests.rb +24 -3
- data/test/misc_tests.rb +1 -1
- data/test/point/has_m_tests.rb +43 -0
- data/test/point/x_y_z_m_tests.rb +51 -0
- data/test/point_tests.rb +25 -3
- data/test/polygon_tests.rb +14 -1
- data/test/prepared_geometry_tests.rb +6 -5
- data/test/strtree_tests.rb +11 -18
- data/test/test_helper.rb +2 -0
- data/test/tools_tests.rb +7 -0
- data/test/utils_tests.rb +14 -3
- data/test/wkb_reader_tests.rb +1 -0
- data/test/wkb_writer_tests.rb +26 -5
- data/test/wkt_reader_tests.rb +2 -0
- data/test/wkt_writer_tests.rb +20 -2
- metadata +154 -7
- data/test/geometry_tests.rb +0 -2114
data/.rubocop_todo.yml
CHANGED
@@ -1,24 +1,27 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 10000`
|
3
|
-
# on
|
3
|
+
# on 2024-04-19 02:14:33 UTC using RuboCop version 1.62.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
9
|
# Offense count: 1
|
10
|
-
|
10
|
+
# This cop supports safe autocorrection (--autocorrect).
|
11
|
+
# Configuration parameters: Severity, Include.
|
12
|
+
# Include: **/*.gemspec
|
13
|
+
Gemspec/DeprecatedAttributeAssignment:
|
11
14
|
Exclude:
|
12
|
-
- '
|
15
|
+
- 'ffi-geos.gemspec'
|
13
16
|
|
14
17
|
# Offense count: 6
|
15
|
-
# Configuration parameters:
|
18
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max.
|
16
19
|
Metrics/AbcSize:
|
17
20
|
Exclude:
|
18
21
|
- 'lib/ffi-geos/coordinate_sequence.rb'
|
19
22
|
- 'lib/ffi-geos/line_string.rb'
|
20
23
|
- 'lib/ffi-geos/utils.rb'
|
21
|
-
- 'test/
|
24
|
+
- 'test/geometry/polygonize_tests.rb'
|
22
25
|
|
23
26
|
# Offense count: 2
|
24
27
|
# Configuration parameters: CountComments, Max, CountAsOne.
|
@@ -28,7 +31,7 @@ Metrics/ClassLength:
|
|
28
31
|
- 'lib/ffi-geos/geometry.rb'
|
29
32
|
|
30
33
|
# Offense count: 3
|
31
|
-
# Configuration parameters:
|
34
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
|
32
35
|
Metrics/CyclomaticComplexity:
|
33
36
|
Exclude:
|
34
37
|
- 'lib/ffi-geos/coordinate_sequence.rb'
|
@@ -46,13 +49,22 @@ Metrics/ParameterLists:
|
|
46
49
|
Exclude:
|
47
50
|
- 'lib/ffi-geos/utils.rb'
|
48
51
|
|
49
|
-
# Offense count:
|
50
|
-
# Configuration parameters:
|
52
|
+
# Offense count: 7
|
53
|
+
# Configuration parameters: AllowedMethods, AllowedPatterns, Max.
|
51
54
|
Metrics/PerceivedComplexity:
|
52
55
|
Exclude:
|
53
56
|
- 'lib/ffi-geos/coordinate_sequence.rb'
|
54
57
|
- 'lib/ffi-geos/tools.rb'
|
55
|
-
- 'test/
|
58
|
+
- 'test/geometry/sym_difference_tests.rb'
|
59
|
+
- 'test/geometry/union_tests.rb'
|
60
|
+
- 'test/geometry/voronoi_diagram_tests.rb'
|
61
|
+
- 'test/line_string_tests.rb'
|
62
|
+
|
63
|
+
# Offense count: 5
|
64
|
+
Minitest/AssertRaisesCompoundBody:
|
65
|
+
Exclude:
|
66
|
+
- 'test/geometry/polygonize_tests.rb'
|
67
|
+
- 'test/utils_tests.rb'
|
56
68
|
|
57
69
|
# Offense count: 9
|
58
70
|
Naming/AccessorMethodName:
|
@@ -70,7 +82,7 @@ Naming/FileName:
|
|
70
82
|
Exclude:
|
71
83
|
- 'lib/ffi-geos.rb'
|
72
84
|
|
73
|
-
# Offense count:
|
85
|
+
# Offense count: 1
|
74
86
|
# Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros.
|
75
87
|
# NamePrefix: is_, has_, have_
|
76
88
|
# ForbiddenPrefixes: is_, has_, have_
|
@@ -78,17 +90,15 @@ Naming/FileName:
|
|
78
90
|
# MethodDefinitionMacros: define_method, define_singleton_method
|
79
91
|
Naming/PredicateName:
|
80
92
|
Exclude:
|
81
|
-
- 'lib/ffi-geos/coordinate_sequence.rb'
|
82
93
|
- 'lib/ffi-geos/geometry.rb'
|
83
94
|
|
84
|
-
# Offense count:
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
|
95
|
+
# Offense count: 1
|
96
|
+
# This cop supports unsafe autocorrection (--autocorrect-all).
|
97
|
+
# Configuration parameters: AllowedReceivers.
|
98
|
+
# AllowedReceivers: Thread.current
|
99
|
+
Style/HashEachMethods:
|
89
100
|
Exclude:
|
90
|
-
- 'lib/ffi-geos.rb'
|
91
|
-
- 'lib/ffi-geos/geometry.rb'
|
101
|
+
- 'lib/ffi-geos/strtree.rb'
|
92
102
|
|
93
103
|
# Offense count: 4
|
94
104
|
# Configuration parameters: AllowedMethods.
|
data/ffi-geos.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Geos::VERSION
|
8
8
|
|
9
9
|
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
10
|
-
s.required_ruby_version = '>= 2.
|
10
|
+
s.required_ruby_version = '>= 2.7'
|
11
11
|
|
12
12
|
s.authors = ['J Smith']
|
13
13
|
s.description = 'An ffi wrapper for GEOS, a C++ port of the Java Topology Suite (JTS).'
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
21
21
|
s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
22
22
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
23
|
-
s.homepage = '
|
23
|
+
s.homepage = 'https://github.com/dark-panda/ffi-geos'
|
24
24
|
s.require_paths = ['lib']
|
25
25
|
|
26
26
|
s.add_dependency('ffi', ['>= 1.0.0'])
|
data/lib/ffi-geos/geometry.rb
CHANGED
@@ -59,6 +59,18 @@ module Geos
|
|
59
59
|
end
|
60
60
|
alias normalize normalize!
|
61
61
|
|
62
|
+
if FFIGeos.respond_to?(:GEOSOrientPolygons_r)
|
63
|
+
def orient_polygons!(exterior_cw = false)
|
64
|
+
raise Geos::GEOSException, self.class if FFIGeos.GEOSOrientPolygons_r(Geos.current_handle_pointer, ptr, bool_to_int(exterior_cw)) == -1
|
65
|
+
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
def orient_polygons(exterior_cw = false)
|
70
|
+
dup.orient_polygons!(exterior_cw)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
62
74
|
def srid
|
63
75
|
FFIGeos.GEOSGetSRID_r(Geos.current_handle_pointer, ptr)
|
64
76
|
end
|
@@ -140,10 +152,43 @@ module Geos
|
|
140
152
|
end
|
141
153
|
end
|
142
154
|
|
155
|
+
if FFIGeos.respond_to?(:GEOSDensify_r)
|
156
|
+
def densify(tolerance = 0.0)
|
157
|
+
cast_geometry_ptr(FFIGeos.GEOSDensify_r(Geos.current_handle_pointer, ptr, tolerance), srid_copy: srid)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
143
161
|
def convex_hull
|
144
162
|
cast_geometry_ptr(FFIGeos.GEOSConvexHull_r(Geos.current_handle_pointer, ptr), srid_copy: srid)
|
145
163
|
end
|
146
164
|
|
165
|
+
if FFIGeos.respond_to?(:GEOSConcaveHull_r) && FFIGeos.respond_to?(:GEOSConcaveHullByLength_r)
|
166
|
+
def concave_hull(ratio: 0.0, allow_holes: false, length: nil)
|
167
|
+
cast_geometry_ptr(
|
168
|
+
case length
|
169
|
+
when Numeric
|
170
|
+
FFIGeos.GEOSConcaveHullByLength_r(Geos.current_handle_pointer, ptr, length, bool_to_int(allow_holes))
|
171
|
+
else
|
172
|
+
FFIGeos.GEOSConcaveHull_r(Geos.current_handle_pointer, ptr, ratio, bool_to_int(allow_holes))
|
173
|
+
end,
|
174
|
+
srid_copy: srid
|
175
|
+
)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
if FFIGeos.respond_to?(:GEOSPolygonHullSimplify_r) && FFIGeos.respond_to?(:GEOSPolygonHullSimplifyMode_r)
|
180
|
+
def polygon_hull_simplify(parameter, outer: false, mode: :vertex_ratio)
|
181
|
+
check_enum_value(Geos::PolygonHullSimplifyModes, mode)
|
182
|
+
|
183
|
+
case mode
|
184
|
+
when :vertex_ratio
|
185
|
+
cast_geometry_ptr(FFIGeos.GEOSPolygonHullSimplify_r(Geos.current_handle_pointer, ptr, bool_to_int(outer), parameter), srid_copy: srid)
|
186
|
+
when :area_ratio
|
187
|
+
cast_geometry_ptr(FFIGeos.GEOSPolygonHullSimplifyMode_r(Geos.current_handle_pointer, ptr, bool_to_int(outer), 2, parameter), srid_copy: srid)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
147
192
|
def difference(geom, precision: nil)
|
148
193
|
check_geometry(geom)
|
149
194
|
|
@@ -199,6 +244,13 @@ module Geos
|
|
199
244
|
end
|
200
245
|
end
|
201
246
|
|
247
|
+
if FFIGeos.respond_to?(:GEOSDisjointSubsetUnion_r)
|
248
|
+
# Added in GEOS 3.12+
|
249
|
+
def disjoint_subset_union
|
250
|
+
cast_geometry_ptr(FFIGeos.GEOSDisjointSubsetUnion_r(Geos.current_handle_pointer, ptr), srid_copy: srid)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
202
254
|
if FFIGeos.respond_to?(:GEOSUnaryUnion_r)
|
203
255
|
# Available in GEOS 3.3+
|
204
256
|
def unary_union(precision = nil)
|
@@ -235,6 +287,15 @@ module Geos
|
|
235
287
|
end
|
236
288
|
alias center centroid
|
237
289
|
|
290
|
+
if FFIGeos.respond_to?(:GEOSHilbertCode_r)
|
291
|
+
def hilbert_code(extent, level)
|
292
|
+
check_geometry(extent)
|
293
|
+
code_ptr = FFI::MemoryPointer.new(:uint)
|
294
|
+
FFIGeos.GEOSHilbertCode_r(Geos.current_handle_pointer, ptr, extent.ptr, level, code_ptr)
|
295
|
+
code_ptr.read_uint
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
238
299
|
if FFIGeos.respond_to?(:GEOSMinimumBoundingCircle_r)
|
239
300
|
# Added in GEOS 3.8+. Does not yet support the radius or center
|
240
301
|
# arguments.
|
@@ -273,6 +334,19 @@ module Geos
|
|
273
334
|
cast_geometry_ptr(FFIGeos.GEOSLineMerge_r(Geos.current_handle_pointer, ptr), srid_copy: srid)
|
274
335
|
end
|
275
336
|
|
337
|
+
if FFIGeos.respond_to?(:GEOSLineMergeDirected_r)
|
338
|
+
def line_merge_directed
|
339
|
+
cast_geometry_ptr(FFIGeos.GEOSLineMergeDirected_r(Geos.current_handle_pointer, ptr), srid_copy: srid)
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
if FFIGeos.respond_to?(:GEOSLineSubstring_r)
|
344
|
+
# Added in GEOS 3.12+
|
345
|
+
def line_substring(start_fraction, end_fraction)
|
346
|
+
cast_geometry_ptr(FFIGeos.GEOSLineSubstring_r(Geos.current_handle_pointer, ptr, start_fraction, end_fraction), srid_copy: srid)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
276
350
|
def simplify(tolerance)
|
277
351
|
cast_geometry_ptr(FFIGeos.GEOSSimplify_r(Geos.current_handle_pointer, ptr, tolerance), srid_copy: srid)
|
278
352
|
end
|
@@ -384,6 +458,14 @@ module Geos
|
|
384
458
|
alias equals_exact? eql_exact?
|
385
459
|
alias exactly_equals? eql_exact?
|
386
460
|
|
461
|
+
if FFIGeos.respond_to?(:GEOSEqualsIdentical_r)
|
462
|
+
def eql_identical?(other)
|
463
|
+
check_geometry(other)
|
464
|
+
bool_result(FFIGeos.GEOSEqualsIdentical_r(Geos.current_handle_pointer, ptr, other.ptr))
|
465
|
+
end
|
466
|
+
alias equals_identical? eql_identical?
|
467
|
+
end
|
468
|
+
|
387
469
|
def eql_almost?(other, decimal = 6)
|
388
470
|
check_geometry(other)
|
389
471
|
bool_result(FFIGeos.GEOSEqualsExact_r(Geos.current_handle_pointer, ptr, other.ptr, 0.5 * (10 ** -decimal)))
|
@@ -439,6 +521,12 @@ module Geos
|
|
439
521
|
bool_result(FFIGeos.GEOSHasZ_r(Geos.current_handle_pointer, ptr))
|
440
522
|
end
|
441
523
|
|
524
|
+
if FFIGeos.respond_to?(:GEOSHasM_r)
|
525
|
+
def has_m?
|
526
|
+
bool_result(FFIGeos.GEOSHasM_r(Geos.current_handle_pointer, ptr))
|
527
|
+
end
|
528
|
+
end
|
529
|
+
|
442
530
|
# GEOS versions prior to 3.3.0 didn't handle exceptions and can crash on
|
443
531
|
# bad input.
|
444
532
|
if FFIGeos.respond_to?(:GEOSProject_r) && Geos::GEOS_NICE_VERSION >= '030300'
|
@@ -533,7 +621,7 @@ module Geos
|
|
533
621
|
check_geometry(geom)
|
534
622
|
nearest_points_ptr = FFIGeos.GEOSNearestPoints_r(Geos.current_handle_pointer, ptr, geom.ptr)
|
535
623
|
|
536
|
-
|
624
|
+
CoordinateSequence.new(nearest_points_ptr) unless nearest_points_ptr.null?
|
537
625
|
end
|
538
626
|
end
|
539
627
|
|
@@ -705,6 +793,12 @@ module Geos
|
|
705
793
|
end
|
706
794
|
end
|
707
795
|
|
796
|
+
if FFIGeos.respond_to?(:GEOSConcaveHullOfPolygons_r)
|
797
|
+
def concave_hull_of_polygons(length_ratio, tight: false, allow_holes: false)
|
798
|
+
cast_geometry_ptr(FFIGeos.GEOSConcaveHullOfPolygons_r(Geos.current_handle_pointer, ptr, length_ratio, bool_to_int(tight), bool_to_int(allow_holes)), srid_copy: srid)
|
799
|
+
end
|
800
|
+
end
|
801
|
+
|
708
802
|
if FFIGeos.respond_to?(:GEOSMinimumRotatedRectangle_r)
|
709
803
|
def minimum_rotated_rectangle
|
710
804
|
cast_geometry_ptr(FFIGeos.GEOSMinimumRotatedRectangle_r(Geos.current_handle_pointer, ptr))
|
data/lib/ffi-geos/point.rb
CHANGED
@@ -41,6 +41,15 @@ module Geos
|
|
41
41
|
end
|
42
42
|
alias z get_z
|
43
43
|
|
44
|
+
if FFIGeos.respond_to?(:GEOSGeomGetM_r)
|
45
|
+
def get_m
|
46
|
+
double_ptr = FFI::MemoryPointer.new(:double)
|
47
|
+
FFIGeos.GEOSGeomGetM_r(Geos.current_handle_pointer, ptr, double_ptr)
|
48
|
+
double_ptr.read_double
|
49
|
+
end
|
50
|
+
alias m get_m
|
51
|
+
end
|
52
|
+
|
44
53
|
def area
|
45
54
|
0
|
46
55
|
end
|
data/lib/ffi-geos/version.rb
CHANGED
data/lib/ffi-geos.rb
CHANGED
@@ -54,7 +54,7 @@ module Geos
|
|
54
54
|
|
55
55
|
module FFIGeos
|
56
56
|
def self.search_paths
|
57
|
-
@search_paths ||=
|
57
|
+
@search_paths ||=
|
58
58
|
if ENV['GEOS_LIBRARY_PATH']
|
59
59
|
[ENV['GEOS_LIBRARY_PATH']]
|
60
60
|
elsif FFI::Platform::IS_WINDOWS
|
@@ -81,7 +81,7 @@ module Geos
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def self.geos_library_path
|
84
|
-
@geos_library_path ||=
|
84
|
+
@geos_library_path ||=
|
85
85
|
# On MingW the libraries have version numbers
|
86
86
|
find_lib('{lib,}geos_c{,-?}')
|
87
87
|
end
|
@@ -153,6 +153,11 @@ module Geos
|
|
153
153
|
:keep_collapsed, 1 << 1
|
154
154
|
])
|
155
155
|
|
156
|
+
Geos::PolygonHullSimplifyModes = enum(:polygon_hull_simplify_mode, [
|
157
|
+
:vertex_ratio, 1,
|
158
|
+
:area_ratio, 2
|
159
|
+
])
|
160
|
+
|
156
161
|
FFI_LAYOUT = {
|
157
162
|
#### Utility functions ####
|
158
163
|
|
@@ -439,6 +444,11 @@ module Geos
|
|
439
444
|
:pointer, :pointer, :pointer, :double, :int, :buffer_cap_style, :buffer_join_style, :double
|
440
445
|
],
|
441
446
|
|
447
|
+
GEOSDensify_r: [
|
448
|
+
# *geom, *handle, *geom, tolerence
|
449
|
+
:pointer, :pointer, :pointer, :double
|
450
|
+
],
|
451
|
+
|
442
452
|
# Deprecated in GEOS 3.3.0.
|
443
453
|
GEOSSingleSidedBuffer_r: [
|
444
454
|
# *geom, *handle, *geom, width, quad_segs, buffer_join_style, mitre_limit, is_left
|
@@ -455,6 +465,26 @@ module Geos
|
|
455
465
|
:pointer, :pointer, :pointer
|
456
466
|
],
|
457
467
|
|
468
|
+
GEOSConcaveHull_r: [
|
469
|
+
# *geom, *handle, *geom, ratio, allow_holes
|
470
|
+
:pointer, :pointer, :pointer, :double, :uint
|
471
|
+
],
|
472
|
+
|
473
|
+
GEOSConcaveHullByLength_r: [
|
474
|
+
# *geom, *handle, *geom, length, allow_holes
|
475
|
+
:pointer, :pointer, :pointer, :double, :uint
|
476
|
+
],
|
477
|
+
|
478
|
+
GEOSPolygonHullSimplify_r: [
|
479
|
+
# *geom, *handle, *geom, is_outer, vertex_num_fraction
|
480
|
+
:pointer, :pointer, :pointer, :uint, :double
|
481
|
+
],
|
482
|
+
|
483
|
+
GEOSPolygonHullSimplifyMode_r: [
|
484
|
+
# *geom, *handle, *geom, is_outer, parameter_mode, parameter
|
485
|
+
:pointer, :pointer, :pointer, :uint, :uint, :double
|
486
|
+
],
|
487
|
+
|
458
488
|
GEOSDifference_r: [
|
459
489
|
# *geom, *handle, *geom_a, *geom_b
|
460
490
|
:pointer, :pointer, :pointer, :pointer
|
@@ -495,6 +525,11 @@ module Geos
|
|
495
525
|
:pointer, :pointer, :pointer
|
496
526
|
],
|
497
527
|
|
528
|
+
GEOSDisjointSubsetUnion_r: [
|
529
|
+
# *geom, *handle, *geom
|
530
|
+
:pointer, :pointer, :pointer
|
531
|
+
],
|
532
|
+
|
498
533
|
GEOSUnaryUnion_r: [
|
499
534
|
# *geom, *handle, *geom
|
500
535
|
:pointer, :pointer, :pointer
|
@@ -531,6 +566,11 @@ module Geos
|
|
531
566
|
:pointer, :pointer, :pointer
|
532
567
|
],
|
533
568
|
|
569
|
+
GEOSHilbertCode_r: [
|
570
|
+
# int, *handler, *geom, *extent, level, *code
|
571
|
+
:int, :pointer, :pointer, :pointer, :uint, :pointer
|
572
|
+
],
|
573
|
+
|
534
574
|
GEOSMinimumBoundingCircle_r: [
|
535
575
|
# *geom, *handle, *geom, *double radius, **geom center
|
536
576
|
:pointer, :pointer, :pointer, :pointer, :pointer
|
@@ -546,6 +586,16 @@ module Geos
|
|
546
586
|
:pointer, :pointer, :pointer
|
547
587
|
],
|
548
588
|
|
589
|
+
GEOSLineMergeDirected_r: [
|
590
|
+
# *geom, *handle, *geom
|
591
|
+
:pointer, :pointer, :pointer
|
592
|
+
],
|
593
|
+
|
594
|
+
GEOSLineSubstring_r: [
|
595
|
+
# *geom, *handle, *geom, start_fraction, end_fraction
|
596
|
+
:pointer, :pointer, :pointer, :double, :double
|
597
|
+
],
|
598
|
+
|
549
599
|
GEOSGeom_getXMin_r: [
|
550
600
|
# 0 on exception, *handle, (double *) value
|
551
601
|
:int, :pointer, :pointer, :pointer
|
@@ -681,6 +731,11 @@ module Geos
|
|
681
731
|
:char, :pointer, :pointer, :pointer, :double
|
682
732
|
],
|
683
733
|
|
734
|
+
GEOSEqualsIdentical_r: [
|
735
|
+
# (2 on exception, 1 on true, 2 on false), *handle, *geom_a, *geom_b
|
736
|
+
:char, :pointer, :pointer, :pointer
|
737
|
+
],
|
738
|
+
|
684
739
|
GEOSisEmpty_r: [
|
685
740
|
# (2 on exception, 1 on true, 2 on false), *handle, *geom
|
686
741
|
:char, :pointer, :pointer
|
@@ -716,6 +771,11 @@ module Geos
|
|
716
771
|
:char, :pointer, :pointer
|
717
772
|
],
|
718
773
|
|
774
|
+
GEOSHasM_r: [
|
775
|
+
# (2 on exception, 1 on true, 2 on false), *handle, *geom
|
776
|
+
:char, :pointer, :pointer
|
777
|
+
],
|
778
|
+
|
719
779
|
GEOSisClosed_r: [
|
720
780
|
# (2 on exception, 1 on true, 2 on false), *handle, *geom
|
721
781
|
:char, :pointer, :pointer
|
@@ -776,6 +836,11 @@ module Geos
|
|
776
836
|
:int, :pointer, :pointer
|
777
837
|
],
|
778
838
|
|
839
|
+
GEOSOrientPolygons_r: [
|
840
|
+
# -1 on exception, *handle, *geom, exterior_cw
|
841
|
+
:int, :pointer, :pointer, :int
|
842
|
+
],
|
843
|
+
|
779
844
|
GEOSGetInteriorRingN_r: [
|
780
845
|
# *geom, *handle, *geom, n
|
781
846
|
:pointer, :pointer, :pointer, :int
|
@@ -806,6 +871,11 @@ module Geos
|
|
806
871
|
:int, :pointer, :pointer, :pointer
|
807
872
|
],
|
808
873
|
|
874
|
+
GEOSGeomGetM_r: [
|
875
|
+
# -1 on exception, *handle, *geom, *point
|
876
|
+
:int, :pointer, :pointer, :pointer
|
877
|
+
],
|
878
|
+
|
809
879
|
GEOSGeomGetPointN_r: [
|
810
880
|
# *point, *handle, *geom, n
|
811
881
|
:pointer, :pointer, :pointer, :int
|
@@ -831,6 +901,11 @@ module Geos
|
|
831
901
|
:double, :pointer, :pointer
|
832
902
|
],
|
833
903
|
|
904
|
+
GEOSConcaveHullOfPolygons_r: [
|
905
|
+
# *geom, *handle, *geom, length_ratio, tight, allow_holes
|
906
|
+
:pointer, :pointer, :pointer, :double, :uint, :uint
|
907
|
+
],
|
908
|
+
|
834
909
|
GEOSMinimumRotatedRectangle_r: [
|
835
910
|
# *geom, *handle, *geom
|
836
911
|
:pointer, :pointer, :pointer
|
@@ -1330,7 +1405,7 @@ module Geos
|
|
1330
1405
|
end
|
1331
1406
|
|
1332
1407
|
def default_error_handler(*args)
|
1333
|
-
raise Geos::GEOSException, args[0]
|
1408
|
+
raise Geos::GEOSException, sprintf(args[0], *args[1])
|
1334
1409
|
end
|
1335
1410
|
end
|
1336
1411
|
|
@@ -12,16 +12,19 @@ class CoordinateSequenceTests < Minitest::Test
|
|
12
12
|
|
13
13
|
def test_set_and_get_x
|
14
14
|
@cs.set_x(0, 10.01)
|
15
|
+
|
15
16
|
assert_in_delta(10.01, @cs.get_x(0), TOLERANCE)
|
16
17
|
end
|
17
18
|
|
18
19
|
def test_set_and_get_y
|
19
20
|
@cs.set_y(0, 20.02)
|
21
|
+
|
20
22
|
assert_in_delta(20.02, @cs.get_y(0), TOLERANCE)
|
21
23
|
end
|
22
24
|
|
23
25
|
def test_set_and_get_z
|
24
26
|
@cs.set_z(0, 20.02)
|
27
|
+
|
25
28
|
assert_in_delta(20.02, @cs.get_z(0), TOLERANCE)
|
26
29
|
end
|
27
30
|
|
@@ -53,7 +56,7 @@ class CoordinateSequenceTests < Minitest::Test
|
|
53
56
|
[0, 0]
|
54
57
|
])
|
55
58
|
|
56
|
-
|
59
|
+
assert_predicate(cs, :counter_clockwise?)
|
57
60
|
|
58
61
|
cs = Geos::CoordinateSequence.new([
|
59
62
|
[0, 0],
|
@@ -62,7 +65,7 @@ class CoordinateSequenceTests < Minitest::Test
|
|
62
65
|
[0, 0]
|
63
66
|
])
|
64
67
|
|
65
|
-
|
68
|
+
refute_predicate(cs, :counter_clockwise?)
|
66
69
|
end
|
67
70
|
|
68
71
|
def test_check_bounds
|
@@ -115,6 +118,7 @@ class CoordinateSequenceTests < Minitest::Test
|
|
115
118
|
|
116
119
|
def test_with_no_arguments
|
117
120
|
cs = Geos::CoordinateSequence.new
|
121
|
+
|
118
122
|
assert_equal(0, cs.size)
|
119
123
|
assert_equal(3, cs.dimensions)
|
120
124
|
end
|
@@ -153,6 +157,7 @@ class CoordinateSequenceTests < Minitest::Test
|
|
153
157
|
|
154
158
|
def test_to_point
|
155
159
|
cs = Geos::CoordinateSequence.new([5, 7])
|
160
|
+
|
156
161
|
assert_equal('POINT (5 7)', write(cs.to_point, trim: true))
|
157
162
|
end
|
158
163
|
|
@@ -170,9 +175,11 @@ class CoordinateSequenceTests < Minitest::Test
|
|
170
175
|
|
171
176
|
def test_empty
|
172
177
|
cs = Geos::CoordinateSequence.new
|
178
|
+
|
173
179
|
assert_geom_empty(cs)
|
174
180
|
|
175
181
|
cs = Geos::CoordinateSequence.new([4, 1])
|
182
|
+
|
176
183
|
refute_geom_empty(cs)
|
177
184
|
end
|
178
185
|
|
@@ -219,11 +226,13 @@ class CoordinateSequenceTests < Minitest::Test
|
|
219
226
|
|
220
227
|
def test_to_s_2d
|
221
228
|
cs = Geos::CoordinateSequence.new([[1, 2], [10, 11]])
|
229
|
+
|
222
230
|
assert_equal('1.0 2.0, 10.0 11.0', cs.to_s)
|
223
231
|
end
|
224
232
|
|
225
233
|
def test_to_s_3d
|
226
234
|
cs = Geos::CoordinateSequence.new([[1, 2, 3], [10, 11, 12]])
|
235
|
+
|
227
236
|
assert_equal('1.0 2.0 3.0, 10.0 11.0 12.0', cs.to_s)
|
228
237
|
end
|
229
238
|
|
@@ -358,37 +367,45 @@ class CoordinateSequenceTests < Minitest::Test
|
|
358
367
|
|
359
368
|
def test_x_max
|
360
369
|
cs = Geos::CoordinateSequence.new([-10, -15], [0, 5], [10, 20])
|
370
|
+
|
361
371
|
assert_equal(10, cs.x_max)
|
362
372
|
end
|
363
373
|
|
364
374
|
def test_x_min
|
365
375
|
cs = Geos::CoordinateSequence.new([-10, -15], [0, 5], [10, 20])
|
376
|
+
|
366
377
|
assert_equal(-10, cs.x_min)
|
367
378
|
end
|
368
379
|
|
369
380
|
def test_y_max
|
370
381
|
cs = Geos::CoordinateSequence.new([-10, -15], [0, 5], [10, 20])
|
382
|
+
|
371
383
|
assert_equal(20, cs.y_max)
|
372
384
|
end
|
373
385
|
|
374
386
|
def test_y_min
|
375
387
|
cs = Geos::CoordinateSequence.new([-10, -15], [0, 5], [10, 20])
|
388
|
+
|
376
389
|
assert_equal(-15, cs.y_min)
|
377
390
|
end
|
378
391
|
|
379
392
|
def test_z_max
|
380
393
|
cs = Geos::CoordinateSequence.new([-10, -15], [0, 5], [10, 20])
|
381
|
-
|
394
|
+
|
395
|
+
assert_predicate(cs.z_max, :nan?, ' Expected NaN')
|
382
396
|
|
383
397
|
cs = Geos::CoordinateSequence.new([-10, -15, -20], [0, 5, 10], [10, 20, 30])
|
398
|
+
|
384
399
|
assert_equal(30, cs.z_max)
|
385
400
|
end
|
386
401
|
|
387
402
|
def test_z_min
|
388
403
|
cs = Geos::CoordinateSequence.new([-10, -15], [0, 5], [10, 20])
|
389
|
-
|
404
|
+
|
405
|
+
assert_predicate(cs.z_min, :nan?, ' Expected NaN')
|
390
406
|
|
391
407
|
cs = Geos::CoordinateSequence.new([-10, -15, -20], [0, 5, 10], [10, 20, 30])
|
408
|
+
|
392
409
|
assert_equal(-20, cs.z_min)
|
393
410
|
end
|
394
411
|
|
@@ -422,6 +439,7 @@ class CoordinateSequenceTests < Minitest::Test
|
|
422
439
|
|
423
440
|
cs = Geos::CoordinateSequence.new(*coordinates)
|
424
441
|
snapped = cs.snap_to_grid(10 ** -i)
|
442
|
+
|
425
443
|
assert_equal(coordinates, cs.to_a)
|
426
444
|
assert_equal(expected[i].inspect, snapped.to_a.inspect)
|
427
445
|
end
|
@@ -55,7 +55,11 @@ class GeoJSONReaderTests < Minitest::Test
|
|
55
55
|
|
56
56
|
def test_multi_point
|
57
57
|
geojson_tester(
|
58
|
-
|
58
|
+
if Geos::GEOS_NICE_VERSION >= '031200'
|
59
|
+
'MULTIPOINT ((10.000 40.000), (40.000 30.000), (20.000 20.000), (30.000 10.000))'
|
60
|
+
else
|
61
|
+
'MULTIPOINT (10.000 40.000, 40.000 30.000, 20.000 20.000, 30.000 10.000)'
|
62
|
+
end,
|
59
63
|
'{"type":"MultiPoint","coordinates":[[10, 40], [40, 30], [20, 20], [30, 10]]}'
|
60
64
|
)
|
61
65
|
end
|
@@ -165,6 +169,6 @@ class GeoJSONReaderTests < Minitest::Test
|
|
165
169
|
srid: 3857
|
166
170
|
)
|
167
171
|
|
168
|
-
assert_equal(geom.srid
|
172
|
+
assert_equal(3857, geom.srid)
|
169
173
|
end
|
170
174
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryAreaTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_area
|
14
|
+
simple_tester(:area, 1.0, 'POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')
|
15
|
+
simple_tester(:area, 0.0, 'POINT (0 0)')
|
16
|
+
simple_tester(:area, 0.0, 'LINESTRING (0 0 , 10 0)')
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeometryBoundaryTests < Minitest::Test
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
writer.trim = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_boundary
|
14
|
+
simple_tester(
|
15
|
+
:boundary,
|
16
|
+
'GEOMETRYCOLLECTION EMPTY',
|
17
|
+
'POINT(0 0)'
|
18
|
+
)
|
19
|
+
|
20
|
+
simple_tester(
|
21
|
+
:boundary,
|
22
|
+
if Geos::GEOS_NICE_VERSION >= '031200'
|
23
|
+
'MULTIPOINT ((0 0), (10 10))'
|
24
|
+
else
|
25
|
+
'MULTIPOINT (0 0, 10 10)'
|
26
|
+
end,
|
27
|
+
'LINESTRING(0 0, 10 10)'
|
28
|
+
)
|
29
|
+
|
30
|
+
simple_tester(
|
31
|
+
:boundary,
|
32
|
+
'MULTILINESTRING ((0 0, 10 0, 10 10, 0 10, 0 0), (5 5, 5 6, 6 6, 6 5, 5 5))',
|
33
|
+
'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),( 5 5, 5 6, 6 6, 6 5, 5 5))'
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|