ffi-geos 1.2.2 → 2.3.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 +49 -0
- data/.rubocop.yml +5117 -4
- data/FUNDING.yml +2 -0
- data/Gemfile +9 -16
- data/Guardfile +3 -4
- data/MIT-LICENSE +1 -1
- data/README.rdoc +2 -20
- data/Rakefile +3 -2
- data/ffi-geos.gemspec +7 -2
- data/lib/ffi-geos/buffer_params.rb +1 -1
- data/lib/ffi-geos/coordinate_sequence.rb +179 -177
- data/lib/ffi-geos/geometry.rb +118 -31
- data/lib/ffi-geos/geometry_collection.rb +26 -12
- data/lib/ffi-geos/interrupt.rb +11 -14
- data/lib/ffi-geos/line_string.rb +64 -49
- data/lib/ffi-geos/multi_line_string.rb +1 -1
- data/lib/ffi-geos/point.rb +18 -18
- data/lib/ffi-geos/polygon.rb +44 -30
- data/lib/ffi-geos/prepared_geometry.rb +1 -1
- data/lib/ffi-geos/strtree.rb +28 -30
- data/lib/ffi-geos/tools.rb +1 -1
- data/lib/ffi-geos/utils.rb +16 -23
- data/lib/ffi-geos/version.rb +1 -1
- data/lib/ffi-geos/wkb_reader.rb +1 -1
- data/lib/ffi-geos/wkb_writer.rb +4 -5
- data/lib/ffi-geos/wkt_reader.rb +1 -1
- data/lib/ffi-geos/wkt_writer.rb +7 -13
- data/lib/ffi-geos.rb +134 -48
- data/sonar-project.properties +16 -0
- data/test/coordinate_sequence_tests.rb +148 -126
- data/test/geometry_collection_tests.rb +41 -67
- data/test/geometry_tests.rb +341 -40
- data/test/interrupt_tests.rb +7 -7
- data/test/line_string_tests.rb +23 -15
- data/test/point_tests.rb +5 -5
- data/test/polygon_tests.rb +6 -7
- data/test/prepared_geometry_tests.rb +8 -8
- data/test/strtree_tests.rb +13 -12
- data/test/test_helper.rb +74 -56
- data/test/utils_tests.rb +69 -59
- data/test/wkb_reader_tests.rb +9 -9
- data/test/wkb_writer_tests.rb +14 -12
- data/test/wkt_reader_tests.rb +0 -1
- data/test/wkt_writer_tests.rb +2 -5
- metadata +12 -10
- data/.travis.yml +0 -21
data/lib/ffi-geos.rb
CHANGED
@@ -50,38 +50,36 @@ module Geos
|
|
50
50
|
|
51
51
|
module FFIGeos
|
52
52
|
def self.search_paths
|
53
|
-
@search_paths ||=
|
53
|
+
@search_paths ||= \
|
54
54
|
if ENV['GEOS_LIBRARY_PATH']
|
55
|
-
[
|
55
|
+
[ENV['GEOS_LIBRARY_PATH']]
|
56
56
|
elsif FFI::Platform::IS_WINDOWS
|
57
57
|
ENV['PATH'].split(File::PATH_SEPARATOR)
|
58
58
|
else
|
59
|
-
[
|
59
|
+
['/usr/local/{lib64,lib}', '/opt/local/{lib64,lib}', '/usr/{lib64,lib}', '/usr/lib/{x86_64,i386,aarch64}-linux-gnu']
|
60
60
|
end
|
61
|
-
end
|
62
61
|
end
|
63
62
|
|
64
63
|
def self.find_lib(lib)
|
65
64
|
if ENV['GEOS_LIBRARY_PATH'] && File.file?(ENV['GEOS_LIBRARY_PATH'])
|
66
65
|
ENV['GEOS_LIBRARY_PATH']
|
67
66
|
else
|
68
|
-
Dir.glob(search_paths.map
|
67
|
+
Dir.glob(search_paths.map do |path|
|
69
68
|
File.expand_path(File.join(path, "#{lib}.#{FFI::Platform::LIBSUFFIX}{,.?}"))
|
70
|
-
|
69
|
+
end).first
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
74
73
|
def self.geos_library_path
|
75
|
-
@geos_library_path ||=
|
74
|
+
@geos_library_path ||= \
|
76
75
|
# On MingW the libraries have version numbers
|
77
76
|
find_lib('{lib,}geos_c{,-?}')
|
78
|
-
end
|
79
77
|
end
|
80
78
|
|
81
79
|
# For backwards compatibility with older ffi-geos versions where this
|
82
80
|
# used to return an Array.
|
83
81
|
def self.geos_library_paths
|
84
|
-
[
|
82
|
+
[geos_library_path]
|
85
83
|
end
|
86
84
|
|
87
85
|
extend ::FFI::Library
|
@@ -150,10 +148,10 @@ module Geos
|
|
150
148
|
:pointer,
|
151
149
|
|
152
150
|
# notice callback
|
153
|
-
callback([
|
151
|
+
callback([:string, :string], :void),
|
154
152
|
|
155
153
|
# error callback
|
156
|
-
callback([
|
154
|
+
callback([:string, :string], :void)
|
157
155
|
],
|
158
156
|
|
159
157
|
finishGEOS_r: [
|
@@ -163,16 +161,16 @@ module Geos
|
|
163
161
|
# / deprecated in GEOS 3.5.0+
|
164
162
|
|
165
163
|
# GEOS 3.5.0+
|
166
|
-
GEOS_init_r: [
|
164
|
+
GEOS_init_r: [:pointer],
|
167
165
|
|
168
166
|
GEOSContext_setNoticeMessageHandler_r: [
|
169
167
|
# void, *handle, callback, *void
|
170
|
-
:void, :pointer, callback([
|
168
|
+
:void, :pointer, callback([:string, :string], :void), :pointer
|
171
169
|
],
|
172
170
|
|
173
171
|
GEOSContext_setErrorMessageHandler_r: [
|
174
172
|
# void, *handle, callback, *void
|
175
|
-
:void, :pointer, callback([
|
173
|
+
:void, :pointer, callback([:string, :string], :void), :pointer
|
176
174
|
],
|
177
175
|
|
178
176
|
GEOS_finish_r: [
|
@@ -207,6 +205,21 @@ module Geos
|
|
207
205
|
:pointer, :pointer, :pointer, :uint
|
208
206
|
],
|
209
207
|
|
208
|
+
GEOSPolygonize_valid_r: [
|
209
|
+
# *geom, *handle, **geoms, ngeoms
|
210
|
+
:pointer, :pointer, :pointer, :uint
|
211
|
+
],
|
212
|
+
|
213
|
+
GEOSBuildArea_r: [
|
214
|
+
# *geom, *handle, *geom
|
215
|
+
:pointer, :pointer, :pointer
|
216
|
+
],
|
217
|
+
|
218
|
+
GEOSMakeValid_r: [
|
219
|
+
# *geom, *handle, *geom
|
220
|
+
:pointer, :pointer, :pointer
|
221
|
+
],
|
222
|
+
|
210
223
|
GEOSPolygonizer_getCutEdges_r: [
|
211
224
|
# *geom, *handle, **geoms, ngeoms
|
212
225
|
:pointer, :pointer, :pointer, :uint
|
@@ -328,6 +341,11 @@ module Geos
|
|
328
341
|
# 0 on exception, *handle, *coord_seq, (uint *) size
|
329
342
|
:int, :pointer, :pointer, :pointer
|
330
343
|
],
|
344
|
+
|
345
|
+
GEOSCoordSeq_isCCW_r: [
|
346
|
+
# 0 on exception, *handle, *coord_seq, (char *) value
|
347
|
+
:int, :pointer, :pointer, :pointer
|
348
|
+
],
|
331
349
|
#### /CoordinateSequence functions ####
|
332
350
|
|
333
351
|
#### Geometry functions ####
|
@@ -386,6 +404,11 @@ module Geos
|
|
386
404
|
:pointer, :pointer, :pointer, :pointer
|
387
405
|
],
|
388
406
|
|
407
|
+
GEOSIntersectionPrec_r: [
|
408
|
+
# *geom, *handle, *geom_a, *geom_b, precision
|
409
|
+
:pointer, :pointer, :pointer, :pointer, :double
|
410
|
+
],
|
411
|
+
|
389
412
|
GEOSBufferWithParams_r: [
|
390
413
|
# *geom, *handle, *geom, *params, width
|
391
414
|
:pointer, :pointer, :pointer, :pointer, :double
|
@@ -422,11 +445,21 @@ module Geos
|
|
422
445
|
:pointer, :pointer, :pointer, :pointer
|
423
446
|
],
|
424
447
|
|
448
|
+
GEOSDifferencePrec_r: [
|
449
|
+
# *geom, *handle, *geom_a, *geom_b, precision
|
450
|
+
:pointer, :pointer, :pointer, :pointer, :double
|
451
|
+
],
|
452
|
+
|
425
453
|
GEOSSymDifference_r: [
|
426
454
|
# *geom, *handle, *geom_a, *geom_b
|
427
455
|
:pointer, :pointer, :pointer, :pointer
|
428
456
|
],
|
429
457
|
|
458
|
+
GEOSSymDifferencePrec_r: [
|
459
|
+
# *geom, *handle, *geom_a, *geom_b, precision
|
460
|
+
:pointer, :pointer, :pointer, :pointer, :double
|
461
|
+
],
|
462
|
+
|
430
463
|
GEOSBoundary_r: [
|
431
464
|
# *geom, *handle, *geom
|
432
465
|
:pointer, :pointer, :pointer
|
@@ -437,11 +470,26 @@ module Geos
|
|
437
470
|
:pointer, :pointer, :pointer, :pointer
|
438
471
|
],
|
439
472
|
|
473
|
+
GEOSUnionPrec_r: [
|
474
|
+
# *geom, *handle, *geom_a, *geom_b, precision
|
475
|
+
:pointer, :pointer, :pointer, :pointer, :double
|
476
|
+
],
|
477
|
+
|
478
|
+
GEOSCoverageUnion_r: [
|
479
|
+
# *geom, *handle, *geom
|
480
|
+
:pointer, :pointer, :pointer
|
481
|
+
],
|
482
|
+
|
440
483
|
GEOSUnaryUnion_r: [
|
441
484
|
# *geom, *handle, *geom
|
442
485
|
:pointer, :pointer, :pointer
|
443
486
|
],
|
444
487
|
|
488
|
+
GEOSUnaryUnionPrec_r: [
|
489
|
+
# *geom, *handle, *geom, precision
|
490
|
+
:pointer, :pointer, :pointer, :double
|
491
|
+
],
|
492
|
+
|
445
493
|
GEOSNode_r: [
|
446
494
|
# *geom, *handle, *geom
|
447
495
|
:pointer, :pointer, :pointer
|
@@ -468,6 +516,11 @@ module Geos
|
|
468
516
|
:pointer, :pointer, :pointer
|
469
517
|
],
|
470
518
|
|
519
|
+
GEOSMinimumBoundingCircle_r: [
|
520
|
+
# *geom, *handle, *geom, *double radius, **geom center
|
521
|
+
:pointer, :pointer, :pointer, :pointer, :pointer
|
522
|
+
],
|
523
|
+
|
471
524
|
GEOSEnvelope_r: [
|
472
525
|
# *geom, *handle, *geom
|
473
526
|
:pointer, :pointer, :pointer
|
@@ -478,6 +531,26 @@ module Geos
|
|
478
531
|
:pointer, :pointer, :pointer
|
479
532
|
],
|
480
533
|
|
534
|
+
GEOSGeom_getXMin_r: [
|
535
|
+
# 0 on exception, *handle, (double *) value
|
536
|
+
:int, :pointer, :pointer, :pointer
|
537
|
+
],
|
538
|
+
|
539
|
+
GEOSGeom_getXMax_r: [
|
540
|
+
# 0 on exception, *handle, (double *) value
|
541
|
+
:int, :pointer, :pointer, :pointer
|
542
|
+
],
|
543
|
+
|
544
|
+
GEOSGeom_getYMin_r: [
|
545
|
+
# 0 on exception, *handle, (double *) value
|
546
|
+
:int, :pointer, :pointer, :pointer
|
547
|
+
],
|
548
|
+
|
549
|
+
GEOSGeom_getYMax_r: [
|
550
|
+
# 0 on exception, *handle, (double *) value
|
551
|
+
:int, :pointer, :pointer, :pointer
|
552
|
+
],
|
553
|
+
|
481
554
|
GEOSSimplify_r: [
|
482
555
|
# *geom, *handle, *geom, tolerance
|
483
556
|
:pointer, :pointer, :pointer, :double
|
@@ -643,6 +716,11 @@ module Geos
|
|
643
716
|
:int, :pointer, :pointer, :pointer, :pointer
|
644
717
|
],
|
645
718
|
|
719
|
+
GEOSDistanceIndexed_r: [
|
720
|
+
# (0 on exception, 1 otherwise), *handle, *geom_a, *geom_b, (double *) distance
|
721
|
+
:int, :pointer, :pointer, :pointer, :pointer
|
722
|
+
],
|
723
|
+
|
646
724
|
GEOSHausdorffDistance_r: [
|
647
725
|
# (0 on exception, 1 otherwise), *handle, *geom_a, *geom_b, (double *) distance
|
648
726
|
:int, :pointer, :pointer, :pointer, :pointer
|
@@ -743,6 +821,16 @@ module Geos
|
|
743
821
|
:pointer, :pointer, :pointer
|
744
822
|
],
|
745
823
|
|
824
|
+
GEOSMaximumInscribedCircle_r: [
|
825
|
+
# *geom, *handle, *geom, tolerance
|
826
|
+
:pointer, :pointer, :pointer, :double
|
827
|
+
],
|
828
|
+
|
829
|
+
GEOSLargestEmptyCircle_r: [
|
830
|
+
# *geom, *handle, *geom, *geom, tolerance
|
831
|
+
:pointer, :pointer, :pointer, :pointer, :double
|
832
|
+
],
|
833
|
+
|
746
834
|
GEOSMinimumWidth_r: [
|
747
835
|
# *geom, *handle, *geom
|
748
836
|
:pointer, :pointer, :pointer
|
@@ -777,12 +865,12 @@ module Geos
|
|
777
865
|
|
778
866
|
GEOSSTRtree_query_r: [
|
779
867
|
# void, *handle, *tree, *geom, void query_callback((void *) item, (void *) user_data), (void *) user_data
|
780
|
-
:void, :pointer, :pointer, :pointer, callback([
|
868
|
+
:void, :pointer, :pointer, :pointer, callback([:pointer, :pointer], :void), :pointer
|
781
869
|
],
|
782
870
|
|
783
871
|
GEOSSTRtree_iterate_r: [
|
784
872
|
# void, *handle, *tree, void query_callback((void *) item, (void *) user_data), (void *) user_data
|
785
|
-
:void, :pointer, :pointer, callback([
|
873
|
+
:void, :pointer, :pointer, callback([:pointer, :pointer], :void), :pointer
|
786
874
|
],
|
787
875
|
|
788
876
|
GEOSSTRtree_remove_r: [
|
@@ -797,7 +885,7 @@ module Geos
|
|
797
885
|
|
798
886
|
GEOSSTRtree_nearest_generic_r: [
|
799
887
|
# *void, *handle, *tree, *item, *item_envelope, int distance_callback(*item_1, *item_2, *double, void *user_data), *user_data
|
800
|
-
:pointer, :pointer, :pointer, :pointer, :pointer, callback([
|
888
|
+
:pointer, :pointer, :pointer, :pointer, :pointer, callback([:pointer, :pointer, :pointer, :pointer], :int), :pointer
|
801
889
|
],
|
802
890
|
#### /STRtree functions ####
|
803
891
|
|
@@ -1105,13 +1193,11 @@ module Geos
|
|
1105
1193
|
def notice_handler=(method_or_block)
|
1106
1194
|
@notice_handler = method_or_block
|
1107
1195
|
FFIGeos.GEOSContext_setNoticeMessageHandler_r(@ptr, @notice_handler, nil)
|
1108
|
-
@notice_handler
|
1109
1196
|
end
|
1110
1197
|
|
1111
1198
|
def error_handler=(method_or_block)
|
1112
1199
|
@error_handler = method_or_block
|
1113
1200
|
FFIGeos.GEOSContext_setErrorMessageHandler_r(@ptr, @error_handler, nil)
|
1114
|
-
@error_handler
|
1115
1201
|
end
|
1116
1202
|
|
1117
1203
|
def notice_handler(&block)
|
@@ -1148,13 +1234,9 @@ module Geos
|
|
1148
1234
|
FFIGeos.finishGEOS_r(ptr)
|
1149
1235
|
end
|
1150
1236
|
|
1151
|
-
|
1152
|
-
@notice_handler
|
1153
|
-
end
|
1237
|
+
attr_reader :notice_handler
|
1154
1238
|
|
1155
|
-
|
1156
|
-
@error_handler
|
1157
|
-
end
|
1239
|
+
attr_reader :error_handler
|
1158
1240
|
end
|
1159
1241
|
|
1160
1242
|
private
|
@@ -1170,7 +1252,7 @@ module Geos
|
|
1170
1252
|
|
1171
1253
|
class << self
|
1172
1254
|
def version
|
1173
|
-
@version ||= FFIGeos.GEOSversion
|
1255
|
+
@version ||= FFIGeos.GEOSversion.strip
|
1174
1256
|
end
|
1175
1257
|
|
1176
1258
|
def jts_port
|
@@ -1281,30 +1363,34 @@ module Geos
|
|
1281
1363
|
GEOS_CAPI_VERSION,
|
1282
1364
|
GEOS_CAPI_VERSION_MAJOR, GEOS_CAPI_VERSION_MINOR, GEOS_CAPI_VERSION_PATCH,
|
1283
1365
|
GEOS_SVN_REVISION =
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
]
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1366
|
+
if (versions = Geos.version.scan(/^
|
1367
|
+
((\d+)\.(\d+)\.(\d+)((?:dev|rc|beta|alpha)\d*)?)
|
1368
|
+
-CAPI-
|
1369
|
+
((\d+)\.(\d+)\.(\d+))
|
1370
|
+
(?:\s+r?(\h+))?
|
1371
|
+
$/x)).empty?
|
1372
|
+
['0.0.0', 0, 0, 0, nil, '0.0.0', 0, 0, 0]
|
1373
|
+
else
|
1374
|
+
versions = versions[0]
|
1375
|
+
[
|
1376
|
+
versions[0],
|
1377
|
+
versions[1].to_i,
|
1378
|
+
versions[2].to_i,
|
1379
|
+
versions[3].to_i,
|
1380
|
+
versions[4],
|
1381
|
+
versions[5],
|
1382
|
+
versions[6].to_i,
|
1383
|
+
versions[7].to_i,
|
1384
|
+
versions[8].to_i,
|
1385
|
+
versions[9]&.to_i
|
1386
|
+
]
|
1387
|
+
end
|
1306
1388
|
GEOS_CAPI_FIRST_INTERFACE = GEOS_CAPI_VERSION_MAJOR.to_i
|
1307
1389
|
GEOS_CAPI_LAST_INTERFACE = GEOS_CAPI_VERSION_MAJOR.to_i + GEOS_CAPI_VERSION_MINOR.to_i
|
1390
|
+
|
1391
|
+
GEOS_NICE_VERSION = [GEOS_VERSION_MAJOR, GEOS_VERSION_MINOR, GEOS_VERSION_PATCH].collect { |version|
|
1392
|
+
version.to_s.rjust(2, '0')
|
1393
|
+
}.join
|
1308
1394
|
end
|
1309
1395
|
|
1310
1396
|
module Constants
|
@@ -0,0 +1,16 @@
|
|
1
|
+
sonar.projectKey=dark-panda_ffi-geos
|
2
|
+
sonar.organization=dark-panda
|
3
|
+
|
4
|
+
# This is the name and version displayed in the SonarCloud UI.
|
5
|
+
sonar.projectName=ffi-geos
|
6
|
+
sonar.projectVersion=1.0
|
7
|
+
|
8
|
+
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
|
9
|
+
sonar.sources=lib, test
|
10
|
+
|
11
|
+
# Encoding of the source code. Default is default system encoding
|
12
|
+
sonar.sourceEncoding=UTF-8
|
13
|
+
|
14
|
+
# Additional reports
|
15
|
+
sonar.ruby.rubocop.reportPaths=rubocop-report.json
|
16
|
+
sonar.ruby.coverage.reportPaths=coverage/coverage.json
|