rgeo 2.1.0 → 2.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +160 -0
- data/ext/geos_c_impl/analysis.c +78 -0
- data/ext/geos_c_impl/analysis.h +42 -0
- data/ext/geos_c_impl/errors.c +35 -0
- data/ext/geos_c_impl/errors.h +22 -0
- data/ext/geos_c_impl/extconf.rb +1 -0
- data/ext/geos_c_impl/factory.c +15 -7
- data/ext/geos_c_impl/factory.h +5 -1
- data/ext/geos_c_impl/geometry.c +9 -8
- data/ext/geos_c_impl/geometry_collection.c +1 -1
- data/ext/geos_c_impl/line_string.c +2 -2
- data/ext/geos_c_impl/main.c +5 -2
- data/ext/geos_c_impl/preface.h +3 -0
- data/lib/rgeo/cartesian/analysis.rb +22 -0
- data/lib/rgeo/cartesian/feature_methods.rb +6 -1
- data/lib/rgeo/cartesian.rb +7 -7
- data/lib/rgeo/coord_sys.rb +6 -6
- data/lib/rgeo/error.rb +4 -0
- data/lib/rgeo/feature/curve.rb +12 -2
- data/lib/rgeo/feature/geometry.rb +12 -2
- data/lib/rgeo/feature/linear_ring.rb +10 -0
- data/lib/rgeo/feature/multi_curve.rb +6 -1
- data/lib/rgeo/feature.rb +17 -17
- data/lib/rgeo/geographic/interface.rb +2 -1
- data/lib/rgeo/geographic/projected_feature_methods.rb +12 -2
- data/lib/rgeo/geographic/spherical_feature_classes.rb +1 -0
- data/lib/rgeo/geographic/spherical_feature_methods.rb +29 -1
- data/lib/rgeo/geographic.rb +10 -10
- data/lib/rgeo/geos/capi_factory.rb +5 -1
- data/lib/rgeo/geos/capi_feature_classes.rb +33 -0
- data/lib/rgeo/geos/ffi_feature_methods.rb +34 -5
- data/lib/rgeo/geos/interface.rb +18 -4
- data/lib/rgeo/geos/zm_feature_methods.rb +30 -5
- data/lib/rgeo/geos.rb +11 -11
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +33 -5
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +62 -8
- data/lib/rgeo/impl_helper/basic_point_methods.rb +12 -2
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +45 -3
- data/lib/rgeo/impl_helper.rb +7 -7
- data/lib/rgeo/version.rb +1 -1
- data/lib/rgeo/wkrep/wkb_generator.rb +1 -1
- data/lib/rgeo/wkrep/wkt_generator.rb +6 -6
- data/lib/rgeo/wkrep.rb +4 -4
- data/lib/rgeo.rb +9 -9
- metadata +21 -11
data/lib/rgeo/feature/curve.rb
CHANGED
@@ -90,8 +90,13 @@ module RGeo
|
|
90
90
|
# Returns a boolean value. Note that this is different from the SFS
|
91
91
|
# specification, which stipulates an integer return value.
|
92
92
|
|
93
|
+
def closed?
|
94
|
+
raise Error::UnsupportedOperation, "Method Curve#closed? not defined."
|
95
|
+
end
|
96
|
+
|
93
97
|
def is_closed?
|
94
|
-
|
98
|
+
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
99
|
+
closed?
|
95
100
|
end
|
96
101
|
|
97
102
|
# === SFS 1.1 Description
|
@@ -105,8 +110,13 @@ module RGeo
|
|
105
110
|
# Returns a boolean value. Note that this is different from the SFS
|
106
111
|
# specification, which stipulates an integer return value.
|
107
112
|
|
113
|
+
def ring?
|
114
|
+
raise Error::UnsupportedOperation, "Method Curve#ring? not defined."
|
115
|
+
end
|
116
|
+
|
108
117
|
def is_ring?
|
109
|
-
|
118
|
+
warn "The is_ring? method is deprecated, please use the ring? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
119
|
+
ring?
|
110
120
|
end
|
111
121
|
end
|
112
122
|
end
|
@@ -191,8 +191,13 @@ module RGeo
|
|
191
191
|
# Returns a boolean value. Note that this is different from the SFS
|
192
192
|
# specification, which stipulates an integer return value.
|
193
193
|
|
194
|
+
def empty?
|
195
|
+
raise Error::UnsupportedOperation, "Method Geometry#empty? not defined."
|
196
|
+
end
|
197
|
+
|
194
198
|
def is_empty?
|
195
|
-
|
199
|
+
warn "The is_empty? method is deprecated, please use the empty? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
200
|
+
empty?
|
196
201
|
end
|
197
202
|
|
198
203
|
# === SFS 1.1 Description
|
@@ -208,8 +213,13 @@ module RGeo
|
|
208
213
|
# Returns a boolean value. Note that this is different from the SFS
|
209
214
|
# specification, which stipulates an integer return value.
|
210
215
|
|
216
|
+
def simple?
|
217
|
+
raise Error::UnsupportedOperation, "Method Geometry#simple? not defined."
|
218
|
+
end
|
219
|
+
|
211
220
|
def is_simple?
|
212
|
-
|
221
|
+
warn "The is_simple? method is deprecated, please use the simple? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
222
|
+
simple?
|
213
223
|
end
|
214
224
|
|
215
225
|
# === SFS 1.1 Description
|
@@ -23,6 +23,16 @@ module RGeo
|
|
23
23
|
module LinearRing
|
24
24
|
include LineString
|
25
25
|
extend Type
|
26
|
+
|
27
|
+
# Returns +true+ if the ring is oriented in a counter clockwise direction
|
28
|
+
# otherwise returns +false+.
|
29
|
+
#
|
30
|
+
# == Notes
|
31
|
+
#
|
32
|
+
# Not a standard SFS method for linear rings, but added for convenience.
|
33
|
+
def ccw?
|
34
|
+
raise Error::UnsupportedOperation, "Method LinearRing#ccw? not defined."
|
35
|
+
end
|
26
36
|
end
|
27
37
|
end
|
28
38
|
end
|
@@ -65,8 +65,13 @@ module RGeo
|
|
65
65
|
# Returns a boolean value. Note that this is different from the SFS
|
66
66
|
# specification, which stipulates an integer return value.
|
67
67
|
|
68
|
+
def closed?
|
69
|
+
raise Error::UnsupportedOperation, "Method MultiCurve#closed? not defined."
|
70
|
+
end
|
71
|
+
|
68
72
|
def is_closed?
|
69
|
-
|
73
|
+
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
74
|
+
closed?
|
70
75
|
end
|
71
76
|
end
|
72
77
|
end
|
data/lib/rgeo/feature.rb
CHANGED
@@ -24,20 +24,20 @@
|
|
24
24
|
# itself. The implementation should separately document any such
|
25
25
|
# extensions that it may provide.
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
27
|
+
require_relative "feature/factory"
|
28
|
+
require_relative "feature/types"
|
29
|
+
require_relative "feature/geometry"
|
30
|
+
require_relative "feature/point"
|
31
|
+
require_relative "feature/curve"
|
32
|
+
require_relative "feature/line_string"
|
33
|
+
require_relative "feature/linear_ring"
|
34
|
+
require_relative "feature/line"
|
35
|
+
require_relative "feature/surface"
|
36
|
+
require_relative "feature/polygon"
|
37
|
+
require_relative "feature/geometry_collection"
|
38
|
+
require_relative "feature/multi_point"
|
39
|
+
require_relative "feature/multi_curve"
|
40
|
+
require_relative "feature/multi_line_string"
|
41
|
+
require_relative "feature/multi_surface"
|
42
|
+
require_relative "feature/multi_polygon"
|
43
|
+
require_relative "feature/factory_generator"
|
@@ -222,7 +222,8 @@ module RGeo
|
|
222
222
|
wkt_generator: opts[:wkt_generator],
|
223
223
|
wkb_generator: opts[:wkb_generator],
|
224
224
|
has_z_coordinate: opts[:has_z_coordinate],
|
225
|
-
has_m_coordinate: opts[:has_m_coordinate]
|
225
|
+
has_m_coordinate: opts[:has_m_coordinate],
|
226
|
+
uses_lenient_assertions: opts[:uses_lenient_assertions])
|
226
227
|
projector = Geographic::SimpleMercatorProjector.new(factory,
|
227
228
|
buffer_resolution: opts[:buffer_resolution],
|
228
229
|
lenient_multi_polygon_assertions: opts[:lenient_multi_polygon_assertions],
|
@@ -22,12 +22,22 @@ module RGeo
|
|
22
22
|
factory.unproject(projection.envelope)
|
23
23
|
end
|
24
24
|
|
25
|
+
def empty?
|
26
|
+
projection.empty?
|
27
|
+
end
|
28
|
+
|
25
29
|
def is_empty?
|
26
|
-
|
30
|
+
warn "The is_empty? method is deprecated, please use the empty? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
31
|
+
empty?
|
32
|
+
end
|
33
|
+
|
34
|
+
def simple?
|
35
|
+
projection.simple?
|
27
36
|
end
|
28
37
|
|
29
38
|
def is_simple?
|
30
|
-
|
39
|
+
warn "The is_simple? method is deprecated, please use the simple? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
40
|
+
simple?
|
31
41
|
end
|
32
42
|
|
33
43
|
def boundary
|
@@ -97,7 +97,7 @@ module RGeo
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
def
|
100
|
+
def simple?
|
101
101
|
len = arcs.length
|
102
102
|
return false if arcs.any?(&:degenerate?)
|
103
103
|
return true if len == 1
|
@@ -120,6 +120,11 @@ module RGeo
|
|
120
120
|
true
|
121
121
|
end
|
122
122
|
|
123
|
+
def is_simple?
|
124
|
+
warn "The is_simple? method is deprecated, please use the simple? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
125
|
+
simple?
|
126
|
+
end
|
127
|
+
|
123
128
|
def length
|
124
129
|
arcs.inject(0.0) { |sum, arc| sum + arc.length } * SphericalMath::RADIUS
|
125
130
|
end
|
@@ -130,5 +135,28 @@ module RGeo
|
|
130
135
|
inject(0.0) { |sum, geom| sum + geom.length }
|
131
136
|
end
|
132
137
|
end
|
138
|
+
|
139
|
+
module SphericalPolygonMethods # :nodoc:
|
140
|
+
def centroid
|
141
|
+
return super unless num_interior_rings == 0
|
142
|
+
|
143
|
+
centroid_lat = 0.0
|
144
|
+
centroid_lng = 0.0
|
145
|
+
signed_area = 0.0
|
146
|
+
|
147
|
+
exterior_ring.points.each_cons(2) do |p0, p1|
|
148
|
+
area = (p0.x * p1.y) - (p1.x * p0.y)
|
149
|
+
signed_area += area
|
150
|
+
centroid_lat += (p0.x + p1.x) * area
|
151
|
+
centroid_lng += (p0.y + p1.y) * area
|
152
|
+
end
|
153
|
+
|
154
|
+
signed_area *= 0.5
|
155
|
+
centroid_lat /= (6.0 * signed_area)
|
156
|
+
centroid_lng /= (6.0 * signed_area)
|
157
|
+
|
158
|
+
RGeo::Geographic.spherical_factory.point(centroid_lat, centroid_lng)
|
159
|
+
end
|
160
|
+
end
|
133
161
|
end
|
134
162
|
end
|
data/lib/rgeo/geographic.rb
CHANGED
@@ -18,13 +18,13 @@
|
|
18
18
|
# See the various class methods of Geographic for more information on
|
19
19
|
# the behaviors of the factories they generate.
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
require_relative "geographic/factory"
|
22
|
+
require_relative "geographic/projected_window"
|
23
|
+
require_relative "geographic/interface"
|
24
|
+
require_relative "geographic/spherical_math"
|
25
|
+
require_relative "geographic/spherical_feature_methods"
|
26
|
+
require_relative "geographic/spherical_feature_classes"
|
27
|
+
require_relative "geographic/proj4_projector"
|
28
|
+
require_relative "geographic/simple_mercator_projector"
|
29
|
+
require_relative "geographic/projected_feature_methods"
|
30
|
+
require_relative "geographic/projected_feature_classes"
|
@@ -297,7 +297,11 @@ module RGeo
|
|
297
297
|
if (wkb_parser_ = _wkb_parser)
|
298
298
|
wkb_parser_.parse(str_)
|
299
299
|
else
|
300
|
-
|
300
|
+
if str_[0] == "\x00" || str_[0] == "\x01"
|
301
|
+
_parse_wkb_impl(str_)
|
302
|
+
else
|
303
|
+
_parse_wkb_impl([str_].pack('H*'))
|
304
|
+
end
|
301
305
|
end
|
302
306
|
end
|
303
307
|
|
@@ -11,6 +11,16 @@ module RGeo
|
|
11
11
|
module CAPIGeometryMethods # :nodoc:
|
12
12
|
include Feature::Instance
|
13
13
|
|
14
|
+
def is_empty? # rubocop:disable Naming/PredicateName
|
15
|
+
warn "The is_empty? method is deprecated, please use the empty? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
16
|
+
empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_simple? # rubocop:disable Naming/PredicateName
|
20
|
+
warn "The is_simple? method is deprecated, please use the simple? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
21
|
+
simple?
|
22
|
+
end
|
23
|
+
|
14
24
|
def inspect
|
15
25
|
"#<#{self.class}:0x#{object_id.to_s(16)} #{as_text.inspect}>"
|
16
26
|
end
|
@@ -50,6 +60,25 @@ module RGeo
|
|
50
60
|
alias to_s as_text
|
51
61
|
end
|
52
62
|
|
63
|
+
module CAPIMultiLineStringMethods # :nodoc:
|
64
|
+
def is_closed? # rubocop:disable Naming/PredicateName
|
65
|
+
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
66
|
+
closed?
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
module CAPILineStringMethods # :nodoc:
|
71
|
+
def is_closed? # rubocop:disable Naming/PredicateName
|
72
|
+
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
73
|
+
closed?
|
74
|
+
end
|
75
|
+
|
76
|
+
def is_ring? # rubocop:disable Naming/PredicateName
|
77
|
+
warn "The is_ring? method is deprecated, please use the ring? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
78
|
+
ring?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
53
82
|
module CAPIGeometryCollectionMethods # :nodoc:
|
54
83
|
include Enumerable
|
55
84
|
end
|
@@ -72,6 +101,10 @@ module RGeo
|
|
72
101
|
include CAPIGeometryMethods
|
73
102
|
include CAPILineStringMethods
|
74
103
|
include CAPILinearRingMethods
|
104
|
+
|
105
|
+
def ccw?
|
106
|
+
RGeo::Cartesian::Analysis.ccw?(self)
|
107
|
+
end
|
75
108
|
end
|
76
109
|
|
77
110
|
class CAPILineImpl # :nodoc:
|
@@ -113,14 +113,24 @@ module RGeo
|
|
113
113
|
@factory.generate_wkb(self)
|
114
114
|
end
|
115
115
|
|
116
|
-
def
|
116
|
+
def empty?
|
117
117
|
@fg_geom.empty?
|
118
118
|
end
|
119
119
|
|
120
|
-
def
|
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
|
+
def simple?
|
121
126
|
@fg_geom.simple?
|
122
127
|
end
|
123
128
|
|
129
|
+
def is_simple?
|
130
|
+
warn "The is_simple? method is deprecated, please use the simple? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
131
|
+
simple?
|
132
|
+
end
|
133
|
+
|
124
134
|
def equals?(rhs)
|
125
135
|
return false unless rhs.is_a?(RGeo::Feature::Instance)
|
126
136
|
fg = factory.convert_to_fg_geometry(rhs)
|
@@ -367,14 +377,24 @@ module RGeo
|
|
367
377
|
end
|
368
378
|
end
|
369
379
|
|
370
|
-
def
|
380
|
+
def closed?
|
371
381
|
@fg_geom.closed?
|
372
382
|
end
|
373
383
|
|
374
|
-
def
|
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
|
+
def ring?
|
375
390
|
@fg_geom.ring?
|
376
391
|
end
|
377
392
|
|
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
|
+
|
378
398
|
def rep_equals?(rhs)
|
379
399
|
rhs.class == self.class && rhs.factory.eql?(@factory) &&
|
380
400
|
Utils.ffi_coord_seqs_equal?(rhs.fg_geom.coord_seq, @fg_geom.coord_seq, @factory._has_3d)
|
@@ -393,6 +413,10 @@ module RGeo
|
|
393
413
|
def geometry_type
|
394
414
|
Feature::LinearRing
|
395
415
|
end
|
416
|
+
|
417
|
+
def ccw?
|
418
|
+
RGeo::Cartesian::Analysis.ccw?(self)
|
419
|
+
end
|
396
420
|
end
|
397
421
|
|
398
422
|
module FFILineMethods # :nodoc:
|
@@ -549,7 +573,7 @@ module RGeo
|
|
549
573
|
@fg_geom.length
|
550
574
|
end
|
551
575
|
|
552
|
-
def
|
576
|
+
def closed?
|
553
577
|
size = num_geometries
|
554
578
|
size.times do |n|
|
555
579
|
return false unless @fg_geom.get_geometry_n(n).closed?
|
@@ -557,6 +581,11 @@ module RGeo
|
|
557
581
|
true
|
558
582
|
end
|
559
583
|
|
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
|
+
|
560
589
|
def coordinates
|
561
590
|
each.map(&:coordinates)
|
562
591
|
end
|
data/lib/rgeo/geos/interface.rb
CHANGED
@@ -31,32 +31,47 @@ module RGeo
|
|
31
31
|
# Returns true if the given feature is a CAPI GEOS feature, or if
|
32
32
|
# the given factory is a CAPI GEOS factory.
|
33
33
|
|
34
|
-
def
|
34
|
+
def capi_geos?(object)
|
35
35
|
CAPI_SUPPORTED &&
|
36
36
|
(CAPIFactory === object || CAPIGeometryMethods === object ||
|
37
37
|
ZMFactory === object && CAPIFactory === object.z_factory ||
|
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
|
+
|
41
46
|
# Returns true if the given feature is an FFI GEOS feature, or if
|
42
47
|
# the given factory is an FFI GEOS factory.
|
43
48
|
|
44
|
-
def
|
49
|
+
def ffi_geos?(object)
|
45
50
|
FFI_SUPPORTED &&
|
46
51
|
(FFIFactory === object || FFIGeometryMethods === object ||
|
47
52
|
ZMFactory === object && FFIFactory === object.z_factory ||
|
48
53
|
ZMGeometryMethods === object && FFIGeometryMethods === object.z_geometry)
|
49
54
|
end
|
50
55
|
|
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
|
+
|
51
61
|
# Returns true if the given feature is a GEOS feature, or if the given
|
52
62
|
# factory is a GEOS factory. Does not distinguish between CAPI and FFI.
|
53
63
|
|
54
|
-
def
|
64
|
+
def geos?(object)
|
55
65
|
CAPI_SUPPORTED && (CAPIFactory === object || CAPIGeometryMethods === object) ||
|
56
66
|
FFI_SUPPORTED && (FFIFactory === object || FFIGeometryMethods === object) ||
|
57
67
|
ZMFactory === object || ZMGeometryMethods === object
|
58
68
|
end
|
59
69
|
|
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
|
+
|
60
75
|
# Returns the GEOS library version as a string of the format "x.y.z".
|
61
76
|
# Returns nil if GEOS is not available.
|
62
77
|
|
@@ -174,7 +189,6 @@ module RGeo
|
|
174
189
|
# operation that would benefit from it is called. The latter
|
175
190
|
# never automatically generates a prepared geometry (unless you
|
176
191
|
# generate one explicitly using the <tt>prepare!</tt> method).
|
177
|
-
|
178
192
|
def factory(opts = {})
|
179
193
|
if supported?
|
180
194
|
native_interface = opts[:native_interface] || Geos.preferred_native_interface
|
@@ -65,12 +65,22 @@ module RGeo
|
|
65
65
|
@factory.instance_variable_get(:@wkb_generator).generate(self)
|
66
66
|
end
|
67
67
|
|
68
|
+
def empty?
|
69
|
+
@zgeometry.empty?
|
70
|
+
end
|
71
|
+
|
68
72
|
def is_empty?
|
69
|
-
|
73
|
+
warn "The is_empty? method is deprecated, please use the empty? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
74
|
+
empty?
|
75
|
+
end
|
76
|
+
|
77
|
+
def simple?
|
78
|
+
@zgeometry.simple?
|
70
79
|
end
|
71
80
|
|
72
81
|
def is_simple?
|
73
|
-
|
82
|
+
warn "The is_simple? method is deprecated, please use the simple? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
83
|
+
simple?
|
74
84
|
end
|
75
85
|
|
76
86
|
def boundary
|
@@ -222,12 +232,22 @@ module RGeo
|
|
222
232
|
point_n(num_points - 1)
|
223
233
|
end
|
224
234
|
|
235
|
+
def closed?
|
236
|
+
@zgeometry.closed?
|
237
|
+
end
|
238
|
+
|
225
239
|
def is_closed?
|
226
|
-
|
240
|
+
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
241
|
+
closed?
|
242
|
+
end
|
243
|
+
|
244
|
+
def ring?
|
245
|
+
@zgeometry.ring?
|
227
246
|
end
|
228
247
|
|
229
248
|
def is_ring?
|
230
|
-
|
249
|
+
warn "The is_ring? method is deprecated, please use the ring? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
250
|
+
ring?
|
231
251
|
end
|
232
252
|
|
233
253
|
def num_points
|
@@ -323,8 +343,13 @@ module RGeo
|
|
323
343
|
@zgeometry.length
|
324
344
|
end
|
325
345
|
|
346
|
+
def closed?
|
347
|
+
@zgeometry.closed?
|
348
|
+
end
|
349
|
+
|
326
350
|
def is_closed?
|
327
|
-
|
351
|
+
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
352
|
+
closed?
|
328
353
|
end
|
329
354
|
|
330
355
|
def coordinates
|
data/lib/rgeo/geos.rb
CHANGED
@@ -21,24 +21,24 @@
|
|
21
21
|
|
22
22
|
module RGeo
|
23
23
|
module Geos
|
24
|
-
|
25
|
-
|
24
|
+
require_relative "geos/utils"
|
25
|
+
require_relative "geos/interface"
|
26
26
|
begin
|
27
|
-
|
27
|
+
require_relative "geos/geos_c_impl"
|
28
28
|
rescue LoadError
|
29
29
|
# continue
|
30
30
|
end
|
31
31
|
CAPI_SUPPORTED = RGeo::Geos.const_defined?(:CAPIGeometryMethods)
|
32
32
|
if CAPI_SUPPORTED
|
33
|
-
|
34
|
-
|
33
|
+
require_relative "geos/capi_feature_classes"
|
34
|
+
require_relative "geos/capi_factory"
|
35
35
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
36
|
+
require_relative "geos/ffi_feature_methods"
|
37
|
+
require_relative "geos/ffi_feature_classes"
|
38
|
+
require_relative "geos/ffi_factory"
|
39
|
+
require_relative "geos/zm_feature_methods"
|
40
|
+
require_relative "geos/zm_feature_classes"
|
41
|
+
require_relative "geos/zm_factory"
|
42
42
|
|
43
43
|
# Determine ffi support.
|
44
44
|
begin
|
@@ -9,6 +9,8 @@
|
|
9
9
|
module RGeo
|
10
10
|
module ImplHelper # :nodoc:
|
11
11
|
module BasicGeometryCollectionMethods # :nodoc:
|
12
|
+
include Enumerable
|
13
|
+
|
12
14
|
attr_reader :elements
|
13
15
|
|
14
16
|
def initialize(factory, elements)
|
@@ -37,6 +39,10 @@ module RGeo
|
|
37
39
|
@elements.each(&block)
|
38
40
|
end
|
39
41
|
|
42
|
+
def geometries
|
43
|
+
@elements
|
44
|
+
end
|
45
|
+
|
40
46
|
def dimension
|
41
47
|
@dimension ||= @elements.map(&:dimension).max || -1
|
42
48
|
end
|
@@ -45,10 +51,15 @@ module RGeo
|
|
45
51
|
Feature::GeometryCollection
|
46
52
|
end
|
47
53
|
|
48
|
-
def
|
54
|
+
def empty?
|
49
55
|
@elements.size == 0
|
50
56
|
end
|
51
57
|
|
58
|
+
def is_empty?
|
59
|
+
warn "The is_empty? method is deprecated, please use the empty? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
60
|
+
empty?
|
61
|
+
end
|
62
|
+
|
52
63
|
def rep_equals?(rhs)
|
53
64
|
if rhs.is_a?(self.class) && rhs.factory.eql?(@factory) && @elements.size == rhs.num_geometries
|
54
65
|
rhs.each_with_index { |p, i| return false unless @elements[i].rep_equals?(p) }
|
@@ -87,8 +98,13 @@ module RGeo
|
|
87
98
|
Feature::MultiLineString
|
88
99
|
end
|
89
100
|
|
101
|
+
def closed?
|
102
|
+
all?(&:closed?)
|
103
|
+
end
|
104
|
+
|
90
105
|
def is_closed?
|
91
|
-
|
106
|
+
warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
|
107
|
+
closed?
|
92
108
|
end
|
93
109
|
|
94
110
|
def length
|
@@ -98,7 +114,7 @@ module RGeo
|
|
98
114
|
def boundary
|
99
115
|
hash = {}
|
100
116
|
@elements.each do |line|
|
101
|
-
if !line.
|
117
|
+
if !line.empty? && !line.closed?
|
102
118
|
add_boundary(hash, line.start_point)
|
103
119
|
add_boundary(hash, line.end_point)
|
104
120
|
end
|
@@ -114,6 +130,12 @@ module RGeo
|
|
114
130
|
@elements.map(&:coordinates)
|
115
131
|
end
|
116
132
|
|
133
|
+
def contains?(rhs)
|
134
|
+
return super unless Feature::Point === rhs
|
135
|
+
|
136
|
+
@elements.any? { |line| line.contains?(rhs) }
|
137
|
+
end
|
138
|
+
|
117
139
|
private
|
118
140
|
|
119
141
|
def add_boundary(hash, point)
|
@@ -168,15 +190,21 @@ module RGeo
|
|
168
190
|
def boundary
|
169
191
|
array = []
|
170
192
|
@elements.each do |poly|
|
171
|
-
array << poly.exterior_ring unless poly.
|
193
|
+
array << poly.exterior_ring unless poly.empty?
|
172
194
|
array.concat(poly.interior_rings)
|
173
195
|
end
|
174
|
-
factory.
|
196
|
+
factory.multi_line_string(array)
|
175
197
|
end
|
176
198
|
|
177
199
|
def coordinates
|
178
200
|
@elements.map(&:coordinates)
|
179
201
|
end
|
202
|
+
|
203
|
+
def contains?(rhs)
|
204
|
+
return super unless Feature::Point === rhs
|
205
|
+
|
206
|
+
@elements.any? { |poly| poly.contains?(rhs) }
|
207
|
+
end
|
180
208
|
end
|
181
209
|
end
|
182
210
|
end
|