rgeo 2.4.0 → 3.0.0.pre.rc.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 +1 -0
- data/ext/geos_c_impl/analysis.c +4 -4
- data/ext/geos_c_impl/errors.c +8 -6
- data/ext/geos_c_impl/errors.h +7 -3
- data/ext/geos_c_impl/extconf.rb +2 -0
- data/ext/geos_c_impl/factory.c +80 -7
- data/ext/geos_c_impl/factory.h +28 -14
- data/ext/geos_c_impl/geometry.c +46 -14
- data/ext/geos_c_impl/geometry.h +7 -0
- data/ext/geos_c_impl/geometry_collection.c +2 -104
- data/ext/geos_c_impl/geometry_collection.h +0 -11
- data/ext/geos_c_impl/line_string.c +1 -1
- data/ext/geos_c_impl/point.c +1 -1
- data/ext/geos_c_impl/polygon.c +1 -37
- data/ext/geos_c_impl/preface.h +3 -0
- data/lib/rgeo/cartesian/calculations.rb +54 -17
- data/lib/rgeo/cartesian/factory.rb +0 -7
- data/lib/rgeo/cartesian/feature_classes.rb +66 -46
- data/lib/rgeo/cartesian/feature_methods.rb +51 -20
- data/lib/rgeo/cartesian/interface.rb +0 -6
- data/lib/rgeo/cartesian/planar_graph.rb +379 -0
- data/lib/rgeo/cartesian/sweepline_intersector.rb +149 -0
- data/lib/rgeo/cartesian/valid_op.rb +71 -0
- data/lib/rgeo/cartesian.rb +3 -0
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +6 -6
- data/lib/rgeo/error.rb +15 -0
- data/lib/rgeo/feature/geometry.rb +28 -28
- data/lib/rgeo/feature/geometry_collection.rb +13 -5
- data/lib/rgeo/feature/line_string.rb +3 -3
- data/lib/rgeo/feature/multi_surface.rb +3 -3
- data/lib/rgeo/feature/point.rb +4 -4
- data/lib/rgeo/feature/surface.rb +3 -3
- data/lib/rgeo/geographic/factory.rb +0 -7
- data/lib/rgeo/geographic/interface.rb +5 -20
- data/lib/rgeo/geographic/proj4_projector.rb +0 -2
- data/lib/rgeo/geographic/projected_feature_classes.rb +21 -9
- data/lib/rgeo/geographic/projected_feature_methods.rb +51 -28
- data/lib/rgeo/geographic/simple_mercator_projector.rb +0 -2
- data/lib/rgeo/geographic/spherical_feature_classes.rb +29 -9
- data/lib/rgeo/geographic/spherical_feature_methods.rb +62 -1
- data/lib/rgeo/geos/capi_factory.rb +21 -31
- data/lib/rgeo/geos/capi_feature_classes.rb +35 -11
- data/lib/rgeo/geos/ffi_factory.rb +0 -28
- data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
- data/lib/rgeo/geos/ffi_feature_methods.rb +23 -5
- data/lib/rgeo/geos/interface.rb +0 -7
- data/lib/rgeo/geos/zm_factory.rb +0 -12
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +4 -4
- data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -1
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +15 -19
- data/lib/rgeo/impl_helper/basic_point_methods.rb +1 -1
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +1 -1
- data/lib/rgeo/impl_helper/valid_op.rb +354 -0
- data/lib/rgeo/impl_helper/validity_check.rb +138 -0
- data/lib/rgeo/impl_helper.rb +1 -0
- data/lib/rgeo/version.rb +1 -1
- metadata +31 -10
@@ -20,9 +20,6 @@ module RGeo
|
|
20
20
|
# See RGeo::Geos.factory for a list of supported options.
|
21
21
|
|
22
22
|
def initialize(opts = {})
|
23
|
-
# Main flags
|
24
|
-
@uses_lenient_multi_polygon_assertions = opts[:uses_lenient_assertions] ||
|
25
|
-
opts[:lenient_multi_polygon_assertions] || opts[:uses_lenient_multi_polygon_assertions]
|
26
23
|
@has_z = opts[:has_z_coordinate] ? true : false
|
27
24
|
@has_m = opts[:has_m_coordinate] ? true : false
|
28
25
|
if @has_z && @has_m
|
@@ -145,7 +142,6 @@ module RGeo
|
|
145
142
|
"wkbg" => @wkb_generator.properties,
|
146
143
|
"wktp" => @wkt_parser.properties,
|
147
144
|
"wkbp" => @wkb_parser.properties,
|
148
|
-
"lmpa" => @uses_lenient_multi_polygon_assertions,
|
149
145
|
"apre" => @_auto_prepare
|
150
146
|
}
|
151
147
|
hash["proj4"] = @proj4.marshal_dump if @proj4
|
@@ -174,7 +170,6 @@ module RGeo
|
|
174
170
|
wkb_generator: symbolize_hash(data["wkbg"]),
|
175
171
|
wkt_parser: symbolize_hash(data["wktp"]),
|
176
172
|
wkb_parser: symbolize_hash(data["wkbp"]),
|
177
|
-
uses_lenient_multi_polygon_assertions: data["lmpa"],
|
178
173
|
auto_prepare: (data["apre"] ? :simple : :disabled),
|
179
174
|
proj4: proj4,
|
180
175
|
coord_sys: coord_sys
|
@@ -188,7 +183,6 @@ module RGeo
|
|
188
183
|
coder["has_m_coordinate"] = @has_m
|
189
184
|
coder["srid"] = @srid
|
190
185
|
coder["buffer_resolution"] = @buffer_resolution
|
191
|
-
coder["lenient_multi_polygon_assertions"] = @uses_lenient_multi_polygon_assertions
|
192
186
|
coder["wkt_generator"] = @wkt_generator.properties
|
193
187
|
coder["wkb_generator"] = @wkb_generator.properties
|
194
188
|
coder["wkt_parser"] = @wkt_parser.properties
|
@@ -227,7 +221,6 @@ module RGeo
|
|
227
221
|
wkt_parser: symbolize_hash(coder["wkt_parser"]),
|
228
222
|
wkb_parser: symbolize_hash(coder["wkb_parser"]),
|
229
223
|
auto_prepare: coder["auto_prepare"] == "disabled" ? :disabled : :simple,
|
230
|
-
uses_lenient_multi_polygon_assertions: coder["lenient_multi_polygon_assertions"],
|
231
224
|
proj4: proj4,
|
232
225
|
coord_sys: coord_sys
|
233
226
|
)
|
@@ -242,14 +235,7 @@ module RGeo
|
|
242
235
|
|
243
236
|
attr_reader :buffer_resolution
|
244
237
|
|
245
|
-
# Returns true if this factory is lenient with MultiPolygon assertions
|
246
|
-
|
247
|
-
def lenient_multi_polygon_assertions?
|
248
|
-
@uses_lenient_multi_polygon_assertions
|
249
|
-
end
|
250
|
-
|
251
238
|
# See RGeo::Feature::Factory#property
|
252
|
-
|
253
239
|
def property(name_)
|
254
240
|
case name_
|
255
241
|
when :has_z_coordinate
|
@@ -260,15 +246,12 @@ module RGeo
|
|
260
246
|
true
|
261
247
|
when :buffer_resolution
|
262
248
|
@buffer_resolution
|
263
|
-
when :uses_lenient_multi_polygon_assertions
|
264
|
-
@uses_lenient_multi_polygon_assertions
|
265
249
|
when :auto_prepare
|
266
250
|
@_auto_prepare ? :simple : :disabled
|
267
251
|
end
|
268
252
|
end
|
269
253
|
|
270
254
|
# See RGeo::Feature::Factory#parse_wkt
|
271
|
-
|
272
255
|
def parse_wkt(str)
|
273
256
|
if @wkt_reader
|
274
257
|
wrap_fg_geom(@wkt_reader.read(str), nil)
|
@@ -417,17 +400,6 @@ module RGeo
|
|
417
400
|
raise(RGeo::Error::InvalidGeometry, "Could not cast to polygon: #{elem}") unless elem
|
418
401
|
elem.detach_fg_geom
|
419
402
|
end
|
420
|
-
unless @uses_lenient_multi_polygon_assertions
|
421
|
-
(1...elems.size).each do |i|
|
422
|
-
(0...i).each do |j|
|
423
|
-
igeom = elems[i]
|
424
|
-
jgeom = elems[j]
|
425
|
-
if igeom.relate_pattern(jgeom, "2********") || igeom.relate_pattern(jgeom, "****1****")
|
426
|
-
raise(RGeo::Error::InvalidGeometry, "Invalid relate pattern: #{jgeom}")
|
427
|
-
end
|
428
|
-
end
|
429
|
-
end
|
430
|
-
end
|
431
403
|
klasses = Array.new(elems.size, FFIPolygonImpl)
|
432
404
|
fg_geom = ::Geos::Utils.create_collection(::Geos::GeomTypes::GEOS_MULTIPOLYGON, elems)
|
433
405
|
FFIMultiPolygonImpl.new(self, fg_geom, klasses)
|
@@ -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,6 +6,8 @@
|
|
6
6
|
#
|
7
7
|
# -----------------------------------------------------------------------------
|
8
8
|
|
9
|
+
require "ffi-geos"
|
10
|
+
|
9
11
|
module RGeo
|
10
12
|
module Geos
|
11
13
|
module FFIGeometryMethods # :nodoc:
|
@@ -95,11 +97,9 @@ module RGeo
|
|
95
97
|
end
|
96
98
|
|
97
99
|
def boundary
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
@factory.wrap_fg_geom(@fg_geom.boundary, nil)
|
102
|
-
end
|
100
|
+
@factory.wrap_fg_geom(@fg_geom.boundary, nil)
|
101
|
+
rescue ::Geos::GEOSException
|
102
|
+
raise Error::InvalidGeometry, "Operation not supported by GeometryCollection"
|
103
103
|
end
|
104
104
|
|
105
105
|
def as_text
|
@@ -131,6 +131,24 @@ module RGeo
|
|
131
131
|
simple?
|
132
132
|
end
|
133
133
|
|
134
|
+
def valid?
|
135
|
+
@fg_geom.valid?
|
136
|
+
end
|
137
|
+
|
138
|
+
def invalid_reason
|
139
|
+
# valid_detail gives solely the reason, or nil if valid, which is
|
140
|
+
# what we want.
|
141
|
+
fg_geom.valid_detail&.dig(:detail)&.force_encoding(Encoding::UTF_8)
|
142
|
+
end
|
143
|
+
|
144
|
+
# (see RGeo::ImplHelper::ValidityCheck#make_valid)
|
145
|
+
# Only available since GEOS 3.8+
|
146
|
+
def make_valid
|
147
|
+
@factory.wrap_fg_geom(@fg_geom.make_valid, nil)
|
148
|
+
rescue ::Geos::GEOSException
|
149
|
+
raise Error::UnsupportedOperation
|
150
|
+
end if ::Geos::FFIGeos.respond_to?(:GEOSMakeValid_r)
|
151
|
+
|
134
152
|
def equals?(rhs)
|
135
153
|
return false unless rhs.is_a?(RGeo::Feature::Instance)
|
136
154
|
fg = factory.convert_to_fg_geometry(rhs)
|
data/lib/rgeo/geos/interface.rb
CHANGED
@@ -116,13 +116,6 @@ module RGeo
|
|
116
116
|
# Specifies which native interface to use. Possible values are
|
117
117
|
# <tt>:capi</tt> and <tt>:ffi</tt>. The default is the value
|
118
118
|
# 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
119
|
# [<tt>:buffer_resolution</tt>]
|
127
120
|
# The resolution of buffers around geometries created by this
|
128
121
|
# factory. This controls the number of line segments used to
|
data/lib/rgeo/geos/zm_factory.rb
CHANGED
@@ -53,8 +53,6 @@ module RGeo
|
|
53
53
|
end
|
54
54
|
srid ||= coord_sys.authority_code if coord_sys
|
55
55
|
config = {
|
56
|
-
uses_lenient_multi_polygon_assertions: opts[:lenient_multi_polygon_assertions] ||
|
57
|
-
opts[:uses_lenient_multi_polygon_assertions],
|
58
56
|
buffer_resolution: opts[:buffer_resolution], auto_prepare: opts[:auto_prepare],
|
59
57
|
wkt_generator: opts[:wkt_generator], wkt_parser: opts[:wkt_parser],
|
60
58
|
wkb_generator: opts[:wkb_generator], wkb_parser: opts[:wkb_parser],
|
@@ -109,7 +107,6 @@ module RGeo
|
|
109
107
|
"wkbg" => @wkb_generator.properties,
|
110
108
|
"wktp" => @wkt_parser.properties,
|
111
109
|
"wkbp" => @wkb_parser.properties,
|
112
|
-
"lmpa" => @zfactory.lenient_multi_polygon_assertions?,
|
113
110
|
"apre" => @zfactory.property(:auto_prepare) == :simple,
|
114
111
|
"nffi" => @zfactory.is_a?(FFIFactory)
|
115
112
|
}
|
@@ -142,7 +139,6 @@ module RGeo
|
|
142
139
|
wkb_generator: symbolize_hash(data["wkbg"]),
|
143
140
|
wkt_parser: symbolize_hash(data["wktp"]),
|
144
141
|
wkb_parser: symbolize_hash(data["wkbp"]),
|
145
|
-
uses_lenient_multi_polygon_assertions: data["lmpa"],
|
146
142
|
auto_prepare: (data["apre"] ? :simple : :disabled),
|
147
143
|
proj4: proj4,
|
148
144
|
coord_sys: coord_sys
|
@@ -154,7 +150,6 @@ module RGeo
|
|
154
150
|
def encode_with(coder) # :nodoc:
|
155
151
|
coder["srid"] = @zfactory.srid
|
156
152
|
coder["buffer_resolution"] = @zfactory.buffer_resolution
|
157
|
-
coder["lenient_multi_polygon_assertions"] = @zfactory.lenient_multi_polygon_assertions?
|
158
153
|
coder["wkt_generator"] = @wkt_generator.properties
|
159
154
|
coder["wkb_generator"] = @wkb_generator.properties
|
160
155
|
coder["wkt_parser"] = @wkt_parser.properties
|
@@ -197,7 +192,6 @@ module RGeo
|
|
197
192
|
wkt_parser: symbolize_hash(coder["wkt_parser"]),
|
198
193
|
wkb_parser: symbolize_hash(coder["wkb_parser"]),
|
199
194
|
auto_prepare: coder["auto_prepare"] == "disabled" ? :disabled : :simple,
|
200
|
-
uses_lenient_multi_polygon_assertions: coder["lenient_multi_polygon_assertions"],
|
201
195
|
proj4: proj4,
|
202
196
|
coord_sys: coord_sys
|
203
197
|
)
|
@@ -216,12 +210,6 @@ module RGeo
|
|
216
210
|
@zfactory.buffer_resolution
|
217
211
|
end
|
218
212
|
|
219
|
-
# Returns true if this factory is lenient with MultiPolygon assertions
|
220
|
-
|
221
|
-
def lenient_multi_polygon_assertions?
|
222
|
-
@zfactory.lenient_multi_polygon_assertions?
|
223
|
-
end
|
224
|
-
|
225
213
|
# Returns the z-only factory corresponding to this factory.
|
226
214
|
|
227
215
|
def z_factory
|
@@ -20,7 +20,7 @@ module RGeo
|
|
20
20
|
raise Error::InvalidGeometry, "Could not cast #{elem}" unless elem
|
21
21
|
elem
|
22
22
|
end
|
23
|
-
|
23
|
+
init_geometry
|
24
24
|
end
|
25
25
|
|
26
26
|
def num_geometries
|
@@ -91,7 +91,7 @@ module RGeo
|
|
91
91
|
raise Error::InvalidGeometry, "Could not cast #{elem}" unless elem
|
92
92
|
elem
|
93
93
|
end
|
94
|
-
|
94
|
+
init_geometry
|
95
95
|
end
|
96
96
|
|
97
97
|
def geometry_type
|
@@ -152,7 +152,7 @@ module RGeo
|
|
152
152
|
raise Error::InvalidGeometry, "Could not cast #{elem}" unless elem
|
153
153
|
elem
|
154
154
|
end
|
155
|
-
|
155
|
+
init_geometry
|
156
156
|
end
|
157
157
|
|
158
158
|
def geometry_type
|
@@ -176,7 +176,7 @@ module RGeo
|
|
176
176
|
raise Error::InvalidGeometry, "Could not cast #{elem}" unless elem
|
177
177
|
elem
|
178
178
|
end
|
179
|
-
|
179
|
+
init_geometry
|
180
180
|
end
|
181
181
|
|
182
182
|
def geometry_type
|
@@ -16,7 +16,13 @@ module RGeo
|
|
16
16
|
raise Error::InvalidGeometry, "Could not cast #{elem}" unless elem
|
17
17
|
elem
|
18
18
|
end
|
19
|
-
|
19
|
+
# LineStrings in general need to check that there's not one point
|
20
|
+
# GEOS doesn't allow instantiation of single point LineStrings so
|
21
|
+
# we should handle it.
|
22
|
+
if @points.size == 1
|
23
|
+
raise Error::InvalidGeometry, "LineString Cannot Have 1 Point"
|
24
|
+
end
|
25
|
+
init_geometry
|
20
26
|
end
|
21
27
|
|
22
28
|
def num_points
|
@@ -143,12 +149,6 @@ module RGeo
|
|
143
149
|
super
|
144
150
|
@points = obj.points
|
145
151
|
end
|
146
|
-
|
147
|
-
def validate_geometry
|
148
|
-
if @points.size == 1
|
149
|
-
raise Error::InvalidGeometry, "LineString cannot have 1 point"
|
150
|
-
end
|
151
|
-
end
|
152
152
|
end
|
153
153
|
|
154
154
|
module BasicLineMethods # :nodoc:
|
@@ -161,7 +161,7 @@ module RGeo
|
|
161
161
|
cstop = Feature.cast(stop, factory, Feature::Point)
|
162
162
|
raise Error::InvalidGeometry, "Could not cast end: #{stop}" unless cstop
|
163
163
|
@points = [cstart, cstop]
|
164
|
-
|
164
|
+
init_geometry
|
165
165
|
end
|
166
166
|
|
167
167
|
def geometry_type
|
@@ -171,18 +171,16 @@ module RGeo
|
|
171
171
|
def coordinates
|
172
172
|
@points.map(&:coordinates)
|
173
173
|
end
|
174
|
+
end
|
174
175
|
|
175
|
-
|
176
|
-
|
177
|
-
def validate_geometry
|
176
|
+
module BasicLinearRingMethods # :nodoc:
|
177
|
+
def initialize(factory, points)
|
178
178
|
super
|
179
|
-
|
180
|
-
raise Error::InvalidGeometry, "
|
179
|
+
unless @points.size >= 4 || @points.size == 0
|
180
|
+
raise Error::InvalidGeometry, "LinearRings must have 0 or >= 4 points"
|
181
181
|
end
|
182
182
|
end
|
183
|
-
end
|
184
183
|
|
185
|
-
module BasicLinearRingMethods # :nodoc:
|
186
184
|
def geometry_type
|
187
185
|
Feature::LinearRing
|
188
186
|
end
|
@@ -193,14 +191,12 @@ module RGeo
|
|
193
191
|
|
194
192
|
private
|
195
193
|
|
196
|
-
|
194
|
+
# Close ring if necessary.
|
195
|
+
def init_geometry
|
197
196
|
super
|
198
197
|
if @points.size > 0
|
199
198
|
@points << @points.first if @points.first != @points.last
|
200
199
|
@points = @points.chunk { |x| x }.map(&:first)
|
201
|
-
if !@factory.property(:uses_lenient_assertions) && !ring?
|
202
|
-
raise Error::InvalidGeometry, "LinearRing failed ring test"
|
203
|
-
end
|
204
200
|
end
|
205
201
|
end
|
206
202
|
end
|