rgeo 2.3.0 → 3.0.0.pre.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -0
  3. data/README.md +1 -0
  4. data/ext/geos_c_impl/analysis.c +8 -6
  5. data/ext/geos_c_impl/analysis.h +1 -3
  6. data/ext/geos_c_impl/errors.c +10 -8
  7. data/ext/geos_c_impl/errors.h +7 -3
  8. data/ext/geos_c_impl/extconf.rb +3 -0
  9. data/ext/geos_c_impl/factory.c +251 -182
  10. data/ext/geos_c_impl/factory.h +43 -62
  11. data/ext/geos_c_impl/geometry.c +56 -24
  12. data/ext/geos_c_impl/geometry.h +8 -3
  13. data/ext/geos_c_impl/geometry_collection.c +41 -148
  14. data/ext/geos_c_impl/geometry_collection.h +1 -14
  15. data/ext/geos_c_impl/globals.c +91 -0
  16. data/ext/geos_c_impl/globals.h +45 -0
  17. data/ext/geos_c_impl/line_string.c +28 -29
  18. data/ext/geos_c_impl/line_string.h +1 -3
  19. data/ext/geos_c_impl/main.c +10 -9
  20. data/ext/geos_c_impl/point.c +9 -8
  21. data/ext/geos_c_impl/point.h +1 -3
  22. data/ext/geos_c_impl/polygon.c +15 -51
  23. data/ext/geos_c_impl/polygon.h +1 -3
  24. data/ext/geos_c_impl/preface.h +8 -0
  25. data/lib/rgeo/cartesian/analysis.rb +2 -2
  26. data/lib/rgeo/cartesian/calculations.rb +54 -17
  27. data/lib/rgeo/cartesian/factory.rb +0 -7
  28. data/lib/rgeo/cartesian/feature_classes.rb +66 -46
  29. data/lib/rgeo/cartesian/feature_methods.rb +56 -20
  30. data/lib/rgeo/cartesian/interface.rb +0 -6
  31. data/lib/rgeo/cartesian/planar_graph.rb +379 -0
  32. data/lib/rgeo/cartesian/sweepline_intersector.rb +149 -0
  33. data/lib/rgeo/cartesian/valid_op.rb +71 -0
  34. data/lib/rgeo/cartesian.rb +3 -0
  35. data/lib/rgeo/coord_sys/cs/wkt_parser.rb +6 -6
  36. data/lib/rgeo/error.rb +15 -0
  37. data/lib/rgeo/feature/curve.rb +12 -2
  38. data/lib/rgeo/feature/geometry.rb +38 -28
  39. data/lib/rgeo/feature/geometry_collection.rb +13 -5
  40. data/lib/rgeo/feature/line_string.rb +3 -3
  41. data/lib/rgeo/feature/multi_curve.rb +6 -1
  42. data/lib/rgeo/feature/multi_surface.rb +3 -3
  43. data/lib/rgeo/feature/point.rb +4 -4
  44. data/lib/rgeo/feature/surface.rb +3 -3
  45. data/lib/rgeo/geographic/factory.rb +0 -7
  46. data/lib/rgeo/geographic/interface.rb +4 -18
  47. data/lib/rgeo/geographic/proj4_projector.rb +0 -2
  48. data/lib/rgeo/geographic/projected_feature_classes.rb +21 -9
  49. data/lib/rgeo/geographic/projected_feature_methods.rb +63 -30
  50. data/lib/rgeo/geographic/simple_mercator_projector.rb +0 -2
  51. data/lib/rgeo/geographic/spherical_feature_classes.rb +29 -9
  52. data/lib/rgeo/geographic/spherical_feature_methods.rb +68 -2
  53. data/lib/rgeo/geos/capi_factory.rb +21 -31
  54. data/lib/rgeo/geos/capi_feature_classes.rb +64 -11
  55. data/lib/rgeo/geos/ffi_factory.rb +0 -28
  56. data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
  57. data/lib/rgeo/geos/ffi_feature_methods.rb +53 -10
  58. data/lib/rgeo/geos/interface.rb +18 -10
  59. data/lib/rgeo/geos/zm_factory.rb +0 -12
  60. data/lib/rgeo/geos/zm_feature_methods.rb +30 -5
  61. data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +18 -8
  62. data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -1
  63. data/lib/rgeo/impl_helper/basic_line_string_methods.rb +37 -26
  64. data/lib/rgeo/impl_helper/basic_point_methods.rb +13 -3
  65. data/lib/rgeo/impl_helper/basic_polygon_methods.rb +8 -3
  66. data/lib/rgeo/impl_helper/valid_op.rb +354 -0
  67. data/lib/rgeo/impl_helper/validity_check.rb +138 -0
  68. data/lib/rgeo/impl_helper.rb +1 -0
  69. data/lib/rgeo/version.rb +1 -1
  70. data/lib/rgeo/wkrep/wkb_generator.rb +1 -1
  71. data/lib/rgeo/wkrep/wkt_generator.rb +6 -6
  72. metadata +30 -7
@@ -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
- raise Error::UnsupportedOperation, "Method MultiCurve#is_closed? not defined."
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
@@ -43,7 +43,7 @@ module RGeo
43
43
  # Returns a floating-point scalar value.
44
44
 
45
45
  def area
46
- raise Error::UnsupportedOperation, "Method MultiSurface#area not defined."
46
+ raise Error::UnsupportedOperation, "Method #{self.class}#area not defined."
47
47
  end
48
48
 
49
49
  # === SFS 1.1 Description
@@ -56,7 +56,7 @@ module RGeo
56
56
  # Returns an object that supports the Point interface.
57
57
 
58
58
  def centroid
59
- raise Error::UnsupportedOperation, "Method MultiSurface#centroid not defined."
59
+ raise Error::UnsupportedOperation, "Method #{self.class}#centroid not defined."
60
60
  end
61
61
 
62
62
  # === SFS 1.1 Description
@@ -68,7 +68,7 @@ module RGeo
68
68
  # Returns an object that supports the Point interface.
69
69
 
70
70
  def point_on_surface
71
- raise Error::UnsupportedOperation, "Method MultiSurface#point_on_surface not defined."
71
+ raise Error::UnsupportedOperation, "Method #{self.class}#point_on_surface not defined."
72
72
  end
73
73
  end
74
74
  end
@@ -47,7 +47,7 @@ module RGeo
47
47
  # Returns a floating-point scalar value.
48
48
 
49
49
  def x
50
- raise Error::UnsupportedOperation, "Method Point#x not defined."
50
+ raise Error::UnsupportedOperation, "Method #{self.class}#x not defined."
51
51
  end
52
52
 
53
53
  # === SFS 1.1 Description
@@ -59,7 +59,7 @@ module RGeo
59
59
  # Returns a floating-point scalar value.
60
60
 
61
61
  def y
62
- raise Error::UnsupportedOperation, "Method Point#y not defined."
62
+ raise Error::UnsupportedOperation, "Method #{self.class}#y not defined."
63
63
  end
64
64
 
65
65
  # Returns the z-coordinate for this Point as a floating-point
@@ -69,7 +69,7 @@ module RGeo
69
69
  # not support Z coordinates.
70
70
 
71
71
  def z
72
- raise Error::UnsupportedOperation, "Method Point#z not defined."
72
+ raise Error::UnsupportedOperation, "Method #{self.class}#z not defined."
73
73
  end
74
74
 
75
75
  # Returns the m-coordinate for this Point as a floating-point
@@ -79,7 +79,7 @@ module RGeo
79
79
  # not support M coordinates.
80
80
 
81
81
  def m
82
- raise Error::UnsupportedOperation, "Method Point#m not defined."
82
+ raise Error::UnsupportedOperation, "Method #{self.class}#m not defined."
83
83
  end
84
84
  end
85
85
  end
@@ -49,7 +49,7 @@ module RGeo
49
49
  # Returns a floating-point scalar value.
50
50
 
51
51
  def area
52
- raise Error::UnsupportedOperation, "Method Surface#area not defined."
52
+ raise Error::UnsupportedOperation, "Method #{self.class.name}#area not defined."
53
53
  end
54
54
 
55
55
  # === SFS 1.1 Description
@@ -62,7 +62,7 @@ module RGeo
62
62
  # Returns an object that supports the Point interface.
63
63
 
64
64
  def centroid
65
- raise Error::UnsupportedOperation, "Method Surface#centroid not defined."
65
+ raise Error::UnsupportedOperation, "Method #{self.class.name}#centroid not defined."
66
66
  end
67
67
 
68
68
  # === SFS 1.1 Description
@@ -74,7 +74,7 @@ module RGeo
74
74
  # Returns an object that supports the Point interface.
75
75
 
76
76
  def point_on_surface
77
- raise Error::UnsupportedOperation, "Method Surface#point_on_surface not defined."
77
+ raise Error::UnsupportedOperation, "Method #{self.class.name}#point_on_surface not defined."
78
78
  end
79
79
  end
80
80
  end
@@ -42,7 +42,6 @@ module RGeo
42
42
  if @coord_sys.is_a?(String)
43
43
  @coord_sys = CoordSys::CS.create_from_wkt(@coord_sys)
44
44
  end
45
- @lenient_assertions = opts[:uses_lenient_assertions] ? true : false
46
45
  @buffer_resolution = opts[:buffer_resolution].to_i
47
46
  @buffer_resolution = 1 if @buffer_resolution < 1
48
47
 
@@ -106,7 +105,6 @@ module RGeo
106
105
  "wkbg" => @wkb_generator.properties,
107
106
  "wktp" => @wkt_parser.properties,
108
107
  "wkbp" => @wkb_parser.properties,
109
- "lena" => @lenient_assertions,
110
108
  "bufr" => @buffer_resolution
111
109
  }
112
110
  hash_["proj4"] = @proj4.marshal_dump if @proj4
@@ -138,7 +136,6 @@ module RGeo
138
136
  wkb_generator: symbolize_hash(data_["wkbg"]),
139
137
  wkt_parser: symbolize_hash(data_["wktp"]),
140
138
  wkb_parser: symbolize_hash(data_["wkbp"]),
141
- uses_lenient_assertions: data_["lena"],
142
139
  buffer_resolution: data_["bufr"],
143
140
  proj4: proj4,
144
141
  coord_sys: coord_sys
@@ -164,7 +161,6 @@ module RGeo
164
161
  coder["wkb_generator"] = @wkb_generator.properties
165
162
  coder["wkt_parser"] = @wkt_parser.properties
166
163
  coder["wkb_parser"] = @wkb_parser.properties
167
- coder["lenient_assertions"] = @lenient_assertions
168
164
  coder["buffer_resolution"] = @buffer_resolution
169
165
  if @proj4
170
166
  str = @proj4.original_str || @proj4.canonical_str
@@ -201,7 +197,6 @@ module RGeo
201
197
  wkb_generator: symbolize_hash(coder["wkb_generator"]),
202
198
  wkt_parser: symbolize_hash(coder["wkt_parser"]),
203
199
  wkb_parser: symbolize_hash(coder["wkb_parser"]),
204
- uses_lenient_assertions: coder["lenient_assertions"],
205
200
  buffer_resolution: coder["buffer_resolution"],
206
201
  proj4: proj4,
207
202
  coord_sys: coord_sys
@@ -293,8 +288,6 @@ module RGeo
293
288
  @support_z
294
289
  when :has_m_coordinate
295
290
  @support_m
296
- when :uses_lenient_assertions
297
- @lenient_assertions
298
291
  when :buffer_resolution
299
292
  @buffer_resolution
300
293
  when :is_geographic
@@ -54,12 +54,6 @@ module RGeo
54
54
  # Support a Z coordinate. Default is false.
55
55
  # [<tt>:has_m_coordinate</tt>]
56
56
  # Support an M coordinate. Default is false.
57
- # [<tt>:uses_lenient_assertions</tt>]
58
- # If set to true, assertion checking is disabled. This includes
59
- # simplicity checking on LinearRing, and validity checks on
60
- # Polygon and MultiPolygon. This may speed up creation of certain
61
- # objects, at the expense of not doing the proper checking for
62
- # OGC compliance. Default is false.
63
57
  # [<tt>:buffer_resolution</tt>]
64
58
  # The resolution of buffers around geometries created by this
65
59
  # factory. This controls the number of line segments used to
@@ -131,7 +125,6 @@ module RGeo
131
125
  has_m_coordinate: opts[:has_m_coordinate],
132
126
  proj4: proj4 || proj_4055,
133
127
  coord_sys: coord_sys || coord_sys_4055,
134
- uses_lenient_assertions: opts[:uses_lenient_assertions],
135
128
  buffer_resolution: opts[:buffer_resolution],
136
129
  wkt_parser: opts[:wkt_parser],
137
130
  wkb_parser: opts[:wkb_parser],
@@ -207,10 +200,8 @@ module RGeo
207
200
  #
208
201
  # You may also provide options understood by the underlying
209
202
  # projected Cartesian factory. For example, if GEOS is used for the
210
- # projected factory, you may also set the
211
- # <tt>:lenient_multi_polygon_assertions</tt> and
212
- # <tt>:buffer_resolution</tt> options. See RGeo::Geos.factory for
213
- # more details.
203
+ # projected factory, you may also set the <tt>:buffer_resolution</tt>
204
+ # options. See RGeo::Geos.factory for more details.
214
205
 
215
206
  def simple_mercator_factory(opts = {})
216
207
  factory = Geographic::Factory.new("Projected",
@@ -225,8 +216,6 @@ module RGeo
225
216
  has_m_coordinate: opts[:has_m_coordinate])
226
217
  projector = Geographic::SimpleMercatorProjector.new(factory,
227
218
  buffer_resolution: opts[:buffer_resolution],
228
- lenient_multi_polygon_assertions: opts[:lenient_multi_polygon_assertions],
229
- uses_lenient_assertions: opts[:uses_lenient_assertions],
230
219
  has_z_coordinate: opts[:has_z_coordinate],
231
220
  has_m_coordinate: opts[:has_m_coordinate])
232
221
  factory.projector = projector
@@ -341,9 +330,8 @@ module RGeo
341
330
  # If a <tt>:projection_factory</tt> is _not_ provided, you may also
342
331
  # provide options for configuring the projected Cartesian factory.
343
332
  # For example, if GEOS is used for the projected factory, you may
344
- # also set the <tt>:lenient_multi_polygon_assertions</tt> and
345
- # <tt>:buffer_resolution</tt> options. See RGeo::Geos.factory for
346
- # more details.
333
+ # also set the <tt>:buffer_resolution</tt> option. See RGeo::Geos.factory
334
+ # for more details.
347
335
 
348
336
  def projected_factory(opts = {})
349
337
  CoordSys.check!(:proj4)
@@ -446,8 +434,6 @@ module RGeo
446
434
  srid: projection_srid,
447
435
  coord_sys: projection_coord_sys,
448
436
  buffer_resolution: opts[:buffer_resolution],
449
- lenient_multi_polygon_assertions: opts[:lenient_multi_polygon_assertions],
450
- uses_lenient_assertions: opts[:uses_lenient_assertions],
451
437
  has_z_coordinate: opts[:has_z_coordinate],
452
438
  has_m_coordinate: opts[:has_m_coordinate],
453
439
  wkt_parser: opts[:wkt_parser], wkt_generator: opts[:wkt_generator],
@@ -48,8 +48,6 @@ module RGeo
48
48
  proj4: proj4,
49
49
  coord_sys: opts[:coord_sys], srid: opts[:srid],
50
50
  buffer_resolution: opts[:buffer_resolution],
51
- lenient_multi_polygon_assertions: opts[:lenient_multi_polygon_assertions],
52
- uses_lenient_assertions: opts[:uses_lenient_assertions],
53
51
  has_z_coordinate: opts[:has_z_coordinate],
54
52
  has_m_coordinate: opts[:has_m_coordinate],
55
53
  wkt_parser: opts[:wkt_parser], wkt_generator: opts[:wkt_generator],
@@ -8,16 +8,18 @@
8
8
 
9
9
  module RGeo
10
10
  module Geographic
11
- class ProjectedPointImpl # :nodoc:
11
+ class ProjectedPointImpl
12
12
  include Feature::Point
13
+ include ImplHelper::ValidityCheck
13
14
  include ImplHelper::BasicGeometryMethods
14
15
  include ImplHelper::BasicPointMethods
15
16
  include ProjectedGeometryMethods
16
17
  include ProjectedPointMethods
17
18
  end
18
19
 
19
- class ProjectedLineStringImpl # :nodoc:
20
+ class ProjectedLineStringImpl
20
21
  include Feature::LineString
22
+ include ImplHelper::ValidityCheck
21
23
  include ImplHelper::BasicGeometryMethods
22
24
  include ImplHelper::BasicLineStringMethods
23
25
  include ProjectedGeometryMethods
@@ -25,18 +27,21 @@ module RGeo
25
27
  include ProjectedLineStringMethods
26
28
  end
27
29
 
28
- class ProjectedLinearRingImpl # :nodoc:
30
+ class ProjectedLinearRingImpl
29
31
  include Feature::LinearRing
32
+ include ImplHelper::ValidityCheck
30
33
  include ImplHelper::BasicGeometryMethods
31
34
  include ImplHelper::BasicLineStringMethods
32
35
  include ImplHelper::BasicLinearRingMethods
33
36
  include ProjectedGeometryMethods
34
37
  include ProjectedNCurveMethods
35
38
  include ProjectedLineStringMethods
39
+ include ProjectedLinearRingMethods
36
40
  end
37
41
 
38
- class ProjectedLineImpl # :nodoc:
42
+ class ProjectedLineImpl
39
43
  include Feature::Line
44
+ include ImplHelper::ValidityCheck
40
45
  include ImplHelper::BasicGeometryMethods
41
46
  include ImplHelper::BasicLineStringMethods
42
47
  include ImplHelper::BasicLineMethods
@@ -45,8 +50,9 @@ module RGeo
45
50
  include ProjectedLineStringMethods
46
51
  end
47
52
 
48
- class ProjectedPolygonImpl # :nodoc:
53
+ class ProjectedPolygonImpl
49
54
  include Feature::Polygon
55
+ include ImplHelper::ValidityCheck
50
56
  include ImplHelper::BasicGeometryMethods
51
57
  include ImplHelper::BasicPolygonMethods
52
58
  include ProjectedGeometryMethods
@@ -54,23 +60,26 @@ module RGeo
54
60
  include ProjectedPolygonMethods
55
61
  end
56
62
 
57
- class ProjectedGeometryCollectionImpl # :nodoc:
63
+ class ProjectedGeometryCollectionImpl
58
64
  include Feature::GeometryCollection
65
+ include ImplHelper::ValidityCheck
59
66
  include ImplHelper::BasicGeometryMethods
60
67
  include ImplHelper::BasicGeometryCollectionMethods
61
68
  include ProjectedGeometryMethods
62
69
  end
63
70
 
64
- class ProjectedMultiPointImpl # :nodoc:
71
+ class ProjectedMultiPointImpl
65
72
  include Feature::MultiPoint
73
+ include ImplHelper::ValidityCheck
66
74
  include ImplHelper::BasicGeometryMethods
67
75
  include ImplHelper::BasicGeometryCollectionMethods
68
76
  include ImplHelper::BasicMultiPointMethods
69
77
  include ProjectedGeometryMethods
70
78
  end
71
79
 
72
- class ProjectedMultiLineStringImpl # :nodoc:
80
+ class ProjectedMultiLineStringImpl
73
81
  include Feature::MultiLineString
82
+ include ImplHelper::ValidityCheck
74
83
  include ImplHelper::BasicGeometryMethods
75
84
  include ImplHelper::BasicGeometryCollectionMethods
76
85
  include ImplHelper::BasicMultiLineStringMethods
@@ -78,8 +87,9 @@ module RGeo
78
87
  include ProjectedNCurveMethods
79
88
  end
80
89
 
81
- class ProjectedMultiPolygonImpl # :nodoc:
90
+ class ProjectedMultiPolygonImpl
82
91
  include Feature::MultiPolygon
92
+ include ImplHelper::ValidityCheck
83
93
  include ImplHelper::BasicGeometryMethods
84
94
  include ImplHelper::BasicGeometryCollectionMethods
85
95
  include ImplHelper::BasicMultiPolygonMethods
@@ -87,5 +97,7 @@ module RGeo
87
97
  include ProjectedNSurfaceMethods
88
98
  include ProjectedMultiPolygonMethods
89
99
  end
100
+
101
+ ImplHelper::ValidityCheck.override_classes
90
102
  end
91
103
  end
@@ -19,19 +19,42 @@ module RGeo
19
19
  end
20
20
 
21
21
  def envelope
22
- factory.unproject(projection.envelope)
22
+ factory.unproject(projection.unsafe_envelope)
23
+ end
24
+
25
+ def empty?
26
+ projection.empty?
23
27
  end
24
28
 
25
29
  def is_empty?
26
- projection.is_empty?
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
- projection.is_simple?
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?
41
+ end
42
+
43
+ def valid?
44
+ projection.valid?
45
+ end
46
+
47
+ def invalid_reason
48
+ projection.invalid_reason
49
+ end
50
+
51
+ # (see RGeo::ImplHelper::ValidityCheck#make_valid)
52
+ def make_valid
53
+ factory.unproject projection.make_valid
31
54
  end
32
55
 
33
56
  def boundary
34
- boundary = projection.boundary
57
+ boundary = projection.unsafe_boundary
35
58
  boundary ? factory.unproject(boundary) : nil
36
59
  end
37
60
 
@@ -40,79 +63,79 @@ module RGeo
40
63
  end
41
64
 
42
65
  def disjoint?(rhs)
43
- projection.disjoint?(Feature.cast(rhs, factory).projection)
66
+ projection.unsafe_disjoint?(Feature.cast(rhs, factory).projection)
44
67
  end
45
68
 
46
69
  def intersects?(rhs)
47
- projection.intersects?(Feature.cast(rhs, factory).projection)
70
+ projection.unsafe_intersects?(Feature.cast(rhs, factory).projection)
48
71
  end
49
72
 
50
73
  def touches?(rhs)
51
- projection.touches?(Feature.cast(rhs, factory).projection)
74
+ projection.unsafe_touches?(Feature.cast(rhs, factory).projection)
52
75
  end
53
76
 
54
77
  def crosses?(rhs)
55
- projection.crosses?(Feature.cast(rhs, factory).projection)
78
+ projection.unsafe_crosses?(Feature.cast(rhs, factory).projection)
56
79
  end
57
80
 
58
81
  def within?(rhs)
59
- projection.within?(Feature.cast(rhs, factory).projection)
82
+ projection.unsafe_within?(Feature.cast(rhs, factory).projection)
60
83
  end
61
84
 
62
85
  def contains?(rhs)
63
- projection.contains?(Feature.cast(rhs, factory).projection)
86
+ projection.unsafe_contains?(Feature.cast(rhs, factory).projection)
64
87
  end
65
88
 
66
89
  def overlaps?(rhs)
67
- projection.overlaps?(Feature.cast(rhs, factory).projection)
90
+ projection.unsafe_overlaps?(Feature.cast(rhs, factory).projection)
68
91
  end
69
92
 
70
93
  def relate(rhs, pattern_)
71
- projection.relate(Feature.cast(rhs, factory).projection, pattern_)
94
+ projection.unsafe_relate(Feature.cast(rhs, factory).projection, pattern_)
72
95
  end
73
96
 
74
97
  def distance(rhs)
75
- projection.distance(Feature.cast(rhs, factory).projection)
98
+ projection.unsafe_distance(Feature.cast(rhs, factory).projection)
76
99
  end
77
100
 
78
101
  def buffer(distance)
79
- factory.unproject(projection.buffer(distance))
102
+ factory.unproject(projection.unsafe_buffer(distance))
80
103
  end
81
104
 
82
105
  def buffer_with_style(distance, end_cap_style, join_style, mitre_limit)
83
- factory.unproject(projection.buffer_with_style(distance, end_cap_style, join_style, mitre_limit))
106
+ factory.unproject(projection.unsafe_buffer_with_style(distance, end_cap_style, join_style, mitre_limit))
84
107
  end
85
108
 
86
109
  def simplify(tolerance)
87
- factory.unproject(projection.simplify(tolerance))
110
+ factory.unproject(projection.unsafe_simplify(tolerance))
88
111
  end
89
112
 
90
113
  def simplify_preserve_topology(tolerance)
91
- factory.unproject(projection.simplify_preserve_topology(tolerance))
114
+ factory.unproject(projection.unsafe_simplify_preserve_topology(tolerance))
92
115
  end
93
116
 
94
117
  def convex_hull
95
- factory.unproject(projection.convex_hull)
118
+ factory.unproject(projection.unsafe_convex_hull)
96
119
  end
97
120
 
98
121
  def intersection(rhs)
99
- factory.unproject(projection.intersection(Feature.cast(rhs, factory).projection))
122
+ factory.unproject(projection.unsafe_intersection(Feature.cast(rhs, factory).projection))
100
123
  end
101
124
 
102
125
  def union(rhs)
103
- factory.unproject(projection.union(Feature.cast(rhs, factory).projection))
126
+ factory.unproject(projection.unsafe_union(Feature.cast(rhs, factory).projection))
104
127
  end
105
128
 
106
129
  def difference(rhs)
107
- factory.unproject(projection.difference(Feature.cast(rhs, factory).projection))
130
+ factory.unproject(projection.unsafe_difference(Feature.cast(rhs, factory).projection))
108
131
  end
109
132
 
110
133
  def sym_difference(rhs)
111
- factory.unproject(projection.sym_difference(Feature.cast(rhs, factory).projection))
134
+ factory.unproject(projection.unsafe_sym_difference(Feature.cast(rhs, factory).projection))
112
135
  end
113
136
 
114
137
  def point_on_surface
115
- factory.unproject(projection.point_on_surface)
138
+ factory.unproject(projection.unsafe_point_on_surface)
116
139
  end
117
140
  end
118
141
 
@@ -144,7 +167,8 @@ module RGeo
144
167
 
145
168
  private
146
169
 
147
- def validate_geometry
170
+ # Ensure coordinates fall within a valid range.
171
+ def init_geometry
148
172
  @y = 85.0511287 if @y > 85.0511287
149
173
  @y = -85.0511287 if @y < -85.0511287
150
174
  super
@@ -153,33 +177,41 @@ module RGeo
153
177
 
154
178
  module ProjectedNCurveMethods # :nodoc:
155
179
  def length
156
- projection.length
180
+ projection.unsafe_length
157
181
  end
158
182
  end
159
183
 
160
184
  module ProjectedLineStringMethods # :nodoc:
161
185
  private
162
186
 
163
- def validate_geometry
187
+ # Ensure coordinates fall within a valid range.
188
+ def init_geometry
164
189
  @points = @points.map(&:canonical_point)
165
190
  super
166
191
  end
167
192
  end
168
193
 
194
+ module ProjectedLinearRingMethods # :nodoc:
195
+ def simple?
196
+ projection.valid?
197
+ end
198
+ end
199
+
169
200
  module ProjectedNSurfaceMethods # :nodoc:
170
201
  def area
171
- projection.area
202
+ projection.unsafe_area
172
203
  end
173
204
 
174
205
  def centroid
175
- factory.unproject(projection.centroid)
206
+ factory.unproject(projection.unsafe_centroid)
176
207
  end
177
208
  end
178
209
 
179
210
  module ProjectedPolygonMethods # :nodoc:
180
211
  private
181
212
 
182
- def validate_geometry
213
+ # Ensure projection is available.
214
+ def init_geometry
183
215
  super
184
216
  unless projection
185
217
  raise Error::InvalidGeometry, "Polygon failed assertions"
@@ -190,7 +222,8 @@ module RGeo
190
222
  module ProjectedMultiPolygonMethods # :nodoc:
191
223
  private
192
224
 
193
- def validate_geometry
225
+ # Ensure projection is available.
226
+ def init_geometry
194
227
  super
195
228
  unless projection
196
229
  raise Error::InvalidGeometry, "MultiPolygon failed assertions"
@@ -17,8 +17,6 @@ module RGeo
17
17
  proj4: SimpleMercatorProjector._proj4_3857,
18
18
  coord_sys: SimpleMercatorProjector._coordsys_3857,
19
19
  buffer_resolution: opts[:buffer_resolution],
20
- lenient_multi_polygon_assertions: opts[:lenient_multi_polygon_assertions],
21
- uses_lenient_assertions: opts[:uses_lenient_assertions],
22
20
  has_z_coordinate: opts[:has_z_coordinate],
23
21
  has_m_coordinate: opts[:has_m_coordinate])
24
22
  end
@@ -8,78 +8,98 @@
8
8
 
9
9
  module RGeo
10
10
  module Geographic
11
- class SphericalPointImpl # :nodoc:
11
+ class SphericalPointImpl
12
12
  include Feature::Point
13
+ include ImplHelper::ValidityCheck
13
14
  include ImplHelper::BasicGeometryMethods
14
15
  include ImplHelper::BasicPointMethods
16
+ include ImplHelper::ValidOp
15
17
  include SphericalGeometryMethods
16
18
  include SphericalPointMethods
17
19
  end
18
20
 
19
- class SphericalLineStringImpl # :nodoc:
21
+ class SphericalLineStringImpl
20
22
  include Feature::LineString
23
+ include ImplHelper::ValidityCheck
21
24
  include ImplHelper::BasicGeometryMethods
22
25
  include ImplHelper::BasicLineStringMethods
26
+ include ImplHelper::ValidOp
23
27
  include SphericalGeometryMethods
24
28
  include SphericalLineStringMethods
25
29
  end
26
30
 
27
- class SphericalLineImpl # :nodoc:
31
+ class SphericalLineImpl
28
32
  include Feature::Line
33
+ include ImplHelper::ValidityCheck
29
34
  include ImplHelper::BasicGeometryMethods
30
35
  include ImplHelper::BasicLineStringMethods
31
36
  include ImplHelper::BasicLineMethods
37
+ include ImplHelper::ValidOp
32
38
  include SphericalGeometryMethods
33
39
  include SphericalLineStringMethods
34
40
  end
35
41
 
36
- class SphericalLinearRingImpl # :nodoc:
42
+ class SphericalLinearRingImpl
37
43
  include Feature::LinearRing
44
+ include ImplHelper::ValidityCheck
38
45
  include ImplHelper::BasicGeometryMethods
39
46
  include ImplHelper::BasicLineStringMethods
40
47
  include ImplHelper::BasicLinearRingMethods
48
+ include ImplHelper::ValidOp
41
49
  include SphericalGeometryMethods
42
50
  include SphericalLineStringMethods
43
51
  end
44
52
 
45
- class SphericalPolygonImpl # :nodoc:
53
+ class SphericalPolygonImpl
46
54
  include Feature::Polygon
55
+ include ImplHelper::ValidityCheck
47
56
  include ImplHelper::BasicGeometryMethods
48
57
  include ImplHelper::BasicPolygonMethods
58
+ include ImplHelper::ValidOp
49
59
  include SphericalGeometryMethods
50
60
  include SphericalPolygonMethods
51
61
  end
52
62
 
53
- class SphericalGeometryCollectionImpl # :nodoc:
63
+ class SphericalGeometryCollectionImpl
54
64
  include Feature::GeometryCollection
65
+ include ImplHelper::ValidityCheck
55
66
  include ImplHelper::BasicGeometryMethods
56
67
  include ImplHelper::BasicGeometryCollectionMethods
68
+ include ImplHelper::ValidOp
57
69
  include SphericalGeometryMethods
58
70
  end
59
71
 
60
- class SphericalMultiPointImpl # :nodoc:
72
+ class SphericalMultiPointImpl
61
73
  include Feature::MultiPoint
74
+ include ImplHelper::ValidityCheck
62
75
  include ImplHelper::BasicGeometryMethods
63
76
  include ImplHelper::BasicGeometryCollectionMethods
64
77
  include ImplHelper::BasicMultiPointMethods
78
+ include ImplHelper::ValidOp
65
79
  include SphericalGeometryMethods
66
80
  end
67
81
 
68
- class SphericalMultiLineStringImpl # :nodoc:
82
+ class SphericalMultiLineStringImpl
69
83
  include Feature::MultiLineString
84
+ include ImplHelper::ValidityCheck
70
85
  include ImplHelper::BasicGeometryMethods
71
86
  include ImplHelper::BasicGeometryCollectionMethods
72
87
  include ImplHelper::BasicMultiLineStringMethods
88
+ include ImplHelper::ValidOp
73
89
  include SphericalGeometryMethods
74
90
  include SphericalMultiLineStringMethods
75
91
  end
76
92
 
77
- class SphericalMultiPolygonImpl # :nodoc:
93
+ class SphericalMultiPolygonImpl
78
94
  include Feature::MultiPolygon
95
+ include ImplHelper::ValidityCheck
79
96
  include ImplHelper::BasicGeometryMethods
80
97
  include ImplHelper::BasicGeometryCollectionMethods
81
98
  include ImplHelper::BasicMultiPolygonMethods
99
+ include ImplHelper::ValidOp
82
100
  include SphericalGeometryMethods
83
101
  end
102
+
103
+ ImplHelper::ValidityCheck.override_classes
84
104
  end
85
105
  end