rgeo-dschee 0.5.4

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.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +29 -0
  3. data/ext/geos_c_impl/coordinates.c +65 -0
  4. data/ext/geos_c_impl/coordinates.h +2 -0
  5. data/ext/geos_c_impl/extconf.rb +43 -0
  6. data/ext/geos_c_impl/factory.c +995 -0
  7. data/ext/geos_c_impl/factory.h +238 -0
  8. data/ext/geos_c_impl/geometry.c +1093 -0
  9. data/ext/geos_c_impl/geometry.h +23 -0
  10. data/ext/geos_c_impl/geometry_collection.c +757 -0
  11. data/ext/geos_c_impl/geometry_collection.h +46 -0
  12. data/ext/geos_c_impl/line_string.c +675 -0
  13. data/ext/geos_c_impl/line_string.h +32 -0
  14. data/ext/geos_c_impl/main.c +40 -0
  15. data/ext/geos_c_impl/point.c +236 -0
  16. data/ext/geos_c_impl/point.h +30 -0
  17. data/ext/geos_c_impl/polygon.c +359 -0
  18. data/ext/geos_c_impl/polygon.h +43 -0
  19. data/ext/geos_c_impl/preface.h +38 -0
  20. data/ext/proj4_c_impl/extconf.rb +62 -0
  21. data/ext/proj4_c_impl/main.c +315 -0
  22. data/lib/rgeo.rb +89 -0
  23. data/lib/rgeo/cartesian.rb +25 -0
  24. data/lib/rgeo/cartesian/analysis.rb +77 -0
  25. data/lib/rgeo/cartesian/bounding_box.rb +398 -0
  26. data/lib/rgeo/cartesian/calculations.rb +113 -0
  27. data/lib/rgeo/cartesian/factory.rb +347 -0
  28. data/lib/rgeo/cartesian/feature_classes.rb +100 -0
  29. data/lib/rgeo/cartesian/feature_methods.rb +88 -0
  30. data/lib/rgeo/cartesian/interface.rb +135 -0
  31. data/lib/rgeo/coord_sys.rb +43 -0
  32. data/lib/rgeo/coord_sys/cs/entities.rb +1315 -0
  33. data/lib/rgeo/coord_sys/cs/factories.rb +148 -0
  34. data/lib/rgeo/coord_sys/cs/wkt_parser.rb +272 -0
  35. data/lib/rgeo/coord_sys/proj4.rb +293 -0
  36. data/lib/rgeo/coord_sys/srs_database/interface.rb +115 -0
  37. data/lib/rgeo/coord_sys/srs_database/proj4_data.rb +140 -0
  38. data/lib/rgeo/coord_sys/srs_database/sr_org.rb +62 -0
  39. data/lib/rgeo/coord_sys/srs_database/url_reader.rb +63 -0
  40. data/lib/rgeo/error.rb +27 -0
  41. data/lib/rgeo/feature.rb +54 -0
  42. data/lib/rgeo/feature/curve.rb +111 -0
  43. data/lib/rgeo/feature/factory.rb +278 -0
  44. data/lib/rgeo/feature/factory_generator.rb +96 -0
  45. data/lib/rgeo/feature/geometry.rb +624 -0
  46. data/lib/rgeo/feature/geometry_collection.rb +95 -0
  47. data/lib/rgeo/feature/line.rb +26 -0
  48. data/lib/rgeo/feature/line_string.rb +60 -0
  49. data/lib/rgeo/feature/linear_ring.rb +26 -0
  50. data/lib/rgeo/feature/mixins.rb +143 -0
  51. data/lib/rgeo/feature/multi_curve.rb +71 -0
  52. data/lib/rgeo/feature/multi_line_string.rb +26 -0
  53. data/lib/rgeo/feature/multi_point.rb +33 -0
  54. data/lib/rgeo/feature/multi_polygon.rb +57 -0
  55. data/lib/rgeo/feature/multi_surface.rb +73 -0
  56. data/lib/rgeo/feature/point.rb +84 -0
  57. data/lib/rgeo/feature/polygon.rb +97 -0
  58. data/lib/rgeo/feature/surface.rb +79 -0
  59. data/lib/rgeo/feature/types.rb +284 -0
  60. data/lib/rgeo/geographic.rb +40 -0
  61. data/lib/rgeo/geographic/factory.rb +450 -0
  62. data/lib/rgeo/geographic/interface.rb +489 -0
  63. data/lib/rgeo/geographic/proj4_projector.rb +58 -0
  64. data/lib/rgeo/geographic/projected_feature_classes.rb +107 -0
  65. data/lib/rgeo/geographic/projected_feature_methods.rb +212 -0
  66. data/lib/rgeo/geographic/projected_window.rb +383 -0
  67. data/lib/rgeo/geographic/simple_mercator_projector.rb +110 -0
  68. data/lib/rgeo/geographic/spherical_feature_classes.rb +100 -0
  69. data/lib/rgeo/geographic/spherical_feature_methods.rb +134 -0
  70. data/lib/rgeo/geographic/spherical_math.rb +188 -0
  71. data/lib/rgeo/geos.rb +89 -0
  72. data/lib/rgeo/geos/capi_factory.rb +470 -0
  73. data/lib/rgeo/geos/capi_feature_classes.rb +129 -0
  74. data/lib/rgeo/geos/ffi_factory.rb +592 -0
  75. data/lib/rgeo/geos/ffi_feature_classes.rb +83 -0
  76. data/lib/rgeo/geos/ffi_feature_methods.rb +574 -0
  77. data/lib/rgeo/geos/interface.rb +202 -0
  78. data/lib/rgeo/geos/utils.rb +74 -0
  79. data/lib/rgeo/geos/zm_factory.rb +405 -0
  80. data/lib/rgeo/geos/zm_feature_classes.rb +80 -0
  81. data/lib/rgeo/geos/zm_feature_methods.rb +344 -0
  82. data/lib/rgeo/impl_helper.rb +19 -0
  83. data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +185 -0
  84. data/lib/rgeo/impl_helper/basic_geometry_methods.rb +61 -0
  85. data/lib/rgeo/impl_helper/basic_line_string_methods.rb +146 -0
  86. data/lib/rgeo/impl_helper/basic_point_methods.rb +104 -0
  87. data/lib/rgeo/impl_helper/basic_polygon_methods.rb +87 -0
  88. data/lib/rgeo/impl_helper/math.rb +14 -0
  89. data/lib/rgeo/impl_helper/utils.rb +29 -0
  90. data/lib/rgeo/version.rb +3 -0
  91. data/lib/rgeo/wkrep.rb +37 -0
  92. data/lib/rgeo/wkrep/wkb_generator.rb +201 -0
  93. data/lib/rgeo/wkrep/wkb_parser.rb +251 -0
  94. data/lib/rgeo/wkrep/wkt_generator.rb +207 -0
  95. data/lib/rgeo/wkrep/wkt_parser.rb +415 -0
  96. data/lib/rgeo/yaml.rb +23 -0
  97. data/test/cartesian_analysis_test.rb +65 -0
  98. data/test/cartesian_bbox_test.rb +123 -0
  99. data/test/common/factory_tests.rb +78 -0
  100. data/test/common/geometry_collection_tests.rb +237 -0
  101. data/test/common/line_string_tests.rb +330 -0
  102. data/test/common/multi_line_string_tests.rb +182 -0
  103. data/test/common/multi_point_tests.rb +200 -0
  104. data/test/common/multi_polygon_tests.rb +191 -0
  105. data/test/common/point_tests.rb +370 -0
  106. data/test/common/polygon_tests.rb +261 -0
  107. data/test/coord_sys/ogc_cs_test.rb +342 -0
  108. data/test/coord_sys/proj4_srs_data_test.rb +41 -0
  109. data/test/coord_sys/proj4_test.rb +150 -0
  110. data/test/coord_sys/sr_org_test.rb +32 -0
  111. data/test/coord_sys/url_reader_test.rb +42 -0
  112. data/test/geos_capi/factory_test.rb +31 -0
  113. data/test/geos_capi/geometry_collection_test.rb +24 -0
  114. data/test/geos_capi/line_string_test.rb +24 -0
  115. data/test/geos_capi/misc_test.rb +116 -0
  116. data/test/geos_capi/multi_line_string_test.rb +24 -0
  117. data/test/geos_capi/multi_point_test.rb +24 -0
  118. data/test/geos_capi/multi_polygon_test.rb +39 -0
  119. data/test/geos_capi/parsing_unparsing_test.rb +40 -0
  120. data/test/geos_capi/point_test.rb +72 -0
  121. data/test/geos_capi/polygon_test.rb +154 -0
  122. data/test/geos_capi/zmfactory_test.rb +57 -0
  123. data/test/geos_ffi/factory_test.rb +31 -0
  124. data/test/geos_ffi/geometry_collection_test.rb +24 -0
  125. data/test/geos_ffi/line_string_test.rb +24 -0
  126. data/test/geos_ffi/misc_test.rb +63 -0
  127. data/test/geos_ffi/multi_line_string_test.rb +24 -0
  128. data/test/geos_ffi/multi_point_test.rb +24 -0
  129. data/test/geos_ffi/multi_polygon_test.rb +33 -0
  130. data/test/geos_ffi/parsing_unparsing_test.rb +41 -0
  131. data/test/geos_ffi/point_test.rb +77 -0
  132. data/test/geos_ffi/polygon_test.rb +46 -0
  133. data/test/geos_ffi/zmfactory_test.rb +58 -0
  134. data/test/mixins_test.rb +141 -0
  135. data/test/oneoff_test.rb +26 -0
  136. data/test/projected_geographic/factory_test.rb +25 -0
  137. data/test/projected_geographic/geometry_collection_test.rb +24 -0
  138. data/test/projected_geographic/line_string_test.rb +24 -0
  139. data/test/projected_geographic/multi_line_string_test.rb +26 -0
  140. data/test/projected_geographic/multi_point_test.rb +30 -0
  141. data/test/projected_geographic/multi_polygon_test.rb +25 -0
  142. data/test/projected_geographic/point_test.rb +51 -0
  143. data/test/projected_geographic/polygon_test.rb +24 -0
  144. data/test/simple_cartesian/calculations_test.rb +99 -0
  145. data/test/simple_cartesian/factory_test.rb +27 -0
  146. data/test/simple_cartesian/geometry_collection_test.rb +30 -0
  147. data/test/simple_cartesian/line_string_test.rb +31 -0
  148. data/test/simple_cartesian/multi_line_string_test.rb +28 -0
  149. data/test/simple_cartesian/multi_point_test.rb +31 -0
  150. data/test/simple_cartesian/multi_polygon_test.rb +31 -0
  151. data/test/simple_cartesian/point_test.rb +50 -0
  152. data/test/simple_cartesian/polygon_test.rb +28 -0
  153. data/test/simple_mercator/factory_test.rb +25 -0
  154. data/test/simple_mercator/geometry_collection_test.rb +24 -0
  155. data/test/simple_mercator/line_string_test.rb +24 -0
  156. data/test/simple_mercator/multi_line_string_test.rb +26 -0
  157. data/test/simple_mercator/multi_point_test.rb +29 -0
  158. data/test/simple_mercator/multi_polygon_test.rb +25 -0
  159. data/test/simple_mercator/point_test.rb +55 -0
  160. data/test/simple_mercator/polygon_test.rb +24 -0
  161. data/test/simple_mercator/window_test.rb +173 -0
  162. data/test/spherical_geographic/calculations_test.rb +167 -0
  163. data/test/spherical_geographic/factory_test.rb +27 -0
  164. data/test/spherical_geographic/geometry_collection_test.rb +31 -0
  165. data/test/spherical_geographic/line_string_test.rb +31 -0
  166. data/test/spherical_geographic/multi_line_string_test.rb +29 -0
  167. data/test/spherical_geographic/multi_point_test.rb +31 -0
  168. data/test/spherical_geographic/multi_polygon_test.rb +31 -0
  169. data/test/spherical_geographic/point_test.rb +78 -0
  170. data/test/spherical_geographic/polygon_test.rb +28 -0
  171. data/test/types_test.rb +42 -0
  172. data/test/wkrep/wkb_generator_test.rb +185 -0
  173. data/test/wkrep/wkb_parser_test.rb +293 -0
  174. data/test/wkrep/wkt_generator_test.rb +294 -0
  175. data/test/wkrep/wkt_parser_test.rb +412 -0
  176. metadata +386 -0
@@ -0,0 +1,111 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Curve feature interface
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ module RGeo
8
+ module Feature
9
+ # == SFS 1.1 Description
10
+ #
11
+ # A Curve is a 1-dimensional geometric object usually stored as a
12
+ # sequence of Points, with the subtype of Curve specifying the form of
13
+ # the interpolation between Points. This part of ISO 19125 defines only
14
+ # one subclass of Curve, LineString, which uses linear interpolation
15
+ # between Points.
16
+ #
17
+ # A Curve is a 1-dimensional geometric object that is the homeomorphic
18
+ # image of a real, closed interval D=[a,b] under a mapping f:[a,b]->R2.
19
+ #
20
+ # A Curve is simple if it does not pass through the same Point twice.
21
+ #
22
+ # A Curve is closed if its start Point is equal to its end Point.
23
+ #
24
+ # The boundary of a closed Curve is empty.
25
+ #
26
+ # A Curve that is simple and closed is a Ring.
27
+ #
28
+ # The boundary of a non-closed Curve consists of its two end Points.
29
+ #
30
+ # A Curve is defined as topologically closed.
31
+ #
32
+ # == Notes
33
+ #
34
+ # Curve is defined as a module and is provided primarily
35
+ # for the sake of documentation. Implementations need not necessarily
36
+ # include this module itself. Therefore, you should not depend on the
37
+ # kind_of? method to check type. Instead, use the provided check_type
38
+ # class method (or === operator) defined in the Type module.
39
+ #
40
+ # Some implementations may support higher dimensional points.
41
+
42
+ module Curve
43
+ include Geometry
44
+ extend Type
45
+
46
+ # === SFS 1.1 Description
47
+ #
48
+ # The length of this Curve in its associated spatial reference.
49
+ #
50
+ # === Notes
51
+ #
52
+ # Returns a floating-point scalar value.
53
+
54
+ def length
55
+ raise Error::UnsupportedOperation, "Method Curve#length not defined."
56
+ end
57
+
58
+ # === SFS 1.1 Description
59
+ #
60
+ # The start Point of this Curve.
61
+ #
62
+ # === Notes
63
+ #
64
+ # Returns an object that supports the Point interface.
65
+
66
+ def start_point
67
+ raise Error::UnsupportedOperation, "Method Curve#start_point not defined."
68
+ end
69
+
70
+ # === SFS 1.1 Description
71
+ #
72
+ # The end Point of this Curve.
73
+ #
74
+ # === Notes
75
+ #
76
+ # Returns an object that supports the Point interface.
77
+
78
+ def end_point
79
+ raise Error::UnsupportedOperation, "Method Curve#end_point not defined."
80
+ end
81
+
82
+ # === SFS 1.1 Description
83
+ #
84
+ # Returns true if this Curve is closed [StartPoint() = EndPoint()].
85
+ #
86
+ # === Notes
87
+ #
88
+ # Returns a boolean value. Note that this is different from the SFS
89
+ # specification, which stipulates an integer return value.
90
+
91
+ def is_closed?
92
+ raise Error::UnsupportedOperation, "Method Curve#is_closed? not defined."
93
+ end
94
+
95
+ # === SFS 1.1 Description
96
+ #
97
+ # Returns true if this Curve is closed [StartPoint() = EndPoint()]
98
+ # and this Curve is simple (does not pass through the same Point
99
+ # more than once).
100
+ #
101
+ # === Notes
102
+ #
103
+ # Returns a boolean value. Note that this is different from the SFS
104
+ # specification, which stipulates an integer return value.
105
+
106
+ def is_ring?
107
+ raise Error::UnsupportedOperation, "Method Curve#is_ring? not defined."
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,278 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Feature factory interface
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ module RGeo
8
+ module Feature
9
+ # This is a standard interface for factories of features.
10
+ # Generally, each Feature implementation will implement these
11
+ # methods as a standard way to create features.
12
+ #
13
+ # If the implementation is unable to create the given feature,
14
+ # it should generally return nil. Implementations may also choose to
15
+ # raise an exception on failure.
16
+ #
17
+ # Some implementations may extend this interface to provide facilities
18
+ # for creating additional objects according to the capabilities
19
+ # provided by that implementation. Examples might include
20
+ # higher-dimensional coordinates or additional subclasses not
21
+ # explicitly required by the Simple Features Specification.
22
+ #
23
+ # Factory is defined as a module and is provided primarily for the
24
+ # sake of documentation. Implementations need not necessarily include
25
+ # this module itself. Therefore, you should not depend on the result
26
+ # of <tt>is_a?(Factory)</tt> to check type. However, to support
27
+ # testing for factory-ness, the <tt>Factory::Instance</tt> submodule
28
+ # is provided. All factory implementation classes MUST include
29
+ # <tt>Factory::Instance</tt>, and you may use it in <tt>is_a?</tt>,
30
+ # <tt>===</tt>, and case-when constructs.
31
+
32
+ module Factory
33
+ # All factory implementations MUST include this submodule.
34
+ # This serves as a marker that may be used to test an object for
35
+ # factory-ness.
36
+
37
+ module Instance
38
+ end
39
+
40
+ # Returns meta-information about this factory, by key. This
41
+ # information may involve support for optional functionality,
42
+ # properties of the coordinate system, or other characteristics.
43
+ #
44
+ # Each property has a symbolic name. Names that have no periods are
45
+ # considered well-known names and are reserved for use by RGeo. If
46
+ # you want to define your own properties, use a name that is
47
+ # namespaced with periods, such as <tt>:'mycompany.myprop'</tt>.
48
+ #
49
+ # Property values are dependent on the individual property.
50
+ # Generally, properties that involve testing for functionality
51
+ # should return true if the functionality is support, or false or
52
+ # nil if not. A property value could also invlove different values
53
+ # indicating different levels of support. In any case, the factory
54
+ # should return nil for property names it does not recognize. This
55
+ # value is considered the "default" or "no value" value.
56
+ #
57
+ # Currently defined well-known properties are:
58
+ #
59
+ # [<tt>:has_z_coordinate</tt>]
60
+ # Set to true if geometries created by this factory include a Z
61
+ # coordinate, and the Point#z method is available.
62
+ # [<tt>:has_m_coordinate</tt>]
63
+ # Set to true if geometries created by this factory include a M
64
+ # coordinate, and the Point#m method is available.
65
+ # [<tt>:is_cartesian</tt>]
66
+ # Set to true if this Factory guarantees that it operates in
67
+ # Cartesian geometry. If false or nil, no such guarantee is made,
68
+ # though it is possible the geometries may still be Cartesian.
69
+ # [<tt>:is_geographic</tt>]
70
+ # Set to true if this Factory's coordinate system is meant to be
71
+ # interpreted as x=longitude and y=latitude. If false or nil, no
72
+ # information is present about whether the coordinate system is
73
+ # meant to be so interpreted.
74
+
75
+ def property(_name_)
76
+ nil
77
+ end
78
+
79
+ # Parse the given string in well-known-text format and return the
80
+ # resulting feature. Returns nil if the string couldn't be parsed.
81
+
82
+ def parse_wkt(_str_)
83
+ nil
84
+ end
85
+
86
+ # Parse the given string in well-known-binary format and return the
87
+ # resulting feature. Returns nil if the string couldn't be parsed.
88
+
89
+ def parse_wkb(_str_)
90
+ nil
91
+ end
92
+
93
+ # Create a feature of type Point.
94
+ # The x and y parameters should be Float values.
95
+ #
96
+ # The extra parameters should be the Z and/or M coordinates, if
97
+ # supported. If both Z and M coordinates are supported, Z should
98
+ # be passed first.
99
+
100
+ def point(_x_, _y_, *_extra_)
101
+ nil
102
+ end
103
+
104
+ # Create a feature of type LineString.
105
+ # The given points argument should be an Enumerable of Point
106
+ # objects, or objects that can be cast to Point.
107
+ #
108
+ # Although implementations are free to attempt to handle input
109
+ # objects that are not of this factory, strictly speaking, the
110
+ # result of building geometries from objects of the wrong factory
111
+ # is undefined.
112
+
113
+ def line_string(_points_)
114
+ nil
115
+ end
116
+
117
+ # Create a feature of type Line.
118
+ # The given point arguments should be Point objects, or objects
119
+ # that can be cast to Point.
120
+ #
121
+ # Although implementations are free to attempt to handle input
122
+ # objects that are not of this factory, strictly speaking, the
123
+ # result of building geometries from objects of the wrong factory
124
+ # is undefined.
125
+
126
+ def line(_start_, _end_)
127
+ nil
128
+ end
129
+
130
+ # Create a feature of type LinearRing.
131
+ # The given points argument should be an Enumerable of Point
132
+ # objects, or objects that can be cast to Point.
133
+ # If the first and last points are not equal, the ring is
134
+ # automatically closed by appending the first point to the end of the
135
+ # string.
136
+ #
137
+ # Although implementations are free to attempt to handle input
138
+ # objects that are not of this factory, strictly speaking, the
139
+ # result of building geometries from objects of the wrong factory
140
+ # is undefined.
141
+
142
+ def linear_ring(_points_)
143
+ nil
144
+ end
145
+
146
+ # Create a feature of type Polygon.
147
+ # The outer_ring should be a LinearRing, or an object that can be
148
+ # cast to LinearRing.
149
+ # The inner_rings should be a possibly empty Enumerable of
150
+ # LinearRing (or objects that can be casted to LinearRing).
151
+ # You may also pass nil to indicate no inner rings.
152
+ #
153
+ # Although implementations are free to attempt to handle input
154
+ # objects that are not of this factory, strictly speaking, the
155
+ # result of building geometries from objects of the wrong factory
156
+ # is undefined.
157
+
158
+ def polygon(_outer_ring_, _inner_rings_ = nil)
159
+ nil
160
+ end
161
+
162
+ # Create a feature of type GeometryCollection.
163
+ # The elems should be an Enumerable of Geometry objects.
164
+ #
165
+ # Although implementations are free to attempt to handle input
166
+ # objects that are not of this factory, strictly speaking, the
167
+ # result of building geometries from objects of the wrong factory
168
+ # is undefined.
169
+
170
+ def collection(_elems_)
171
+ nil
172
+ end
173
+
174
+ # Create a feature of type MultiPoint.
175
+ # The elems should be an Enumerable of Point objects, or objects
176
+ # that can be cast to Point.
177
+ # Returns nil if any of the contained geometries is not a Point,
178
+ # which would break the MultiPoint contract.
179
+ #
180
+ # Although implementations are free to attempt to handle input
181
+ # objects that are not of this factory, strictly speaking, the
182
+ # result of building geometries from objects of the wrong factory
183
+ # is undefined.
184
+
185
+ def multi_point(_elems_)
186
+ nil
187
+ end
188
+
189
+ # Create a feature of type MultiLineString.
190
+ # The elems should be an Enumerable of objects that are or can be
191
+ # cast to LineString or any of its subclasses.
192
+ # Returns nil if any of the contained geometries is not a
193
+ # LineString, which would break the MultiLineString contract.
194
+ #
195
+ # Although implementations are free to attempt to handle input
196
+ # objects that are not of this factory, strictly speaking, the
197
+ # result of building geometries from objects of the wrong factory
198
+ # is undefined.
199
+
200
+ def multi_line_string(_elems_)
201
+ nil
202
+ end
203
+
204
+ # Create a feature of type MultiPolygon.
205
+ # The elems should be an Enumerable of objects that are or can be
206
+ # cast to Polygon or any of its subclasses.
207
+ # Returns nil if any of the contained geometries is not a Polygon,
208
+ # which would break the MultiPolygon contract.
209
+ # Also returns nil if any of the other assertions for MultiPolygon
210
+ # are not met, e.g. if any of the polygons overlap.
211
+ #
212
+ # Although implementations are free to attempt to handle input
213
+ # objects that are not of this factory, strictly speaking, the
214
+ # result of building geometries from objects of the wrong factory
215
+ # is undefined.
216
+
217
+ def multi_polygon(_elems_)
218
+ nil
219
+ end
220
+
221
+ # Returns a RGeo::CoordSys::Proj4 representing the projection for
222
+ # the coordinate system of features created by this factory, or nil
223
+ # if there is no such proj4 projection.
224
+
225
+ def proj4
226
+ nil
227
+ end
228
+
229
+ # Returns the coordinate system specification for the features
230
+ # created by this factory, or nil if there is no such coordinate
231
+ # system.
232
+ #
233
+ # NOTE: This is a required method of the factory interface, but the
234
+ # coordinate system classes themselves are not yet available, so
235
+ # implementations should just return nil for now.
236
+
237
+ def coord_sys
238
+ nil
239
+ end
240
+
241
+ # This is an optional method that may be implemented to customize
242
+ # casting for this factory. Basically, RGeo defines standard ways
243
+ # to cast certain types of objects from one factory to another and
244
+ # one SFS type to another. However, a factory may choose to
245
+ # override how things are casted TO its implementation using this
246
+ # method. It can do this to optimize certain casting cases, or
247
+ # implement special cases particular to this factory.
248
+ #
249
+ # This method will be called (if defined) on the destination
250
+ # factory, and will be passed the original object (which may or may
251
+ # not already be created by this factory), the SFS feature type
252
+ # (which again may or may not already be the type of the original
253
+ # object), and a hash of additional flags. These flags are:
254
+ #
255
+ # [<tt>:keep_subtype</tt>]
256
+ # indicates whether to keep the subtype if casting to a supertype
257
+ # of the current type
258
+ # [<tt>:force_new</tt>]
259
+ # indicates whether to force the creation of a new object even if
260
+ # the original is already of the desired factory and type
261
+ # [<tt>:project</tt>]
262
+ # indicates whether to project the coordinates from the source to
263
+ # the destination proj4 coordinate system, if available
264
+ #
265
+ # It should return either a casted result object, false, or nil.
266
+ # A nil return value indicates that casting should be forced to
267
+ # fail (and RGeo::Feature.cast will return nil).
268
+ # A false return value indicates that this method declines to
269
+ # override the casting algorithm, and RGeo should use its default
270
+ # algorithm to cast the object. Therefore, by default, you should
271
+ # return false.
272
+
273
+ def override_cast(_original_, _type_, _flags_)
274
+ false
275
+ end
276
+ end
277
+ end
278
+ end
@@ -0,0 +1,96 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Feature factory interface
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ module RGeo
8
+ module Feature
9
+ # A FactoryGenerator is a callable object (usually a Proc) that
10
+ # takes a configuration as a hash and returns a factory. These are
11
+ # often used, e.g., by parsers to determine what factory the parsed
12
+ # geometry should have.
13
+ #
14
+ # See the call method for a list of common configuration parameters.
15
+ # Different generators will support different parameters. There is
16
+ # no mechanism defined to reflect on the parameters understood by a
17
+ # factory generator.
18
+ #
19
+ # Many of the implementations provide a factory method for creating
20
+ # factories. For example, RGeo::Cartesian.preferred_factory can be
21
+ # called to create a factory using the preferred Cartesian
22
+ # implementation. Thus, to get a corresponding factory generator,
23
+ # you can use the <tt>method</tt> method. e.g.
24
+ #
25
+ # factory_generator = ::RGeo::Cartesian.method(:preferred_factory)
26
+ #
27
+ # FactoryGenerator is defined as a module and is provided
28
+ # primarily for the sake of documentation. Implementations need not
29
+ # necessarily include this module itself. Therefore, you should not
30
+ # depend on the kind_of? method to determine if an object is a
31
+ # factory generator.
32
+
33
+ module FactoryGenerator
34
+ # Generate a factory given a configuration as a hash.
35
+ #
36
+ # If the generator does not recognize or does not support a given
37
+ # configuration value, the behavior is usually determined by the
38
+ # <tt>:strict</tt> configuration element. If <tt>strict</tt> is
39
+ # set to true, the generator should fail fast by returning nil or
40
+ # raising an exception. If it is set to false, the generator should
41
+ # attempt to do the best it can, even if it means returning a
42
+ # factory that does not match the requested configuration.
43
+ #
44
+ # Common parameters are as follows. These are intended as a
45
+ # recommendation only. There is no hard requirement for any
46
+ # particular factory generator to support them.
47
+ #
48
+ # [<tt>:strict</tt>]
49
+ # If true, return nil or raise an exception if any configuration
50
+ # was not recognized or not supportable. Otherwise, if false,
51
+ # the generator should attempt to do its best to return some
52
+ # viable factory, even if it does not strictly match the
53
+ # requested configuration. Default is usually false.
54
+ # [<tt>:srid</tt>]
55
+ # The SRID for the factory and objects it creates.
56
+ # Default is usually 0.
57
+ # [<tt>:proj4</tt>]
58
+ # The coordinate system in Proj4 format, either as a
59
+ # CoordSys::Proj4 object or as a string or hash representing the
60
+ # proj4 format. This is usually an optional parameter; the default
61
+ # is usually nil.
62
+ # [<tt>:coord_sys</tt>]
63
+ # The coordinate system in OGC form, either as a subclass of
64
+ # CoordSys::CS::CoordinateSystem, or as a string in WKT format.
65
+ # This is usually an optional parameter; the default is usually
66
+ # nil.
67
+ # [<tt>:srs_database</tt>]
68
+ # If provided, look up the Proj4 and OGC coordinate systems from
69
+ # the given database and SRID.
70
+ # [<tt>:has_z_coordinate</tt>]
71
+ # Support Z coordinates. Default is usually false.
72
+ # [<tt>:has_m_coordinate</tt>]
73
+ # Support M coordinates. Default is usually false.
74
+
75
+ def call(_config_ = {})
76
+ nil
77
+ end
78
+
79
+ # Return a new FactoryGenerator that always returns the given
80
+ # factory.
81
+
82
+ def self.single(factory_)
83
+ ::Proc.new { |_c_| factory_ }
84
+ end
85
+
86
+ # Return a new FactoryGenerator that calls the given delegate, but
87
+ # modifies the configuration passed to it. You can provide defaults
88
+ # for configuration values not explicitly specified, and you can
89
+ # force certain values to override the given configuration.
90
+
91
+ def self.decorate(delegate_, default_config_ = {}, force_config_ = {})
92
+ ::Proc.new { |c_| delegate_.call(default_config_.merge(c_).merge(force_config_)) }
93
+ end
94
+ end
95
+ end
96
+ end