ffi-geos 1.2.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|