rgeo 2.3.1 → 3.0.1
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/.yardopts +6 -0
- data/README.md +23 -14
- data/ext/geos_c_impl/analysis.c +30 -25
- data/ext/geos_c_impl/analysis.h +8 -7
- data/ext/geos_c_impl/coordinates.c +27 -21
- data/ext/geos_c_impl/coordinates.h +5 -2
- data/ext/geos_c_impl/errors.c +19 -10
- data/ext/geos_c_impl/errors.h +11 -4
- data/ext/geos_c_impl/extconf.rb +42 -28
- data/ext/geos_c_impl/factory.c +540 -451
- data/ext/geos_c_impl/factory.h +105 -95
- data/ext/geos_c_impl/geometry.c +593 -387
- data/ext/geos_c_impl/geometry.h +10 -5
- data/ext/geos_c_impl/geometry_collection.c +306 -339
- data/ext/geos_c_impl/geometry_collection.h +6 -20
- data/ext/geos_c_impl/globals.c +169 -0
- data/ext/geos_c_impl/globals.h +46 -0
- data/ext/geos_c_impl/line_string.c +271 -231
- data/ext/geos_c_impl/line_string.h +5 -8
- data/ext/geos_c_impl/main.c +16 -16
- data/ext/geos_c_impl/point.c +65 -67
- data/ext/geos_c_impl/point.h +4 -7
- data/ext/geos_c_impl/polygon.c +137 -135
- data/ext/geos_c_impl/polygon.h +11 -11
- data/ext/geos_c_impl/preface.h +16 -10
- data/ext/geos_c_impl/ruby_more.c +67 -0
- data/ext/geos_c_impl/ruby_more.h +25 -0
- data/lib/rgeo/cartesian/analysis.rb +5 -3
- data/lib/rgeo/cartesian/bounding_box.rb +74 -79
- data/lib/rgeo/cartesian/calculations.rb +64 -33
- data/lib/rgeo/cartesian/factory.rb +57 -102
- data/lib/rgeo/cartesian/feature_classes.rb +68 -46
- data/lib/rgeo/cartesian/feature_methods.rb +67 -25
- data/lib/rgeo/cartesian/interface.rb +6 -41
- data/lib/rgeo/cartesian/planar_graph.rb +373 -0
- data/lib/rgeo/cartesian/sweepline_intersector.rb +147 -0
- data/lib/rgeo/cartesian/valid_op.rb +69 -0
- data/lib/rgeo/cartesian.rb +3 -0
- data/lib/rgeo/coord_sys/cs/entities.rb +303 -99
- data/lib/rgeo/coord_sys/cs/factories.rb +0 -2
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +90 -42
- data/lib/rgeo/coord_sys.rb +1 -20
- data/lib/rgeo/error.rb +15 -0
- data/lib/rgeo/feature/curve.rb +0 -11
- data/lib/rgeo/feature/factory.rb +26 -36
- data/lib/rgeo/feature/factory_generator.rb +6 -14
- data/lib/rgeo/feature/geometry.rb +146 -66
- data/lib/rgeo/feature/geometry_collection.rb +16 -9
- data/lib/rgeo/feature/line_string.rb +4 -5
- data/lib/rgeo/feature/linear_ring.rb +0 -1
- data/lib/rgeo/feature/multi_curve.rb +0 -6
- data/lib/rgeo/feature/multi_surface.rb +3 -4
- data/lib/rgeo/feature/point.rb +4 -5
- data/lib/rgeo/feature/polygon.rb +1 -2
- data/lib/rgeo/feature/surface.rb +3 -4
- data/lib/rgeo/feature/types.rb +69 -85
- data/lib/rgeo/geographic/factory.rb +98 -125
- data/lib/rgeo/geographic/interface.rb +69 -166
- data/lib/rgeo/geographic/projected_feature_classes.rb +21 -9
- data/lib/rgeo/geographic/projected_feature_methods.rb +67 -42
- data/lib/rgeo/geographic/projected_window.rb +36 -22
- data/lib/rgeo/geographic/{proj4_projector.rb → projector.rb} +3 -5
- data/lib/rgeo/geographic/simple_mercator_projector.rb +26 -25
- data/lib/rgeo/geographic/spherical_feature_classes.rb +29 -9
- data/lib/rgeo/geographic/spherical_feature_methods.rb +86 -9
- data/lib/rgeo/geographic/spherical_math.rb +17 -20
- data/lib/rgeo/geographic.rb +1 -1
- data/lib/rgeo/geos/capi_factory.rb +87 -158
- data/lib/rgeo/geos/capi_feature_classes.rb +50 -36
- data/lib/rgeo/geos/ffi_factory.rb +105 -173
- data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
- data/lib/rgeo/geos/ffi_feature_methods.rb +105 -127
- data/lib/rgeo/geos/interface.rb +20 -59
- data/lib/rgeo/geos/utils.rb +5 -5
- data/lib/rgeo/geos/zm_factory.rb +53 -95
- data/lib/rgeo/geos/zm_feature_methods.rb +30 -33
- data/lib/rgeo/geos.rb +8 -8
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +9 -22
- data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -2
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +28 -56
- data/lib/rgeo/impl_helper/basic_point_methods.rb +2 -14
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +17 -26
- data/lib/rgeo/impl_helper/utils.rb +21 -0
- data/lib/rgeo/impl_helper/valid_op.rb +350 -0
- data/lib/rgeo/impl_helper/validity_check.rb +139 -0
- data/lib/rgeo/impl_helper.rb +1 -0
- data/lib/rgeo/version.rb +1 -1
- data/lib/rgeo/wkrep/wkb_generator.rb +73 -63
- data/lib/rgeo/wkrep/wkb_parser.rb +33 -31
- data/lib/rgeo/wkrep/wkt_generator.rb +52 -45
- data/lib/rgeo/wkrep/wkt_parser.rb +48 -35
- data/lib/rgeo.rb +1 -3
- metadata +50 -13
- data/lib/rgeo/coord_sys/srs_database/entry.rb +0 -107
- data/lib/rgeo/coord_sys/srs_database/sr_org.rb +0 -64
- data/lib/rgeo/coord_sys/srs_database/url_reader.rb +0 -65
@@ -6,60 +6,84 @@
|
|
6
6
|
#
|
7
7
|
# -----------------------------------------------------------------------------
|
8
8
|
|
9
|
+
require_relative "../impl_helper/validity_check"
|
10
|
+
|
9
11
|
module RGeo
|
10
12
|
module Geos
|
11
|
-
class FFIGeometryImpl
|
13
|
+
class FFIGeometryImpl
|
14
|
+
include Feature::Geometry
|
15
|
+
include ImplHelper::ValidityCheck
|
12
16
|
include FFIGeometryMethods
|
13
17
|
end
|
14
18
|
|
15
|
-
class FFIPointImpl
|
19
|
+
class FFIPointImpl
|
20
|
+
include Feature::Point
|
21
|
+
include ImplHelper::ValidityCheck
|
16
22
|
include FFIGeometryMethods
|
17
23
|
include FFIPointMethods
|
18
24
|
end
|
19
25
|
|
20
|
-
class FFILineStringImpl
|
26
|
+
class FFILineStringImpl
|
27
|
+
include Feature::LineString
|
28
|
+
include ImplHelper::ValidityCheck
|
21
29
|
include FFIGeometryMethods
|
22
30
|
include FFILineStringMethods
|
23
31
|
end
|
24
32
|
|
25
|
-
class FFILinearRingImpl
|
33
|
+
class FFILinearRingImpl
|
34
|
+
include Feature::LinearRing
|
35
|
+
include ImplHelper::ValidityCheck
|
26
36
|
include FFIGeometryMethods
|
27
37
|
include FFILineStringMethods
|
28
38
|
include FFILinearRingMethods
|
29
39
|
end
|
30
40
|
|
31
|
-
class FFILineImpl
|
41
|
+
class FFILineImpl
|
42
|
+
include Feature::Line
|
43
|
+
include ImplHelper::ValidityCheck
|
32
44
|
include FFIGeometryMethods
|
33
45
|
include FFILineStringMethods
|
34
46
|
include FFILineMethods
|
35
47
|
end
|
36
48
|
|
37
|
-
class FFIPolygonImpl
|
49
|
+
class FFIPolygonImpl
|
50
|
+
include Feature::Polygon
|
51
|
+
include ImplHelper::ValidityCheck
|
38
52
|
include FFIGeometryMethods
|
39
53
|
include FFIPolygonMethods
|
40
54
|
end
|
41
55
|
|
42
|
-
class FFIGeometryCollectionImpl
|
56
|
+
class FFIGeometryCollectionImpl
|
57
|
+
include Feature::GeometryCollection
|
58
|
+
include ImplHelper::ValidityCheck
|
43
59
|
include FFIGeometryMethods
|
44
60
|
include FFIGeometryCollectionMethods
|
45
61
|
end
|
46
62
|
|
47
|
-
class FFIMultiPointImpl
|
63
|
+
class FFIMultiPointImpl
|
64
|
+
include Feature::MultiPoint
|
65
|
+
include ImplHelper::ValidityCheck
|
48
66
|
include FFIGeometryMethods
|
49
67
|
include FFIGeometryCollectionMethods
|
50
68
|
include FFIMultiPointMethods
|
51
69
|
end
|
52
70
|
|
53
|
-
class FFIMultiLineStringImpl
|
71
|
+
class FFIMultiLineStringImpl
|
72
|
+
include Feature::MultiLineString
|
73
|
+
include ImplHelper::ValidityCheck
|
54
74
|
include FFIGeometryMethods
|
55
75
|
include FFIGeometryCollectionMethods
|
56
76
|
include FFIMultiLineStringMethods
|
57
77
|
end
|
58
78
|
|
59
|
-
class FFIMultiPolygonImpl
|
79
|
+
class FFIMultiPolygonImpl
|
80
|
+
include Feature::MultiPolygon
|
81
|
+
include ImplHelper::ValidityCheck
|
60
82
|
include FFIGeometryMethods
|
61
83
|
include FFIGeometryCollectionMethods
|
62
84
|
include FFIMultiPolygonMethods
|
63
85
|
end
|
86
|
+
|
87
|
+
ImplHelper::ValidityCheck.override_classes
|
64
88
|
end
|
65
89
|
end
|
@@ -6,11 +6,15 @@
|
|
6
6
|
#
|
7
7
|
# -----------------------------------------------------------------------------
|
8
8
|
|
9
|
+
require "ffi-geos"
|
10
|
+
|
9
11
|
module RGeo
|
10
12
|
module Geos
|
11
13
|
module FFIGeometryMethods # :nodoc:
|
12
14
|
include Feature::Instance
|
13
15
|
|
16
|
+
attr_reader :factory, :fg_geom, :_klasses
|
17
|
+
|
14
18
|
def initialize(factory, fg_geom, klasses)
|
15
19
|
@factory = factory
|
16
20
|
@fg_geom = fg_geom
|
@@ -54,11 +58,6 @@ module RGeo
|
|
54
58
|
@_klasses = nil
|
55
59
|
end
|
56
60
|
|
57
|
-
attr_reader :factory
|
58
|
-
attr_reader :fg_geom
|
59
|
-
|
60
|
-
attr_reader :_klasses # :nodoc:
|
61
|
-
|
62
61
|
def initialize_copy(orig)
|
63
62
|
@factory = orig.factory
|
64
63
|
@fg_geom = orig.fg_geom.clone
|
@@ -75,6 +74,14 @@ module RGeo
|
|
75
74
|
Utils.ffi_compute_dimension(@fg_geom)
|
76
75
|
end
|
77
76
|
|
77
|
+
def coordinate_dimension
|
78
|
+
factory.coordinate_dimension
|
79
|
+
end
|
80
|
+
|
81
|
+
def spatial_dimension
|
82
|
+
factory.spatial_dimension
|
83
|
+
end
|
84
|
+
|
78
85
|
def geometry_type
|
79
86
|
Feature::Geometry
|
80
87
|
end
|
@@ -84,9 +91,7 @@ module RGeo
|
|
84
91
|
end
|
85
92
|
|
86
93
|
def prepare!
|
87
|
-
if @_fg_prep.is_a?(Integer)
|
88
|
-
@_fg_prep = ::Geos::PreparedGeometry.new(@fg_geom)
|
89
|
-
end
|
94
|
+
@_fg_prep = ::Geos::PreparedGeometry.new(@fg_geom) if @_fg_prep.is_a?(Integer)
|
90
95
|
self
|
91
96
|
end
|
92
97
|
|
@@ -95,11 +100,9 @@ module RGeo
|
|
95
100
|
end
|
96
101
|
|
97
102
|
def boundary
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
@factory.wrap_fg_geom(@fg_geom.boundary, nil)
|
102
|
-
end
|
103
|
+
@factory.wrap_fg_geom(@fg_geom.boundary, nil)
|
104
|
+
rescue ::Geos::GEOSException
|
105
|
+
raise Error::InvalidGeometry, "Operation not supported by GeometryCollection"
|
103
106
|
end
|
104
107
|
|
105
108
|
def as_text
|
@@ -117,28 +120,45 @@ module RGeo
|
|
117
120
|
@fg_geom.empty?
|
118
121
|
end
|
119
122
|
|
120
|
-
def is_empty?
|
121
|
-
warn "The is_empty? method is deprecated, please use the empty? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
122
|
-
empty?
|
123
|
-
end
|
124
|
-
|
125
123
|
def simple?
|
126
124
|
@fg_geom.simple?
|
127
125
|
end
|
128
126
|
|
129
|
-
def
|
130
|
-
|
131
|
-
|
127
|
+
def is_3d?
|
128
|
+
factory.property(:has_z_coordinate)
|
129
|
+
end
|
130
|
+
|
131
|
+
def measured?
|
132
|
+
factory.property(:has_m_coordinate)
|
133
|
+
end
|
134
|
+
|
135
|
+
def valid?
|
136
|
+
@fg_geom.valid?
|
137
|
+
end
|
138
|
+
|
139
|
+
def invalid_reason
|
140
|
+
# valid_detail gives solely the reason, or nil if valid, which is
|
141
|
+
# what we want.
|
142
|
+
fg_geom.valid_detail&.dig(:detail)&.force_encoding(Encoding::UTF_8)
|
143
|
+
end
|
144
|
+
|
145
|
+
# (see RGeo::ImplHelper::ValidityCheck#make_valid)
|
146
|
+
# Only available since GEOS 3.8+
|
147
|
+
if ::Geos::FFIGeos.respond_to?(:GEOSMakeValid_r)
|
148
|
+
def make_valid
|
149
|
+
@factory.wrap_fg_geom(@fg_geom.make_valid, nil)
|
150
|
+
rescue ::Geos::GEOSException
|
151
|
+
raise Error::UnsupportedOperation
|
152
|
+
end
|
132
153
|
end
|
133
154
|
|
134
155
|
def equals?(rhs)
|
135
156
|
return false unless rhs.is_a?(RGeo::Feature::Instance)
|
136
157
|
fg = factory.convert_to_fg_geometry(rhs)
|
137
|
-
|
138
|
-
false
|
158
|
+
|
139
159
|
# GEOS has a bug where empty geometries are not spatially equal
|
140
160
|
# to each other. Work around this case first.
|
141
|
-
|
161
|
+
if fg.empty? && @fg_geom.empty?
|
142
162
|
true
|
143
163
|
else
|
144
164
|
@fg_geom.eql?(fg)
|
@@ -148,83 +168,54 @@ module RGeo
|
|
148
168
|
|
149
169
|
def disjoint?(rhs)
|
150
170
|
fg = factory.convert_to_fg_geometry(rhs)
|
151
|
-
if
|
152
|
-
|
153
|
-
prep ? prep.disjoint?(fg) : @fg_geom.disjoint?(fg)
|
154
|
-
else
|
155
|
-
false
|
156
|
-
end
|
171
|
+
prep = request_prepared if Utils.ffi_supports_prepared_level2
|
172
|
+
prep ? prep.disjoint?(fg) : @fg_geom.disjoint?(fg)
|
157
173
|
end
|
158
174
|
|
159
175
|
def intersects?(rhs)
|
160
176
|
fg = factory.convert_to_fg_geometry(rhs)
|
161
|
-
if
|
162
|
-
|
163
|
-
prep ? prep.intersects?(fg) : @fg_geom.intersects?(fg)
|
164
|
-
else
|
165
|
-
false
|
166
|
-
end
|
177
|
+
prep = request_prepared if Utils.ffi_supports_prepared_level1
|
178
|
+
prep ? prep.intersects?(fg) : @fg_geom.intersects?(fg)
|
167
179
|
end
|
168
180
|
|
169
181
|
def touches?(rhs)
|
170
182
|
fg = factory.convert_to_fg_geometry(rhs)
|
171
|
-
if
|
172
|
-
|
173
|
-
prep ? prep.touches?(fg) : @fg_geom.touches?(fg)
|
174
|
-
else
|
175
|
-
false
|
176
|
-
end
|
183
|
+
prep = request_prepared if Utils.ffi_supports_prepared_level2
|
184
|
+
prep ? prep.touches?(fg) : @fg_geom.touches?(fg)
|
177
185
|
end
|
178
186
|
|
179
187
|
def crosses?(rhs)
|
180
188
|
fg = factory.convert_to_fg_geometry(rhs)
|
181
|
-
if
|
182
|
-
|
183
|
-
prep ? prep.crosses?(fg) : @fg_geom.crosses?(fg)
|
184
|
-
else
|
185
|
-
false
|
186
|
-
end
|
189
|
+
prep = request_prepared if Utils.ffi_supports_prepared_level2
|
190
|
+
prep ? prep.crosses?(fg) : @fg_geom.crosses?(fg)
|
187
191
|
end
|
188
192
|
|
189
193
|
def within?(rhs)
|
190
194
|
fg = factory.convert_to_fg_geometry(rhs)
|
191
|
-
if
|
192
|
-
|
193
|
-
prep ? prep.within?(fg) : @fg_geom.within?(fg)
|
194
|
-
else
|
195
|
-
false
|
196
|
-
end
|
195
|
+
prep = request_prepared if Utils.ffi_supports_prepared_level2
|
196
|
+
prep ? prep.within?(fg) : @fg_geom.within?(fg)
|
197
197
|
end
|
198
198
|
|
199
199
|
def contains?(rhs)
|
200
200
|
fg = factory.convert_to_fg_geometry(rhs)
|
201
|
-
if
|
202
|
-
|
203
|
-
prep ? prep.contains?(fg) : @fg_geom.contains?(fg)
|
204
|
-
else
|
205
|
-
false
|
206
|
-
end
|
201
|
+
prep = request_prepared if Utils.ffi_supports_prepared_level1
|
202
|
+
prep ? prep.contains?(fg) : @fg_geom.contains?(fg)
|
207
203
|
end
|
208
204
|
|
209
205
|
def overlaps?(rhs)
|
210
206
|
fg = factory.convert_to_fg_geometry(rhs)
|
211
|
-
if
|
212
|
-
|
213
|
-
prep ? prep.overlaps?(fg) : @fg_geom.overlaps?(fg)
|
214
|
-
else
|
215
|
-
false
|
216
|
-
end
|
207
|
+
prep = request_prepared if Utils.ffi_supports_prepared_level2
|
208
|
+
prep ? prep.overlaps?(fg) : @fg_geom.overlaps?(fg)
|
217
209
|
end
|
218
210
|
|
219
211
|
def relate?(rhs, pattern)
|
220
212
|
fg = factory.convert_to_fg_geometry(rhs)
|
221
|
-
|
213
|
+
@fg_geom.relate_pattern(fg, pattern)
|
222
214
|
end
|
223
|
-
alias relate relate? # DEPRECATED
|
224
215
|
|
225
216
|
def distance(rhs)
|
226
217
|
fg = factory.convert_to_fg_geometry(rhs)
|
227
|
-
|
218
|
+
@fg_geom.distance(fg)
|
228
219
|
end
|
229
220
|
|
230
221
|
def buffer(distance)
|
@@ -237,14 +228,14 @@ module RGeo
|
|
237
228
|
|
238
229
|
def intersection(rhs)
|
239
230
|
fg = factory.convert_to_fg_geometry(rhs)
|
240
|
-
|
231
|
+
@factory.wrap_fg_geom(@fg_geom.intersection(fg), nil)
|
241
232
|
end
|
242
233
|
|
243
234
|
alias * intersection
|
244
235
|
|
245
236
|
def union(rhs)
|
246
237
|
fg = factory.convert_to_fg_geometry(rhs)
|
247
|
-
|
238
|
+
@factory.wrap_fg_geom(@fg_geom.union(fg), nil)
|
248
239
|
end
|
249
240
|
|
250
241
|
alias + union
|
@@ -256,18 +247,18 @@ module RGeo
|
|
256
247
|
|
257
248
|
def difference(rhs)
|
258
249
|
fg = factory.convert_to_fg_geometry(rhs)
|
259
|
-
|
250
|
+
@factory.wrap_fg_geom(@fg_geom.difference(fg), nil)
|
260
251
|
end
|
261
252
|
|
262
253
|
alias - difference
|
263
254
|
|
264
255
|
def sym_difference(rhs)
|
265
256
|
fg = factory.convert_to_fg_geometry(rhs)
|
266
|
-
|
257
|
+
@factory.wrap_fg_geom(@fg_geom.sym_difference(fg), nil)
|
267
258
|
end
|
268
259
|
|
269
|
-
def eql?(
|
270
|
-
rep_equals?(
|
260
|
+
def eql?(other)
|
261
|
+
rep_equals?(other)
|
271
262
|
end
|
272
263
|
|
273
264
|
def detach_fg_geom
|
@@ -319,7 +310,7 @@ module RGeo
|
|
319
310
|
end
|
320
311
|
|
321
312
|
def rep_equals?(rhs)
|
322
|
-
rhs.
|
313
|
+
rhs.instance_of?(self.class) && rhs.factory.eql?(@factory) &&
|
323
314
|
Utils.ffi_coord_seqs_equal?(rhs.fg_geom.coord_seq, @fg_geom.coord_seq, @factory._has_3d)
|
324
315
|
end
|
325
316
|
|
@@ -348,14 +339,15 @@ module RGeo
|
|
348
339
|
@fg_geom.num_points
|
349
340
|
end
|
350
341
|
|
351
|
-
def point_n(
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
342
|
+
def point_n(idx)
|
343
|
+
return unless idx >= 0 && idx < @fg_geom.num_points
|
344
|
+
|
345
|
+
coord_seq = @fg_geom.coord_seq
|
346
|
+
x = coord_seq.get_x(idx)
|
347
|
+
y = coord_seq.get_y(idx)
|
348
|
+
extra = @factory._has_3d ? [coord_seq.get_z(idx)] : []
|
349
|
+
|
350
|
+
@factory.point(x, y, *extra)
|
359
351
|
end
|
360
352
|
|
361
353
|
def start_point
|
@@ -381,22 +373,12 @@ module RGeo
|
|
381
373
|
@fg_geom.closed?
|
382
374
|
end
|
383
375
|
|
384
|
-
def is_closed?
|
385
|
-
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
386
|
-
closed?
|
387
|
-
end
|
388
|
-
|
389
376
|
def ring?
|
390
377
|
@fg_geom.ring?
|
391
378
|
end
|
392
379
|
|
393
|
-
def is_ring?
|
394
|
-
warn "The is_ring? method is deprecated, please use the ring? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
395
|
-
ring?
|
396
|
-
end
|
397
|
-
|
398
380
|
def rep_equals?(rhs)
|
399
|
-
rhs.
|
381
|
+
rhs.instance_of?(self.class) && rhs.factory.eql?(@factory) &&
|
400
382
|
Utils.ffi_coord_seqs_equal?(rhs.fg_geom.coord_seq, @fg_geom.coord_seq, @factory._has_3d)
|
401
383
|
end
|
402
384
|
|
@@ -450,10 +432,10 @@ module RGeo
|
|
450
432
|
@fg_geom.num_interior_rings
|
451
433
|
end
|
452
434
|
|
453
|
-
def interior_ring_n(
|
454
|
-
|
455
|
-
|
456
|
-
|
435
|
+
def interior_ring_n(idx)
|
436
|
+
return unless idx >= 0 && idx < @fg_geom.num_interior_rings
|
437
|
+
|
438
|
+
@factory.wrap_fg_geom(@fg_geom.interior_ring_n(idx), FFILinearRingImpl)
|
457
439
|
end
|
458
440
|
|
459
441
|
def interior_rings
|
@@ -463,7 +445,7 @@ module RGeo
|
|
463
445
|
end
|
464
446
|
|
465
447
|
def rep_equals?(rhs)
|
466
|
-
if rhs.
|
448
|
+
if rhs.instance_of?(self.class) && rhs.factory.eql?(@factory) &&
|
467
449
|
rhs.exterior_ring.rep_equals?(exterior_ring)
|
468
450
|
sn = @fg_geom.num_interior_rings
|
469
451
|
rn = rhs.num_interior_rings
|
@@ -479,8 +461,10 @@ module RGeo
|
|
479
461
|
|
480
462
|
def hash
|
481
463
|
@hash ||= begin
|
482
|
-
hash = Utils.ffi_coord_seq_hash(
|
483
|
-
|
464
|
+
hash = Utils.ffi_coord_seq_hash(
|
465
|
+
@fg_geom.exterior_ring.coord_seq,
|
466
|
+
[@factory, geometry_type].hash
|
467
|
+
)
|
484
468
|
@fg_geom.interior_rings.inject(hash) do |h, r|
|
485
469
|
Utils.ffi_coord_seq_hash(r.coord_seq, h)
|
486
470
|
end
|
@@ -498,7 +482,7 @@ module RGeo
|
|
498
482
|
end
|
499
483
|
|
500
484
|
def rep_equals?(rhs)
|
501
|
-
if rhs.
|
485
|
+
if rhs.instance_of?(self.class) && rhs.factory.eql?(@factory)
|
502
486
|
size = @fg_geom.num_geometries
|
503
487
|
if size == rhs.num_geometries
|
504
488
|
size.times do |n|
|
@@ -515,35 +499,34 @@ module RGeo
|
|
515
499
|
end
|
516
500
|
alias size num_geometries
|
517
501
|
|
518
|
-
def geometry_n(
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
502
|
+
def geometry_n(idx)
|
503
|
+
return unless idx >= 0 && idx < @fg_geom.num_geometries
|
504
|
+
|
505
|
+
@factory.wrap_fg_geom(
|
506
|
+
@fg_geom.get_geometry_n(idx),
|
507
|
+
@_klasses ? @_klasses[idx] : nil
|
508
|
+
)
|
523
509
|
end
|
524
510
|
|
525
|
-
def [](
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
511
|
+
def [](idx)
|
512
|
+
idx += @fg_geom.num_geometries if idx < 0
|
513
|
+
|
514
|
+
return unless idx >= 0 && idx < @fg_geom.num_geometries
|
515
|
+
|
516
|
+
@factory.wrap_fg_geom(
|
517
|
+
@fg_geom.get_geometry_n(idx),
|
518
|
+
@_klasses ? @_klasses[idx] : nil
|
519
|
+
)
|
531
520
|
end
|
532
521
|
|
533
522
|
def hash
|
534
|
-
@hash ||=
|
535
|
-
hash = [@factory, geometry_type].hash
|
536
|
-
(0...num_geometries).inject(hash) do |h, i|
|
537
|
-
(1_664_525 * h + geometry_n(i).hash).hash
|
538
|
-
end
|
539
|
-
end
|
523
|
+
@hash ||= [@factory, geometry_type, *(0...num_geometries).map { |i| geometry_n(i) }].hash
|
540
524
|
end
|
541
525
|
|
542
526
|
def each
|
543
527
|
if block_given?
|
544
528
|
@fg_geom.num_geometries.times do |n|
|
545
|
-
yield @factory.wrap_fg_geom(@fg_geom.get_geometry_n(n),
|
546
|
-
@_klasses ? @_klasses[n] : nil)
|
529
|
+
yield @factory.wrap_fg_geom(@fg_geom.get_geometry_n(n), @_klasses ? @_klasses[n] : nil)
|
547
530
|
end
|
548
531
|
self
|
549
532
|
else
|
@@ -581,11 +564,6 @@ module RGeo
|
|
581
564
|
true
|
582
565
|
end
|
583
566
|
|
584
|
-
def is_closed?
|
585
|
-
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
586
|
-
closed?
|
587
|
-
end
|
588
|
-
|
589
567
|
def coordinates
|
590
568
|
each.map(&:coordinates)
|
591
569
|
end
|
data/lib/rgeo/geos/interface.rb
CHANGED
@@ -38,11 +38,6 @@ module RGeo
|
|
38
38
|
ZMGeometryMethods === object && CAPIGeometryMethods === object.z_geometry)
|
39
39
|
end
|
40
40
|
|
41
|
-
def is_capi_geos?(object)
|
42
|
-
warn "The is_capi_geos? method is deprecated, please use the capi_geos? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
43
|
-
capi_geos?(object)
|
44
|
-
end
|
45
|
-
|
46
41
|
# Returns true if the given feature is an FFI GEOS feature, or if
|
47
42
|
# the given factory is an FFI GEOS factory.
|
48
43
|
|
@@ -53,11 +48,6 @@ module RGeo
|
|
53
48
|
ZMGeometryMethods === object && FFIGeometryMethods === object.z_geometry)
|
54
49
|
end
|
55
50
|
|
56
|
-
def is_ffi_geos?(object)
|
57
|
-
warn "The is_ffi_geos? method is deprecated, please use the ffi_geos? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
58
|
-
ffi_geos?(object)
|
59
|
-
end
|
60
|
-
|
61
51
|
# Returns true if the given feature is a GEOS feature, or if the given
|
62
52
|
# factory is a GEOS factory. Does not distinguish between CAPI and FFI.
|
63
53
|
|
@@ -67,23 +57,17 @@ module RGeo
|
|
67
57
|
ZMFactory === object || ZMGeometryMethods === object
|
68
58
|
end
|
69
59
|
|
70
|
-
def is_geos?(object)
|
71
|
-
warn "The is_geos? method is deprecated, please use the geos? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
72
|
-
geos?(object)
|
73
|
-
end
|
74
|
-
|
75
60
|
# Returns the GEOS library version as a string of the format "x.y.z".
|
76
61
|
# Returns nil if GEOS is not available.
|
77
62
|
|
78
63
|
def version
|
79
64
|
unless defined?(@version)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
65
|
+
@version =
|
66
|
+
if RGeo::Geos::CAPI_SUPPORTED
|
67
|
+
RGeo::Geos::CAPIFactory._geos_version.freeze
|
68
|
+
elsif RGeo::Geos::FFI_SUPPORTED
|
69
|
+
::Geos::FFIGeos.GEOSversion.sub(/-CAPI-.*$/, "").freeze
|
70
|
+
end
|
87
71
|
end
|
88
72
|
@version
|
89
73
|
end
|
@@ -116,13 +100,6 @@ module RGeo
|
|
116
100
|
# Specifies which native interface to use. Possible values are
|
117
101
|
# <tt>:capi</tt> and <tt>:ffi</tt>. The default is the value
|
118
102
|
# of the preferred_native_interface.
|
119
|
-
# [<tt>:uses_lenient_multi_polygon_assertions</tt>]
|
120
|
-
# If set to true, assertion checking on MultiPolygon is disabled.
|
121
|
-
# This may speed up creation of MultiPolygon objects, at the
|
122
|
-
# expense of not doing the proper checking for OGC MultiPolygon
|
123
|
-
# compliance. See RGeo::Feature::MultiPolygon for details on
|
124
|
-
# the MultiPolygon assertions. Default is false. Also called
|
125
|
-
# <tt>:lenient_multi_polygon_assertions</tt>.
|
126
103
|
# [<tt>:buffer_resolution</tt>]
|
127
104
|
# The resolution of buffers around geometries created by this
|
128
105
|
# factory. This controls the number of line segments used to
|
@@ -134,19 +111,14 @@ module RGeo
|
|
134
111
|
# [<tt>:srid</tt>]
|
135
112
|
# Set the SRID returned by geometries created by this factory.
|
136
113
|
# Default is 0.
|
137
|
-
# [<tt>:proj4</tt>]
|
138
|
-
# The coordinate system in Proj4 format, either as a
|
139
|
-
# CoordSys::Proj4 object or as a string or hash representing the
|
140
|
-
# proj4 format. Optional.
|
141
114
|
# [<tt>:coord_sys</tt>]
|
142
115
|
# The coordinate system in OGC form, either as a subclass of
|
143
116
|
# CoordSys::CS::CoordinateSystem, or as a string in WKT format.
|
144
|
-
# Optional.
|
145
|
-
#
|
146
|
-
#
|
147
|
-
#
|
148
|
-
#
|
149
|
-
# objects from a spatial reference system database.
|
117
|
+
# Optional. If not provided, but <tt>:srid</tt> is, a coord_sys
|
118
|
+
# will be created using the CS::CONFIG.default_coord_sys_class.
|
119
|
+
# [<tt>:coord_sys_class</tt>]
|
120
|
+
# The coordinate system implementation to use if you do not want to
|
121
|
+
# use the CS::CONFIG.default_coord_sys_class. Optional.
|
150
122
|
# [<tt>:has_z_coordinate</tt>]
|
151
123
|
# Support <tt>z_coordinate</tt>. Default is false.
|
152
124
|
# [<tt>:has_m_coordinate</tt>]
|
@@ -190,28 +162,17 @@ module RGeo
|
|
190
162
|
# never automatically generates a prepared geometry (unless you
|
191
163
|
# generate one explicitly using the <tt>prepare!</tt> method).
|
192
164
|
def factory(opts = {})
|
193
|
-
|
194
|
-
native_interface = opts[:native_interface] || Geos.preferred_native_interface
|
195
|
-
if opts[:has_z_coordinate] && opts[:has_m_coordinate]
|
196
|
-
ZMFactory.new(opts)
|
197
|
-
elsif native_interface == :ffi
|
198
|
-
FFIFactory.new(opts)
|
199
|
-
else
|
200
|
-
CAPIFactory.create(opts)
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
165
|
+
return unless supported?
|
204
166
|
|
205
|
-
|
206
|
-
# factories. The given options are used as the default options.
|
207
|
-
#
|
208
|
-
# A common case for this is to provide the <tt>:srs_database</tt>
|
209
|
-
# as a default. Then, the factory generator need only be passed
|
210
|
-
# an SRID and it will automatically fetch the appropriate Proj4
|
211
|
-
# and CoordSys objects.
|
167
|
+
native_interface = opts[:native_interface] || Geos.preferred_native_interface
|
212
168
|
|
213
|
-
|
214
|
-
|
169
|
+
if opts[:has_z_coordinate] && opts[:has_m_coordinate]
|
170
|
+
ZMFactory.new(opts)
|
171
|
+
elsif native_interface == :ffi
|
172
|
+
FFIFactory.new(opts)
|
173
|
+
else
|
174
|
+
CAPIFactory.create(opts)
|
175
|
+
end
|
215
176
|
end
|
216
177
|
end
|
217
178
|
end
|
data/lib/rgeo/geos/utils.rb
CHANGED
@@ -49,17 +49,17 @@ module RGeo
|
|
49
49
|
result
|
50
50
|
end
|
51
51
|
|
52
|
-
def ffi_coord_seq_hash(
|
53
|
-
(0...
|
54
|
-
[hash,
|
52
|
+
def ffi_coord_seq_hash(coord_seq, init_hash = 0)
|
53
|
+
(0...coord_seq.length).inject(init_hash) do |hash, i|
|
54
|
+
[hash, coord_seq.get_x(i), coord_seq.get_y(i), coord_seq.get_z(i)].hash
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
def
|
58
|
+
def ffi_supports_prepared_level1
|
59
59
|
FFI_SUPPORTED && ::Geos::FFIGeos.respond_to?(:GEOSPreparedContains_r)
|
60
60
|
end
|
61
61
|
|
62
|
-
def
|
62
|
+
def ffi_supports_prepared_level2
|
63
63
|
FFI_SUPPORTED && ::Geos::FFIGeos.respond_to?(:GEOSPreparedDisjoint_r)
|
64
64
|
end
|
65
65
|
|