ffi-geos 1.2.0 → 2.2.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 +5 -5
- data/.rubocop.yml +4851 -0
- data/.travis.yml +24 -9
- data/FUNDING.yml +2 -0
- data/Gemfile +12 -16
- data/Guardfile +6 -8
- data/MIT-LICENSE +1 -1
- data/README.rdoc +2 -20
- data/Rakefile +4 -2
- data/ffi-geos.gemspec +13 -14
- data/lib/ffi-geos.rb +342 -244
- data/lib/ffi-geos/buffer_params.rb +9 -20
- data/lib/ffi-geos/coordinate_sequence.rb +351 -65
- data/lib/ffi-geos/geometry.rb +267 -191
- data/lib/ffi-geos/geometry_collection.rb +74 -12
- data/lib/ffi-geos/interrupt.rb +11 -16
- data/lib/ffi-geos/line_string.rb +157 -33
- data/lib/ffi-geos/linear_ring.rb +2 -3
- data/lib/ffi-geos/multi_line_string.rb +1 -2
- data/lib/ffi-geos/multi_point.rb +0 -1
- data/lib/ffi-geos/multi_polygon.rb +0 -1
- data/lib/ffi-geos/point.rb +70 -15
- data/lib/ffi-geos/polygon.rb +124 -21
- data/lib/ffi-geos/prepared_geometry.rb +11 -12
- data/lib/ffi-geos/strtree.rb +64 -77
- data/lib/ffi-geos/tools.rb +16 -19
- data/lib/ffi-geos/utils.rb +36 -60
- data/lib/ffi-geos/version.rb +1 -3
- data/lib/ffi-geos/wkb_reader.rb +4 -9
- data/lib/ffi-geos/wkb_writer.rb +15 -20
- data/lib/ffi-geos/wkt_reader.rb +2 -5
- data/lib/ffi-geos/wkt_writer.rb +20 -31
- data/sonar-project.properties +16 -0
- data/test/.rubocop.yml +36 -0
- data/test/coordinate_sequence_tests.rb +322 -52
- data/test/geometry_collection_tests.rb +388 -4
- data/test/geometry_tests.rb +466 -121
- data/test/interrupt_tests.rb +9 -12
- data/test/line_string_tests.rb +213 -25
- data/test/linear_ring_tests.rb +1 -3
- data/test/misc_tests.rb +28 -30
- data/test/multi_line_string_tests.rb +0 -2
- data/test/point_tests.rb +158 -2
- data/test/polygon_tests.rb +283 -2
- data/test/prepared_geometry_tests.rb +8 -11
- data/test/strtree_tests.rb +14 -15
- data/test/test_helper.rb +75 -51
- data/test/tools_tests.rb +1 -4
- data/test/utils_tests.rb +85 -76
- data/test/wkb_reader_tests.rb +18 -18
- data/test/wkb_writer_tests.rb +15 -22
- data/test/wkt_reader_tests.rb +1 -4
- data/test/wkt_writer_tests.rb +8 -17
- metadata +11 -7
data/lib/ffi-geos/tools.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Geos
|
5
4
|
class NullPointerError < Geos::Error
|
6
5
|
def initialize(*)
|
7
|
-
super(
|
6
|
+
super('Tried to create a Geometry from a NULL pointer!')
|
8
7
|
end
|
9
8
|
end
|
10
9
|
|
11
10
|
class InvalidGeometryTypeError < Geos::Error
|
12
11
|
def initialize(*)
|
13
|
-
super(
|
12
|
+
super('Invalid geometry type')
|
14
13
|
end
|
15
14
|
end
|
16
15
|
|
@@ -25,12 +24,10 @@ module Geos
|
|
25
24
|
|
26
25
|
def cast_geometry_ptr(geom_ptr, options = {})
|
27
26
|
options = {
|
28
|
-
:
|
27
|
+
auto_free: true
|
29
28
|
}.merge(options)
|
30
29
|
|
31
|
-
if geom_ptr.null?
|
32
|
-
raise Geos::NullPointerError.new
|
33
|
-
end
|
30
|
+
raise Geos::NullPointerError if geom_ptr.null?
|
34
31
|
|
35
32
|
klass = case FFIGeos.GEOSGeomTypeId_r(Geos.current_handle_pointer, geom_ptr)
|
36
33
|
when GEOS_POINT
|
@@ -50,10 +47,10 @@ module Geos
|
|
50
47
|
when GEOS_GEOMETRYCOLLECTION
|
51
48
|
GeometryCollection
|
52
49
|
else
|
53
|
-
raise Geos::InvalidGeometryTypeError
|
50
|
+
raise Geos::InvalidGeometryTypeError
|
54
51
|
end
|
55
52
|
|
56
|
-
klass.new(geom_ptr, options).tap
|
53
|
+
klass.new(geom_ptr, options).tap do |ret|
|
57
54
|
if options[:srid]
|
58
55
|
ret.srid = options[:srid] || 0
|
59
56
|
elsif options[:srid_copy]
|
@@ -63,11 +60,11 @@ module Geos
|
|
63
60
|
options[:srid_copy] || 0
|
64
61
|
end
|
65
62
|
end
|
66
|
-
|
63
|
+
end
|
67
64
|
end
|
68
65
|
|
69
66
|
def check_geometry(geom)
|
70
|
-
raise TypeError
|
67
|
+
raise TypeError, 'Expected Geos::Geometry' unless geom.is_a?(Geos::Geometry)
|
71
68
|
end
|
72
69
|
|
73
70
|
def pick_srid_from_geoms(srid_a, srid_b, policy = Geos.srid_copy_policy)
|
@@ -81,7 +78,7 @@ module Geos
|
|
81
78
|
when :strict
|
82
79
|
raise Geos::MixedSRIDsError.new(srid_a, srid_b)
|
83
80
|
else
|
84
|
-
raise ArgumentError
|
81
|
+
raise ArgumentError, "Unexpected policy value: #{policy}"
|
85
82
|
end
|
86
83
|
end
|
87
84
|
|
@@ -97,12 +94,12 @@ module Geos
|
|
97
94
|
|
98
95
|
def bool_result(result)
|
99
96
|
case result
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
97
|
+
when 1
|
98
|
+
true
|
99
|
+
when 0
|
100
|
+
false
|
101
|
+
else
|
102
|
+
raise Geos::UnexpectedBooleanResultError, result
|
106
103
|
end
|
107
104
|
end
|
108
105
|
|
@@ -116,7 +113,7 @@ module Geos
|
|
116
113
|
|
117
114
|
def check_enum_value(enum, value)
|
118
115
|
enum[value] or
|
119
|
-
raise TypeError
|
116
|
+
raise TypeError, "Couldn't find valid #{enum.tag} value: #{value}"
|
120
117
|
end
|
121
118
|
|
122
119
|
def symbol_for_enum(enum, value)
|
data/lib/ffi-geos/utils.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Geos
|
@@ -31,106 +30,86 @@ module Geos
|
|
31
30
|
def create_point(*args)
|
32
31
|
options = extract_options!(args)
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
33
|
+
case args.length
|
34
|
+
when 1
|
35
|
+
cs = args.first
|
36
|
+
when 2
|
37
|
+
cs = CoordinateSequence.new(1, 2)
|
38
|
+
cs.x[0] = args[0].to_f
|
39
|
+
cs.y[0] = args[1].to_f
|
40
|
+
when 3
|
41
|
+
cs = CoordinateSequence.new(1, 3)
|
42
|
+
cs.x[0], cs.y[0], cs.z[0] = args.map(&:to_f)
|
43
|
+
else
|
44
|
+
raise ArgumentError, "Wrong number of arguments (#{args.length} for 1-3)"
|
44
45
|
end
|
45
46
|
|
46
|
-
if cs.length != 1
|
47
|
-
raise ArgumentError.new("IllegalArgumentException: Point coordinate list must contain a single element")
|
48
|
-
end
|
47
|
+
raise ArgumentError, 'IllegalArgumentException: Point coordinate list must contain a single element' if cs.length != 1
|
49
48
|
|
50
49
|
cs_dup = cs.dup
|
51
50
|
cs_dup.ptr.autorelease = false
|
52
51
|
|
53
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createPoint_r(Geos.current_handle_pointer, cs_dup.ptr),
|
54
|
-
:srid => options[:srid]
|
55
|
-
})
|
52
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createPoint_r(Geos.current_handle_pointer, cs_dup.ptr), srid: options[:srid])
|
56
53
|
end
|
57
54
|
|
58
55
|
def create_line_string(cs, options = {})
|
59
56
|
cs = cs_from_cs_or_geom(cs)
|
60
57
|
|
61
|
-
if cs.length <= 1 && cs.
|
62
|
-
raise ArgumentError.new("IllegalArgumentException: point array must contain 0 or >1 elements")
|
63
|
-
end
|
58
|
+
raise ArgumentError, 'IllegalArgumentException: point array must contain 0 or >1 elements' if cs.length <= 1 && !cs.empty?
|
64
59
|
|
65
60
|
cs_dup = cs.dup
|
66
61
|
cs_dup.ptr.autorelease = false
|
67
62
|
|
68
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createLineString_r(Geos.current_handle_pointer, cs_dup.ptr),
|
69
|
-
:srid => options[:srid]
|
70
|
-
})
|
63
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createLineString_r(Geos.current_handle_pointer, cs_dup.ptr), srid: options[:srid])
|
71
64
|
end
|
72
65
|
|
73
66
|
def create_linear_ring(cs, options = {})
|
74
67
|
cs = cs_from_cs_or_geom(cs)
|
75
68
|
|
76
|
-
if cs.length <= 1 && cs.
|
77
|
-
raise ArgumentError.new("IllegalArgumentException: point array must contain 0 or >1 elements")
|
78
|
-
end
|
69
|
+
raise ArgumentError, 'IllegalArgumentException: point array must contain 0 or >1 elements' if cs.length <= 1 && !cs.empty?
|
79
70
|
|
80
71
|
cs.ptr.autorelease = false
|
81
72
|
|
82
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createLinearRing_r(Geos.current_handle_pointer, cs.ptr),
|
83
|
-
:srid => options[:srid]
|
84
|
-
})
|
73
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createLinearRing_r(Geos.current_handle_pointer, cs.ptr), srid: options[:srid])
|
85
74
|
end
|
86
75
|
|
87
76
|
def create_polygon(outer, *args)
|
88
77
|
options = extract_options!(args)
|
89
78
|
|
90
|
-
inner_dups = Array(args).flatten.collect
|
79
|
+
inner_dups = Array(args).flatten.collect do |i|
|
91
80
|
force_to_linear_ring(i) or
|
92
|
-
raise TypeError
|
93
|
-
|
81
|
+
raise TypeError, 'Expected inner Array to contain Geos::LinearRing or Geos::CoordinateSequence objects'
|
82
|
+
end
|
94
83
|
|
95
84
|
outer_dup = force_to_linear_ring(outer) or
|
96
|
-
raise TypeError
|
85
|
+
raise TypeError, 'Expected outer shell to be a Geos::LinearRing or Geos::CoordinateSequence'
|
97
86
|
|
98
87
|
ary = FFI::MemoryPointer.new(:pointer, inner_dups.length)
|
99
88
|
ary.write_array_of_pointer(inner_dups.map(&:ptr))
|
100
89
|
|
101
90
|
outer_dup.ptr.autorelease = false
|
102
|
-
inner_dups.each
|
91
|
+
inner_dups.each do |i|
|
103
92
|
i.ptr.autorelease = false
|
104
|
-
|
93
|
+
end
|
105
94
|
|
106
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createPolygon_r(Geos.current_handle_pointer, outer_dup.ptr, ary, inner_dups.length),
|
107
|
-
:srid => options[:srid]
|
108
|
-
})
|
95
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createPolygon_r(Geos.current_handle_pointer, outer_dup.ptr, ary, inner_dups.length), srid: options[:srid])
|
109
96
|
end
|
110
97
|
|
111
98
|
def create_empty_point(options = {})
|
112
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPoint_r(Geos.current_handle_pointer),
|
113
|
-
:srid => options[:srid]
|
114
|
-
})
|
99
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPoint_r(Geos.current_handle_pointer), srid: options[:srid])
|
115
100
|
end
|
116
101
|
|
117
102
|
def create_empty_line_string(options = {})
|
118
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyLineString_r(Geos.current_handle_pointer),
|
119
|
-
:srid => options[:srid]
|
120
|
-
})
|
103
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyLineString_r(Geos.current_handle_pointer), srid: options[:srid])
|
121
104
|
end
|
122
105
|
|
123
106
|
def create_empty_polygon(options = {})
|
124
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPolygon_r(Geos.current_handle_pointer),
|
125
|
-
:srid => options[:srid]
|
126
|
-
})
|
107
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPolygon_r(Geos.current_handle_pointer), srid: options[:srid])
|
127
108
|
end
|
128
109
|
|
129
110
|
def create_empty_collection(t, options = {})
|
130
111
|
check_enum_value(Geos::GeometryTypes, t)
|
131
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyCollection_r(Geos.current_handle_pointer, t),
|
132
|
-
:srid => options[:srid]
|
133
|
-
})
|
112
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyCollection_r(Geos.current_handle_pointer, t), srid: options[:srid])
|
134
113
|
end
|
135
114
|
|
136
115
|
def create_empty_multi_point(options = {})
|
@@ -169,23 +148,19 @@ module Geos
|
|
169
148
|
|
170
149
|
options = extract_options!(args)
|
171
150
|
|
172
|
-
geoms = Array(args).flatten.tap
|
173
|
-
if i.detect { |g| !g.is_a?(klass) }
|
174
|
-
|
175
|
-
end
|
176
|
-
}
|
151
|
+
geoms = Array(args).flatten.tap do |i|
|
152
|
+
raise TypeError, "Expected geoms Array to contain #{klass} objects" if i.detect { |g| !g.is_a?(klass) }
|
153
|
+
end
|
177
154
|
|
178
155
|
geoms_dups = geoms.map(&:dup)
|
179
|
-
geoms_dups.each
|
156
|
+
geoms_dups.each do |i|
|
180
157
|
i.ptr.autorelease = false
|
181
|
-
|
158
|
+
end
|
182
159
|
|
183
160
|
ary = FFI::MemoryPointer.new(:pointer, geoms.length)
|
184
161
|
ary.write_array_of_pointer(geoms_dups.map(&:ptr))
|
185
162
|
|
186
|
-
cast_geometry_ptr(FFIGeos.GEOSGeom_createCollection_r(Geos.current_handle_pointer, t, ary, geoms_dups.length),
|
187
|
-
:srid => options[:srid]
|
188
|
-
})
|
163
|
+
cast_geometry_ptr(FFIGeos.GEOSGeom_createCollection_r(Geos.current_handle_pointer, t, ary, geoms_dups.length), srid: options[:srid])
|
189
164
|
end
|
190
165
|
|
191
166
|
def create_multi_point(*args)
|
@@ -205,6 +180,7 @@ module Geos
|
|
205
180
|
end
|
206
181
|
|
207
182
|
private
|
183
|
+
|
208
184
|
def cs_from_cs_or_geom(geom_or_cs)
|
209
185
|
case geom_or_cs
|
210
186
|
when Array
|
data/lib/ffi-geos/version.rb
CHANGED
data/lib/ffi-geos/wkb_reader.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Geos
|
@@ -24,19 +23,15 @@ module Geos
|
|
24
23
|
end
|
25
24
|
|
26
25
|
def read(wkb, options = {})
|
27
|
-
cast_geometry_ptr(FFIGeos.GEOSWKBReader_read_r(Geos.current_handle_pointer,
|
28
|
-
:srid => options[:srid]
|
29
|
-
})
|
26
|
+
cast_geometry_ptr(FFIGeos.GEOSWKBReader_read_r(Geos.current_handle_pointer, ptr, wkb, wkb.bytesize), srid: options[:srid])
|
30
27
|
rescue Geos::GEOSException => e
|
31
|
-
raise ParseError
|
28
|
+
raise ParseError, e
|
32
29
|
end
|
33
30
|
|
34
31
|
def read_hex(wkb, options = {})
|
35
|
-
cast_geometry_ptr(FFIGeos.GEOSWKBReader_readHEX_r(Geos.current_handle_pointer,
|
36
|
-
:srid => options[:srid]
|
37
|
-
})
|
32
|
+
cast_geometry_ptr(FFIGeos.GEOSWKBReader_readHEX_r(Geos.current_handle_pointer, ptr, wkb, wkb.bytesize), srid: options[:srid])
|
38
33
|
rescue Geos::GEOSException => e
|
39
|
-
raise ParseError
|
34
|
+
raise ParseError, e
|
40
35
|
end
|
41
36
|
|
42
37
|
def self.release(ptr) #:nodoc:
|
data/lib/ffi-geos/wkb_writer.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Geos
|
@@ -9,7 +8,7 @@ module Geos
|
|
9
8
|
|
10
9
|
def initialize(options = {})
|
11
10
|
options = {
|
12
|
-
:
|
11
|
+
include_srid: false
|
13
12
|
}.merge(options)
|
14
13
|
|
15
14
|
ptr = FFIGeos.GEOSWKBWriter_create_r(Geos.current_handle_pointer)
|
@@ -30,14 +29,14 @@ module Geos
|
|
30
29
|
def write(geom, options = nil)
|
31
30
|
unless options.nil?
|
32
31
|
old_options = {
|
33
|
-
:
|
32
|
+
include_srid: include_srid
|
34
33
|
}
|
35
34
|
|
36
35
|
set_options(options)
|
37
36
|
end
|
38
37
|
|
39
38
|
size_t = FFI::MemoryPointer.new(:size_t)
|
40
|
-
FFIGeos.GEOSWKBWriter_write_r(Geos.current_handle_pointer,
|
39
|
+
FFIGeos.GEOSWKBWriter_write_r(Geos.current_handle_pointer, ptr, geom.ptr, size_t).get_bytes(0, size_t.read_int)
|
41
40
|
ensure
|
42
41
|
set_options(old_options) unless old_options.nil?
|
43
42
|
end
|
@@ -45,53 +44,49 @@ module Geos
|
|
45
44
|
def write_hex(geom, options = nil)
|
46
45
|
unless options.nil?
|
47
46
|
old_options = {
|
48
|
-
:
|
47
|
+
include_srid: include_srid
|
49
48
|
}
|
50
49
|
|
51
50
|
set_options(options)
|
52
51
|
end
|
53
52
|
|
54
53
|
size_t = FFI::MemoryPointer.new(:size_t)
|
55
|
-
FFIGeos.GEOSWKBWriter_writeHEX_r(Geos.current_handle_pointer,
|
54
|
+
FFIGeos.GEOSWKBWriter_writeHEX_r(Geos.current_handle_pointer, ptr, geom.ptr, size_t).get_string(0, size_t.read_int)
|
56
55
|
ensure
|
57
56
|
set_options(old_options) unless old_options.nil?
|
58
57
|
end
|
59
58
|
|
60
59
|
def output_dimensions=(dim)
|
61
|
-
if dim < 2 || dim > 3
|
62
|
-
|
63
|
-
|
64
|
-
FFIGeos.GEOSWKBWriter_setOutputDimension_r(Geos.current_handle_pointer, self.ptr, dim)
|
60
|
+
raise ArgumentError, 'Output dimensions must be either 2 or 3' if dim < 2 || dim > 3
|
61
|
+
|
62
|
+
FFIGeos.GEOSWKBWriter_setOutputDimension_r(Geos.current_handle_pointer, ptr, dim)
|
65
63
|
end
|
66
64
|
|
67
65
|
def output_dimensions
|
68
|
-
FFIGeos.GEOSWKBWriter_getOutputDimension_r(Geos.current_handle_pointer,
|
66
|
+
FFIGeos.GEOSWKBWriter_getOutputDimension_r(Geos.current_handle_pointer, ptr)
|
69
67
|
end
|
70
68
|
|
71
69
|
def include_srid
|
72
|
-
bool_result(FFIGeos.GEOSWKBWriter_getIncludeSRID_r(Geos.current_handle_pointer,
|
70
|
+
bool_result(FFIGeos.GEOSWKBWriter_getIncludeSRID_r(Geos.current_handle_pointer, ptr))
|
73
71
|
end
|
74
72
|
|
75
73
|
def include_srid=(val)
|
76
|
-
FFIGeos.GEOSWKBWriter_setIncludeSRID_r(Geos.current_handle_pointer,
|
77
|
-
Geos::Tools.bool_to_int(val)
|
78
|
-
)
|
74
|
+
FFIGeos.GEOSWKBWriter_setIncludeSRID_r(Geos.current_handle_pointer, ptr, Geos::Tools.bool_to_int(val))
|
79
75
|
end
|
80
76
|
|
81
77
|
def byte_order
|
82
|
-
FFIGeos.GEOSWKBWriter_getByteOrder_r(Geos.current_handle_pointer,
|
78
|
+
FFIGeos.GEOSWKBWriter_getByteOrder_r(Geos.current_handle_pointer, ptr)
|
83
79
|
end
|
84
80
|
|
85
81
|
def byte_order=(val)
|
86
82
|
check_enum_value(Geos::ByteOrders, val)
|
87
|
-
FFIGeos.GEOSWKBWriter_setByteOrder_r(Geos.current_handle_pointer,
|
83
|
+
FFIGeos.GEOSWKBWriter_setByteOrder_r(Geos.current_handle_pointer, ptr, val)
|
88
84
|
end
|
89
85
|
|
90
86
|
private
|
87
|
+
|
91
88
|
def set_options(options) #:nodoc:
|
92
|
-
[
|
93
|
-
self.send("#{k}=", options[k]) if options.has_key?(k)
|
94
|
-
end
|
89
|
+
self.include_srid = options[:include_srid] if options.key?(:include_srid)
|
95
90
|
end
|
96
91
|
end
|
97
92
|
end
|
data/lib/ffi-geos/wkt_reader.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Geos
|
@@ -24,11 +23,9 @@ module Geos
|
|
24
23
|
end
|
25
24
|
|
26
25
|
def read(wkt, options = {})
|
27
|
-
cast_geometry_ptr(FFIGeos.GEOSWKTReader_read_r(Geos.current_handle_pointer,
|
28
|
-
:srid => options[:srid]
|
29
|
-
})
|
26
|
+
cast_geometry_ptr(FFIGeos.GEOSWKTReader_read_r(Geos.current_handle_pointer, ptr, wkt), srid: options[:srid])
|
30
27
|
rescue Geos::GEOSException => e
|
31
|
-
raise ParseError
|
28
|
+
raise ParseError, e
|
32
29
|
end
|
33
30
|
|
34
31
|
def self.release(ptr) #:nodoc:
|
data/lib/ffi-geos/wkt_writer.rb
CHANGED
@@ -1,19 +1,15 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Geos
|
5
4
|
class WktWriter
|
6
|
-
attr_reader :ptr
|
7
|
-
attr_reader :old_3d
|
8
|
-
attr_reader :rounding_precision
|
9
|
-
attr_reader :trim
|
5
|
+
attr_reader :ptr, :old_3d, :rounding_precision, :trim
|
10
6
|
|
11
7
|
def initialize(options = {})
|
12
8
|
options = {
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
9
|
+
trim: false,
|
10
|
+
old_3d: false,
|
11
|
+
rounding_precision: -1,
|
12
|
+
output_dimensions: 2
|
17
13
|
}.merge(options)
|
18
14
|
|
19
15
|
ptr = FFIGeos.GEOSWKTWriter_create_r(Geos.current_handle_pointer)
|
@@ -30,8 +26,8 @@ module Geos
|
|
30
26
|
end
|
31
27
|
|
32
28
|
def set_options(options) #:nodoc:
|
33
|
-
[
|
34
|
-
|
29
|
+
[:trim, :old_3d, :rounding_precision, :output_dimensions].each do |k|
|
30
|
+
send("#{k}=", options[k]) if respond_to?("#{k}=") && options.key?(k)
|
35
31
|
end
|
36
32
|
end
|
37
33
|
private :set_options
|
@@ -42,16 +38,16 @@ module Geos
|
|
42
38
|
def write(geom, options = nil)
|
43
39
|
unless options.nil?
|
44
40
|
old_options = {
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:
|
41
|
+
trim: trim,
|
42
|
+
old_3d: old_3d,
|
43
|
+
rounding_precision: rounding_precision,
|
44
|
+
output_dimensions: output_dimensions
|
49
45
|
}
|
50
46
|
|
51
47
|
set_options(options)
|
52
48
|
end
|
53
49
|
|
54
|
-
FFIGeos.GEOSWKTWriter_write_r(Geos.current_handle_pointer,
|
50
|
+
FFIGeos.GEOSWKTWriter_write_r(Geos.current_handle_pointer, ptr, geom.ptr)
|
55
51
|
ensure
|
56
52
|
set_options(old_options) unless options.nil?
|
57
53
|
end
|
@@ -60,9 +56,7 @@ module Geos
|
|
60
56
|
# Available in GEOS 3.3+.
|
61
57
|
def trim=(val)
|
62
58
|
@trim = !!val
|
63
|
-
FFIGeos.GEOSWKTWriter_setTrim_r(Geos.current_handle_pointer,
|
64
|
-
Geos::Tools.bool_to_int(@trim)
|
65
|
-
)
|
59
|
+
FFIGeos.GEOSWKTWriter_setTrim_r(Geos.current_handle_pointer, ptr, Geos::Tools.bool_to_int(@trim))
|
66
60
|
end
|
67
61
|
end
|
68
62
|
|
@@ -70,12 +64,10 @@ module Geos
|
|
70
64
|
# Available in GEOS 3.3+.
|
71
65
|
def rounding_precision=(r)
|
72
66
|
r = r.to_i
|
73
|
-
if r > 255
|
74
|
-
raise ArgumentError.new("Rounding precision cannot be greater than 255")
|
75
|
-
end
|
67
|
+
raise ArgumentError, 'Rounding precision cannot be greater than 255' if r > 255
|
76
68
|
|
77
69
|
@rounding_precision = r
|
78
|
-
FFIGeos.GEOSWKTWriter_setRoundingPrecision_r(Geos.current_handle_pointer,
|
70
|
+
FFIGeos.GEOSWKTWriter_setRoundingPrecision_r(Geos.current_handle_pointer, ptr, @rounding_precision)
|
79
71
|
end
|
80
72
|
end
|
81
73
|
|
@@ -83,9 +75,7 @@ module Geos
|
|
83
75
|
# Available in GEOS 3.3+.
|
84
76
|
def old_3d=(val)
|
85
77
|
@old_3d = !!val
|
86
|
-
FFIGeos.GEOSWKTWriter_setOld3D_r(Geos.current_handle_pointer,
|
87
|
-
Geos::Tools.bool_to_int(@old_3d)
|
88
|
-
)
|
78
|
+
FFIGeos.GEOSWKTWriter_setOld3D_r(Geos.current_handle_pointer, ptr, Geos::Tools.bool_to_int(@old_3d))
|
89
79
|
end
|
90
80
|
end
|
91
81
|
|
@@ -93,17 +83,16 @@ module Geos
|
|
93
83
|
# Available in GEOS 3.3+.
|
94
84
|
def output_dimensions=(dim)
|
95
85
|
dim = dim.to_i
|
96
|
-
if dim < 2 || dim > 3
|
97
|
-
|
98
|
-
|
99
|
-
FFIGeos.GEOSWKTWriter_setOutputDimension_r(Geos.current_handle_pointer, self.ptr, dim)
|
86
|
+
raise ArgumentError, 'Output dimensions must be either 2 or 3' if dim < 2 || dim > 3
|
87
|
+
|
88
|
+
FFIGeos.GEOSWKTWriter_setOutputDimension_r(Geos.current_handle_pointer, ptr, dim)
|
100
89
|
end
|
101
90
|
end
|
102
91
|
|
103
92
|
if FFIGeos.respond_to?(:GEOSWKTWriter_getOutputDimension_r)
|
104
93
|
# Available in GEOS 3.3+.
|
105
94
|
def output_dimensions
|
106
|
-
FFIGeos.GEOSWKTWriter_getOutputDimension_r(Geos.current_handle_pointer,
|
95
|
+
FFIGeos.GEOSWKTWriter_getOutputDimension_r(Geos.current_handle_pointer, ptr)
|
107
96
|
end
|
108
97
|
end
|
109
98
|
end
|