rgeo 0.1.12 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/History.rdoc +9 -7
  2. data/README.rdoc +7 -5
  3. data/Version +1 -1
  4. data/ext/geos_c_impl/factory.c +12 -19
  5. data/ext/geos_c_impl/factory.h +15 -21
  6. data/ext/geos_c_impl/geometry.c +19 -36
  7. data/ext/geos_c_impl/geometry.h +2 -12
  8. data/ext/geos_c_impl/geometry_collection.c +38 -157
  9. data/ext/geos_c_impl/geometry_collection.h +2 -12
  10. data/ext/geos_c_impl/line_string.c +83 -80
  11. data/ext/geos_c_impl/line_string.h +2 -12
  12. data/ext/geos_c_impl/main.c +5 -0
  13. data/ext/geos_c_impl/point.c +2 -12
  14. data/ext/geos_c_impl/point.h +2 -12
  15. data/ext/geos_c_impl/polygon.c +5 -14
  16. data/ext/geos_c_impl/polygon.h +2 -12
  17. data/ext/geos_c_impl/preface.h +8 -0
  18. data/lib/rgeo.rb +34 -16
  19. data/lib/rgeo/{geography/simple_spherical/geometry_collection_impl.rb → cartesian.rb} +19 -26
  20. data/lib/rgeo/cartesian/calculations.rb +129 -0
  21. data/lib/rgeo/cartesian/interface.rb +85 -0
  22. data/lib/rgeo/cartesian/simple_factory.rb +159 -0
  23. data/lib/rgeo/cartesian/simple_feature_classes.rb +187 -0
  24. data/lib/rgeo/cartesian/simple_feature_methods.rb +97 -0
  25. data/lib/rgeo/features.rb +1 -0
  26. data/lib/rgeo/features/curve.rb +3 -2
  27. data/lib/rgeo/features/factory.rb +62 -37
  28. data/lib/rgeo/features/geometry.rb +10 -32
  29. data/lib/rgeo/features/geometry_collection.rb +3 -2
  30. data/lib/rgeo/features/line.rb +3 -2
  31. data/lib/rgeo/features/line_string.rb +3 -2
  32. data/lib/rgeo/features/linear_ring.rb +3 -2
  33. data/lib/rgeo/features/multi_curve.rb +3 -2
  34. data/lib/rgeo/features/multi_line_string.rb +3 -2
  35. data/lib/rgeo/features/multi_point.rb +3 -2
  36. data/lib/rgeo/features/multi_polygon.rb +3 -2
  37. data/lib/rgeo/features/multi_surface.rb +3 -2
  38. data/lib/rgeo/features/point.rb +3 -2
  39. data/lib/rgeo/features/polygon.rb +3 -2
  40. data/lib/rgeo/features/surface.rb +3 -2
  41. data/lib/rgeo/features/types.rb +198 -0
  42. data/lib/rgeo/geography.rb +4 -14
  43. data/lib/rgeo/geography/factory.rb +7 -64
  44. data/lib/rgeo/geography/{simple_spherical/geometry_methods.rb → helper.rb} +4 -13
  45. data/lib/rgeo/geography/simple_mercator/feature_classes.rb +35 -89
  46. data/lib/rgeo/geography/simple_mercator/feature_methods.rb +22 -31
  47. data/lib/rgeo/geography/simple_mercator/projector.rb +4 -8
  48. data/lib/rgeo/geography/simple_spherical/calculations.rb +11 -9
  49. data/lib/rgeo/geography/simple_spherical/feature_classes.rb +189 -0
  50. data/lib/rgeo/geography/simple_spherical/{line_string_impl.rb → feature_methods.rb} +16 -64
  51. data/lib/rgeo/geos/factory.rb +26 -40
  52. data/lib/rgeo/geos/impl_additions.rb +3 -5
  53. data/lib/rgeo/{geography/simple_spherical/polygon_impl.rb → impl_helpers.rb} +16 -26
  54. data/lib/rgeo/impl_helpers/basic_geometry_collection_methods.rb +186 -0
  55. data/lib/rgeo/impl_helpers/basic_geometry_methods.rb +90 -0
  56. data/lib/rgeo/impl_helpers/basic_line_string_methods.rb +188 -0
  57. data/lib/rgeo/impl_helpers/basic_point_methods.rb +149 -0
  58. data/lib/rgeo/{geography/common/helper.rb → impl_helpers/basic_polygon_methods.rb} +62 -53
  59. data/lib/rgeo/{geography/common/polygon_methods.rb → impl_helpers/serialization.rb} +50 -42
  60. data/tests/common/geometry_collection_tests.rb +9 -7
  61. data/tests/common/multi_line_string_tests.rb +16 -13
  62. data/tests/common/multi_point_tests.rb +16 -13
  63. data/tests/common/multi_polygon_tests.rb +8 -6
  64. data/tests/common/point_tests.rb +1 -2
  65. data/tests/common/polygon_tests.rb +9 -9
  66. data/tests/geos/tc_multi_line_string.rb +2 -2
  67. data/tests/simple_cartesian/tc_calculations.rb +138 -0
  68. data/tests/simple_cartesian/tc_geometry_collection.rb +68 -0
  69. data/tests/simple_cartesian/tc_line_string.rb +70 -0
  70. data/{lib/rgeo/geography/simple_spherical/multi_line_string_impl.rb → tests/simple_cartesian/tc_multi_line_string.rb} +19 -19
  71. data/{lib/rgeo/geography/simple_spherical/multi_polygon_impl.rb → tests/simple_cartesian/tc_multi_point.rb} +19 -19
  72. data/{lib/rgeo/geography/common/geometry_methods.rb → tests/simple_cartesian/tc_multi_polygon.rb} +19 -41
  73. data/{lib/rgeo/geography/simple_spherical/point_impl.rb → tests/simple_cartesian/tc_point.rb} +33 -35
  74. data/tests/simple_cartesian/tc_polygon.rb +67 -0
  75. data/tests/simple_spherical/tc_geometry_collection.rb +68 -0
  76. data/tests/simple_spherical/tc_line_string.rb +10 -171
  77. data/tests/simple_spherical/tc_multi_line_string.rb +67 -0
  78. data/{lib/rgeo/geography/simple_spherical/multi_point_impl.rb → tests/simple_spherical/tc_multi_point.rb} +19 -19
  79. data/tests/simple_spherical/tc_multi_polygon.rb +70 -0
  80. data/tests/simple_spherical/tc_point.rb +17 -115
  81. data/tests/simple_spherical/tc_polygon.rb +67 -0
  82. metadata +46 -18
  83. data/ext/geos_c_impl/globals.h +0 -58
  84. data/lib/rgeo/geography/common/geometry_collection_methods.rb +0 -217
  85. data/lib/rgeo/geography/common/line_string_methods.rb +0 -201
  86. data/lib/rgeo/geography/common/point_methods.rb +0 -153
@@ -0,0 +1,187 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Spherical geography feature classes
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ module RGeo
38
+
39
+ module Cartesian
40
+
41
+
42
+ class SimplePointImpl # :nodoc:
43
+
44
+
45
+ include Features::Point
46
+ include ImplHelpers::BasicGeometryMethods
47
+ include Cartesian::SimpleGeometryMethods
48
+ include ImplHelpers::BasicPointMethods
49
+
50
+
51
+ def _validate_geometry
52
+ @x = @x % 360.0
53
+ @x -= 360.0 if @x >= 180.0
54
+ @y = 90.0 if @y > 90.0
55
+ @y = -90.0 if @y < -90.0
56
+ super
57
+ end
58
+
59
+
60
+ def _xyz
61
+ @xyz ||= PointXYZ.from_latlon(@y, @x)
62
+ end
63
+
64
+
65
+ def distance(rhs_)
66
+ rhs_ = Features.cast(rhs_, @factory)
67
+ case rhs_
68
+ when SimplePointImpl
69
+ dx_ = @x - rhs_.x
70
+ dy_ = @y - rhs_.y
71
+ ::Math.sqrt(dx_ * dx_ + dy_ * dy_)
72
+ else
73
+ super
74
+ end
75
+ end
76
+
77
+
78
+ end
79
+
80
+
81
+ class SimpleLineStringImpl # :nodoc:
82
+
83
+
84
+ include Features::LineString
85
+ include ImplHelpers::BasicGeometryMethods
86
+ include Cartesian::SimpleGeometryMethods
87
+ include ImplHelpers::BasicLineStringMethods
88
+ include Cartesian::SimpleLineStringMethods
89
+
90
+
91
+ end
92
+
93
+
94
+ class SimpleLineImpl # :nodoc:
95
+
96
+
97
+ include Features::Line
98
+ include ImplHelpers::BasicGeometryMethods
99
+ include Cartesian::SimpleGeometryMethods
100
+ include ImplHelpers::BasicLineStringMethods
101
+ include Cartesian::SimpleLineStringMethods
102
+ include ImplHelpers::BasicLineMethods
103
+
104
+
105
+ end
106
+
107
+
108
+ class SimpleLinearRingImpl # :nodoc:
109
+
110
+
111
+ include Features::Line
112
+ include ImplHelpers::BasicGeometryMethods
113
+ include Cartesian::SimpleGeometryMethods
114
+ include ImplHelpers::BasicLineStringMethods
115
+ include Cartesian::SimpleLineStringMethods
116
+ include ImplHelpers::BasicLinearRingMethods
117
+
118
+
119
+ end
120
+
121
+
122
+ class SimplePolygonImpl # :nodoc:
123
+
124
+
125
+ include Features::Polygon
126
+ include ImplHelpers::BasicGeometryMethods
127
+ include Cartesian::SimpleGeometryMethods
128
+ include ImplHelpers::BasicPolygonMethods
129
+
130
+
131
+ end
132
+
133
+
134
+ class SimpleGeometryCollectionImpl # :nodoc:
135
+
136
+
137
+ include Features::GeometryCollection
138
+ include ImplHelpers::BasicGeometryMethods
139
+ include Cartesian::SimpleGeometryMethods
140
+ include ImplHelpers::BasicGeometryCollectionMethods
141
+
142
+
143
+ end
144
+
145
+
146
+ class SimpleMultiPointImpl # :nodoc:
147
+
148
+
149
+ include Features::GeometryCollection
150
+ include ImplHelpers::BasicGeometryMethods
151
+ include Cartesian::SimpleGeometryMethods
152
+ include ImplHelpers::BasicGeometryCollectionMethods
153
+ include ImplHelpers::BasicMultiPointMethods
154
+
155
+
156
+ end
157
+
158
+
159
+ class SimpleMultiLineStringImpl # :nodoc:
160
+
161
+
162
+ include Features::GeometryCollection
163
+ include ImplHelpers::BasicGeometryMethods
164
+ include Cartesian::SimpleGeometryMethods
165
+ include ImplHelpers::BasicGeometryCollectionMethods
166
+ include ImplHelpers::BasicMultiLineStringMethods
167
+
168
+
169
+ end
170
+
171
+
172
+ class SimpleMultiPolygonImpl # :nodoc:
173
+
174
+
175
+ include Features::GeometryCollection
176
+ include ImplHelpers::BasicGeometryMethods
177
+ include Cartesian::SimpleGeometryMethods
178
+ include ImplHelpers::BasicGeometryCollectionMethods
179
+ include ImplHelpers::BasicMultiPolygonMethods
180
+
181
+
182
+ end
183
+
184
+
185
+ end
186
+
187
+ end
@@ -0,0 +1,97 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Spherical geometry common methods
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ module RGeo
38
+
39
+ module Cartesian
40
+
41
+
42
+ module SimpleGeometryMethods # :nodoc:
43
+
44
+
45
+ def srid
46
+ factory.srid
47
+ end
48
+
49
+
50
+ end
51
+
52
+
53
+ module SimpleLineStringMethods # :nodoc:
54
+
55
+
56
+ def _segments
57
+ unless @segments
58
+ @segments = (0..num_points-2).map do |i_|
59
+ Segment.new(point_n(i_), point_n(i_+1))
60
+ end
61
+ end
62
+ @segments
63
+ end
64
+
65
+
66
+ def is_simple?
67
+ segs_ = _segments
68
+ len_ = segs_.length
69
+ return false if segs_.any?{ |a_| a_.degenerate? }
70
+ return true if len_ == 1
71
+ return segs_[0].s != segs_[1].e if len_ == 2
72
+ segs_.each_with_index do |seg_, index_|
73
+ nindex_ = index_ + 1
74
+ nindex_ = nil if nindex_ == len_
75
+ return false if nindex_ && seg_.contains_point?(segs_[nindex_].e)
76
+ pindex_ = index_ - 1
77
+ pindex_ = nil if pindex_ < 0
78
+ return false if pindex_ && seg_.contains_point?(segs_[pindex_].s)
79
+ if nindex_
80
+ oindex_ = nindex_ + 1
81
+ while oindex_ < len_
82
+ oseg_ = segs_[oindex_]
83
+ return false if !(index_ == 0 && oindex_ == len_-1 && seg_.s == oseg_.e) && seg_.intersects_segment?(oseg_)
84
+ oindex_ += 1
85
+ end
86
+ end
87
+ end
88
+ true
89
+ end
90
+
91
+
92
+ end
93
+
94
+
95
+ end
96
+
97
+ end
data/lib/rgeo/features.rb CHANGED
@@ -71,6 +71,7 @@ end
71
71
  # Dependency source files.
72
72
  paths_ = [
73
73
  'features/factory',
74
+ 'features/types',
74
75
  'features/geometry',
75
76
  'features/point',
76
77
  'features/curve',
@@ -68,13 +68,14 @@ module RGeo
68
68
  # for the sake of documentation. Implementations need not necessarily
69
69
  # include this module itself. Therefore, you should not depend on the
70
70
  # kind_of? method to check type. Instead, use the provided check_type
71
- # class method. A corresponding === operator is also provided to
72
- # to support case-when constructs.
71
+ # class method (or === operator) defined in the Type module.
73
72
  #
74
73
  # Some implementations may support higher dimensional points.
75
74
 
76
75
  module Curve
77
76
 
77
+ extend Type
78
+
78
79
  include Geometry
79
80
 
80
81
 
@@ -52,13 +52,25 @@ module RGeo
52
52
  # coordinates or additional subclasses not explicitly required by the
53
53
  # Simple Features Specification.
54
54
  #
55
- # A particular factory implementation may not necessarily include
56
- # this module. Do not depend on kind_of? or === to check for
57
- # factory-ness. This module is present primarily for documentation.
55
+ # Factory is defined as a module and is provided primarily for the
56
+ # sake of documentation. Implementations need not necessarily include
57
+ # this module itself. Therefore, you should not depend on the
58
+ # kind_of? method to check type. However, to support testing for
59
+ # factory-ness, the Factory::Instance submodule is provided. All
60
+ # factory implementation classes MUST include Factory::Instance, and
61
+ # you may use it in kind_of?, ===, and case-when constructs.
58
62
 
59
63
  module Factory
60
64
 
61
65
 
66
+ # All factory implementations MUST include this submodule.
67
+ # This serves as a marker that may be used to test an object for
68
+ # factory-ness.
69
+
70
+ module Instance
71
+ end
72
+
73
+
62
74
  # Parse the given string in well-known-text format and return the
63
75
  # resulting feature. Returns nil if the string couldn't be parsed.
64
76
 
@@ -84,7 +96,8 @@ module RGeo
84
96
 
85
97
 
86
98
  # Create a feature of type LineString.
87
- # The given points argument should be an Enumerable of Point objects.
99
+ # The given points argument should be an Enumerable of Point
100
+ # objects, or objects that can be casted to Point.
88
101
 
89
102
  def line_string(points_)
90
103
  nil
@@ -92,7 +105,8 @@ module RGeo
92
105
 
93
106
 
94
107
  # Create a feature of type Line.
95
- # The given point arguments should be Point objects.
108
+ # The given point arguments should be Point objects, or objects
109
+ # that can be casted to Point.
96
110
 
97
111
  def line(start_, end_)
98
112
  nil
@@ -100,7 +114,8 @@ module RGeo
100
114
 
101
115
 
102
116
  # Create a feature of type LinearRing.
103
- # The given points argument should be an Enumerable of Point objects.
117
+ # The given points argument should be an Enumerable of Point
118
+ # objects, or objects that can be casted to Point.
104
119
  # If the first and last points are not equal, the ring is
105
120
  # automatically closed by appending the first point to the end of the
106
121
  # string.
@@ -111,9 +126,11 @@ module RGeo
111
126
 
112
127
 
113
128
  # Create a feature of type Polygon.
114
- # The outer_ring should be a LinearRing.
129
+ # The outer_ring should be a LinearRing, or an object that can be
130
+ # casted to LinearRing.
115
131
  # The inner_rings should be a possibly empty Enumerable of
116
- # LinearRing. You may also pass nil to indicate no inner rings.
132
+ # LinearRing (or objects that can be casted to LinearRing).
133
+ # You may also pass nil to indicate no inner rings.
117
134
 
118
135
  def polygon(outer_ring_, inner_rings_=nil)
119
136
  nil
@@ -122,8 +139,6 @@ module RGeo
122
139
 
123
140
  # Create a feature of type GeometryCollection.
124
141
  # The elems should be an Enumerable of Geometry objects.
125
- # This method does not "flatten" collection hierarchies in the way
126
- # that multi_point, multi_line_string, and multi_polygon do.
127
142
 
128
143
  def collection(elems_)
129
144
  nil
@@ -131,12 +146,10 @@ module RGeo
131
146
 
132
147
 
133
148
  # Create a feature of type MultiPoint.
134
- # The elems should be an Enumerable of Point objects, or collections
135
- # whose contents, recursively expanded, eventually include only
136
- # Point objects. The resultant MultiPoint will thus be "flattened"
137
- # so that its elements include only those leaf Points.
138
- # Returns nil if any of the leaf geometries is not a Point, which
139
- # would break the MultiPoint contract.
149
+ # The elems should be an Enumerable of Point objects, or objects
150
+ # that can be casted to Point.
151
+ # Returns nil if any of the contained geometries is not a Point,
152
+ # which would break the MultiPoint contract.
140
153
 
141
154
  def multi_point(elems_)
142
155
  nil
@@ -144,14 +157,10 @@ module RGeo
144
157
 
145
158
 
146
159
  # Create a feature of type MultiLineString.
147
- #
148
- # The elems should be an Enumerable of LineString objects, or
149
- # collections whose contents, recursively expanded, eventually
150
- # include only LineString objects (or subclasses thereof).
151
- # The resultant MultiLineString will thus be "flattened" so that its
152
- # elements include only those leaf LineStrings.
153
- # Returns nil if any of the leaf geometries is not a LineString,
154
- # which would break the MultiLineString contract.
160
+ # The elems should be an Enumerable of objects that are or can be
161
+ # casted to LineString or any of its subclasses.
162
+ # Returns nil if any of the contained geometries is not a
163
+ # LineString, which would break the MultiLineString contract.
155
164
 
156
165
  def multi_line_string(elems_)
157
166
  nil
@@ -159,12 +168,9 @@ module RGeo
159
168
 
160
169
 
161
170
  # Create a feature of type MultiPolygon.
162
- # The elems should be an Enumerable of Polygon objects, or
163
- # collections whose contents, recursively expanded, eventually
164
- # include only Polygon objects.
165
- # The resultant MultiPolygon will thus be "flattened" so that its
166
- # elements include only those leaf Polygons.
167
- # Returns nil if any of the leaf geometries is not a Polygon,
171
+ # The elems should be an Enumerable of objects that are or can be
172
+ # casted to Polygon or any of its subclasses.
173
+ # Returns nil if any of the contained geometries is not a Polygon,
168
174
  # which would break the MultiPolygon contract.
169
175
  # Also returns nil if any of the other assertions for MultiPolygon
170
176
  # are not met-- e.g. if any of the polygons overlap.
@@ -174,13 +180,32 @@ module RGeo
174
180
  end
175
181
 
176
182
 
177
- # Cast an existing feature to a feature of the type created by
178
- # this implementation.
179
- # If force_new is true, a new object is returned even if the original
180
- # is already of this implementation.
181
-
182
- def cast(original_, force_new_=false)
183
- nil
183
+ # This is an optional method that may be implemented to customize
184
+ # casting for this factory. Basically, RGeo defines standard ways
185
+ # to cast certain types of objects from one factory to another and
186
+ # one SFS type to another. However, a factory may choose to
187
+ # override how things are casted TO its implementation using this
188
+ # method. It can do this to optimize certain casting cases, or
189
+ # implement special cases particular to this factory.
190
+ #
191
+ # This method will be called (if defined) on the destination
192
+ # factory, and will be passed the original object (which may or may
193
+ # not already be created by this factory), the SFS feature type
194
+ # (which again may or may not already be the type of the original
195
+ # object), a flag indicating whether to keep the subtype if casting
196
+ # to a supertype of the current type, and a flag indicating whether
197
+ # to force the creation of a new object even if the original is
198
+ # already of the desired factory and type.
199
+ #
200
+ # It should return either a casted result object, false, or nil.
201
+ # A nil return value indicates that casting should be forced to
202
+ # fail (and ::RGeo::Features::cast will return nil).
203
+ # A false return value indicates that this method declines to
204
+ # override the casting algorithm, and RGeo should use its default
205
+ # algorithm to cast the object.
206
+
207
+ def override_cast(original_, type_, keep_subtype_, force_new_)
208
+ false
184
209
  end
185
210
 
186
211