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,80 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # GEOS implementation additions written in Ruby
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ module RGeo
8
+ module Geos
9
+ class ZMPointImpl # :nodoc:
10
+ include ZMGeometryMethods
11
+ include ZMPointMethods
12
+
13
+ Feature::MixinCollection::GLOBAL.for_type(Feature::Point).include_in_class(self, true)
14
+ end
15
+
16
+ class ZMLineStringImpl # :nodoc:
17
+ include ZMGeometryMethods
18
+ include ZMLineStringMethods
19
+
20
+ Feature::MixinCollection::GLOBAL.for_type(Feature::LineString).include_in_class(self, true)
21
+ end
22
+
23
+ class ZMLinearRingImpl # :nodoc:
24
+ include ZMGeometryMethods
25
+ include ZMLineStringMethods
26
+
27
+ Feature::MixinCollection::GLOBAL.for_type(Feature::LinearRing).include_in_class(self, true)
28
+ end
29
+
30
+ class ZMLineImpl # :nodoc:
31
+ include ZMGeometryMethods
32
+ include ZMLineStringMethods
33
+
34
+ Feature::MixinCollection::GLOBAL.for_type(Feature::Line).include_in_class(self, true)
35
+ end
36
+
37
+ class ZMPolygonImpl # :nodoc:
38
+ include ZMGeometryMethods
39
+ include ZMPolygonMethods
40
+
41
+ Feature::MixinCollection::GLOBAL.for_type(Feature::Polygon).include_in_class(self, true)
42
+ end
43
+
44
+ class ZMGeometryCollectionImpl # :nodoc:
45
+ include ZMGeometryMethods
46
+ include ZMGeometryCollectionMethods
47
+
48
+ Feature::MixinCollection::GLOBAL.for_type(Feature::GeometryCollection).include_in_class(self, true)
49
+ end
50
+
51
+ class ZMMultiPointImpl # :nodoc:
52
+ include ZMGeometryMethods
53
+ include ZMGeometryCollectionMethods
54
+
55
+ Feature::MixinCollection::GLOBAL.for_type(Feature::MultiPoint).include_in_class(self, true)
56
+ end
57
+
58
+ class ZMMultiLineStringImpl # :nodoc:
59
+ include ZMGeometryMethods
60
+ include ZMGeometryCollectionMethods
61
+ include ZMMultiLineStringMethods
62
+
63
+ Feature::MixinCollection::GLOBAL.for_type(Feature::MultiLineString).include_in_class(self, true)
64
+ end
65
+
66
+ class ZMMultiPolygonImpl # :nodoc:
67
+ include ZMGeometryMethods
68
+ include ZMGeometryCollectionMethods
69
+ include ZMMultiPolygonMethods
70
+
71
+ Feature::MixinCollection::GLOBAL.for_type(Feature::MultiPolygon).include_in_class(self, true)
72
+ end
73
+
74
+ class ZMGeometryImpl # :nodoc:
75
+ include ZMGeometryMethods
76
+
77
+ Feature::MixinCollection::GLOBAL.for_type(Feature::Geometry).include_in_class(self, true)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,344 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # GEOS implementation additions written in Ruby
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ module RGeo
8
+ module Geos
9
+ module ZMGeometryMethods # :nodoc:
10
+ include Feature::Instance
11
+
12
+ def initialize(factory_, zgeometry_, mgeometry_)
13
+ @factory = factory_
14
+ @zgeometry = zgeometry_
15
+ @mgeometry = mgeometry_
16
+ end
17
+
18
+ def inspect # :nodoc:
19
+ "#<#{self.class}:0x#{object_id.to_s(16)} #{as_text.inspect}>"
20
+ end
21
+
22
+ def to_s # :nodoc:
23
+ as_text
24
+ end
25
+
26
+ def hash
27
+ @factory.hash ^ @zgeometry.hash ^ @mgeometry.hash
28
+ end
29
+
30
+ def factory
31
+ @factory
32
+ end
33
+
34
+ def z_geometry
35
+ @zgeometry
36
+ end
37
+
38
+ def m_geometry
39
+ @mgeometry
40
+ end
41
+
42
+ def dimension
43
+ @zgeometry.dimension
44
+ end
45
+
46
+ def geometry_type
47
+ @zgeometry.geometry_type
48
+ end
49
+
50
+ def srid
51
+ @factory.srid
52
+ end
53
+
54
+ def envelope
55
+ @factory._create_feature(nil, @zgeometry.envelope, @mgeometry.envelope)
56
+ end
57
+
58
+ def as_text
59
+ @factory.instance_variable_get(:@wkt_generator).generate(self)
60
+ end
61
+
62
+ def as_binary
63
+ @factory.instance_variable_get(:@wkb_generator).generate(self)
64
+ end
65
+
66
+ def is_empty?
67
+ @zgeometry.is_empty?
68
+ end
69
+
70
+ def is_simple?
71
+ @zgeometry.is_simple?
72
+ end
73
+
74
+ def boundary
75
+ @factory._create_feature(nil, @zgeometry.boundary, @mgeometry.boundary)
76
+ end
77
+
78
+ def equals?(rhs_)
79
+ @zgeometry.equals?(::RGeo::Feature.cast(rhs_, self).z_geometry)
80
+ end
81
+
82
+ def disjoint?(rhs_)
83
+ @zgeometry.disjoint?(::RGeo::Feature.cast(rhs_, self).z_geometry)
84
+ end
85
+
86
+ def intersects?(rhs_)
87
+ @zgeometry.intersects?(::RGeo::Feature.cast(rhs_, self).z_geometry)
88
+ end
89
+
90
+ def touches?(rhs_)
91
+ @zgeometry.touches?(::RGeo::Feature.cast(rhs_, self).z_geometry)
92
+ end
93
+
94
+ def crosses?(rhs_)
95
+ @zgeometry.crosses?(::RGeo::Feature.cast(rhs_, self).z_geometry)
96
+ end
97
+
98
+ def within?(rhs_)
99
+ @zgeometry.within?(::RGeo::Feature.cast(rhs_, self).z_geometry)
100
+ end
101
+
102
+ def contains?(rhs_)
103
+ @zgeometry.contains?(::RGeo::Feature.cast(rhs_, self).z_geometry)
104
+ end
105
+
106
+ def overlaps?(rhs_)
107
+ @zgeometry.overlaps?(::RGeo::Feature.cast(rhs_, self).z_geometry)
108
+ end
109
+
110
+ def relate?(rhs_, pattern_)
111
+ @zgeometry.relate?(::RGeo::Feature.cast(rhs_, self).z_geometry, pattern_)
112
+ end
113
+ alias_method :relate, :relate? # DEPRECATED
114
+
115
+ def distance(rhs_)
116
+ @zgeometry.distance(::RGeo::Feature.cast(rhs_, self).z_geometry)
117
+ end
118
+
119
+ def buffer(distance_)
120
+ @factory._create_feature(nil, @zgeometry.buffer(distance_), @mgeometry.buffer(distance_))
121
+ end
122
+
123
+ def convex_hull
124
+ @factory._create_feature(nil, @zgeometry.convex_hull, @mgeometry.convex_hull)
125
+ end
126
+
127
+ def intersection(rhs_)
128
+ rhs_ = ::RGeo::Feature.cast(rhs_, self)
129
+ @factory._create_feature(nil, @zgeometry.intersection(rhs_.z_geometry), @mgeometry.intersection(rhs_.m_geometry))
130
+ end
131
+
132
+ def union(rhs_)
133
+ rhs_ = ::RGeo::Feature.cast(rhs_, self)
134
+ @factory._create_feature(nil, @zgeometry.union(rhs_.z_geometry), @mgeometry.union(rhs_.m_geometry))
135
+ end
136
+
137
+ def difference(rhs_)
138
+ rhs_ = ::RGeo::Feature.cast(rhs_, self)
139
+ @factory._create_feature(nil, @zgeometry.difference(rhs_.z_geometry), @mgeometry.difference(rhs_.m_geometry))
140
+ end
141
+
142
+ def sym_difference(rhs_)
143
+ rhs_ = ::RGeo::Feature.cast(rhs_, self)
144
+ @factory._create_feature(nil, @zgeometry.sym_difference(rhs_.z_geometry), @mgeometry.sym_difference(rhs_.m_geometry))
145
+ end
146
+
147
+ def rep_equals?(rhs_)
148
+ rhs_ = ::RGeo::Feature.cast(rhs_, self)
149
+ rhs_.is_a?(self.class) && @factory.eql?(rhs_.factory) && @zgeometry.rep_equals?(rhs_.z_geometry) && @mgeometry.rep_equals?(rhs_.m_geometry)
150
+ end
151
+
152
+ alias_method :eql?, :rep_equals?
153
+ alias_method :==, :equals?
154
+
155
+ alias_method :-, :difference
156
+ alias_method :+, :union
157
+ alias_method :*, :intersection
158
+
159
+ def _copy_state_from(obj_) # :nodoc:
160
+ @factory = obj_.factory
161
+ @zgeometry = obj_.z_geometry
162
+ @mgeometry = obj_.m_geometry
163
+ end
164
+
165
+ def marshal_dump # :nodoc:
166
+ [@factory, @factory._marshal_wkb_generator.generate(self)]
167
+ end
168
+
169
+ def marshal_load(data_) # :nodoc:
170
+ _copy_state_from(data_[0]._marshal_wkb_parser.parse(data_[1]))
171
+ end
172
+
173
+ def encode_with(coder_) # :nodoc:
174
+ coder_["factory"] = @factory
175
+ coder_["wkt"] = @factory._psych_wkt_generator.generate(self)
176
+ end
177
+
178
+ def init_with(coder_) # :nodoc:
179
+ _copy_state_from(coder_["factory"]._psych_wkt_parser.parse(coder_["wkt"]))
180
+ end
181
+ end
182
+
183
+ module ZMPointMethods # :nodoc:
184
+ def x
185
+ @zgeometry.x
186
+ end
187
+
188
+ def y
189
+ @zgeometry.y
190
+ end
191
+
192
+ def z
193
+ @zgeometry.z
194
+ end
195
+
196
+ def m
197
+ @mgeometry.m
198
+ end
199
+
200
+ def coordinates
201
+ [x, y].tap do |coords|
202
+ coords << z if @factory.property(:has_z_coordinate)
203
+ coords << m if @factory.property(:has_m_coordinate)
204
+ end
205
+ end
206
+ end
207
+
208
+ module ZMLineStringMethods # :nodoc:
209
+ def length
210
+ @zgeometry.length
211
+ end
212
+
213
+ def start_point
214
+ point_n(0)
215
+ end
216
+
217
+ def end_point
218
+ point_n(num_points - 1)
219
+ end
220
+
221
+ def is_closed?
222
+ @zgeometry.is_closed?
223
+ end
224
+
225
+ def is_ring?
226
+ @zgeometry.is_ring?
227
+ end
228
+
229
+ def num_points
230
+ @zgeometry.num_points
231
+ end
232
+
233
+ def point_n(n_)
234
+ @factory._create_feature(ZMPointImpl, @zgeometry.point_n(n_), @mgeometry.point_n(n_))
235
+ end
236
+
237
+ def points
238
+ result_ = []
239
+ zpoints_ = @zgeometry.points
240
+ mpoints_ = @mgeometry.points
241
+ zpoints_.size.times do |i_|
242
+ result_ << @factory._create_feature(ZMPointImpl, zpoints_[i_], mpoints_[i_])
243
+ end
244
+ result_
245
+ end
246
+
247
+ def coordinates
248
+ points.map(&:coordinates)
249
+ end
250
+ end
251
+
252
+ module ZMPolygonMethods # :nodoc:
253
+ def area
254
+ @zgeometry.area
255
+ end
256
+
257
+ def centroid
258
+ @factory._create_feature(ZMPointImpl, @zgeometry.centroid, @mgeometry.centroid)
259
+ end
260
+
261
+ def point_on_surface
262
+ @factory._create_feature(ZMPointImpl, @zgeometry.centroid, @mgeometry.centroid)
263
+ end
264
+
265
+ def exterior_ring
266
+ @factory._create_feature(ZMLineStringImpl, @zgeometry.exterior_ring, @mgeometry.exterior_ring)
267
+ end
268
+
269
+ def num_interior_rings
270
+ @zgeometry.num_interior_rings
271
+ end
272
+
273
+ def interior_ring_n(n_)
274
+ @factory._create_feature(ZMLineStringImpl, @zgeometry.interior_ring_n(n_), @mgeometry.interior_ring_n(n_))
275
+ end
276
+
277
+ def interior_rings
278
+ result_ = []
279
+ zrings_ = @zgeometry.interior_rings
280
+ mrings_ = @mgeometry.interior_rings
281
+ zrings_.size.times do |i_|
282
+ result_ << @factory._create_feature(ZMLineStringImpl, zrings_[i_], mrings_[i_])
283
+ end
284
+ result_
285
+ end
286
+
287
+ def coordinates
288
+ ([exterior_ring] + interior_rings).map(&:coordinates)
289
+ end
290
+ end
291
+
292
+ module ZMGeometryCollectionMethods # :nodoc:
293
+ def num_geometries
294
+ @zgeometry.num_geometries
295
+ end
296
+ alias_method :size, :num_geometries
297
+
298
+ def geometry_n(n_)
299
+ @factory._create_feature(nil, @zgeometry.geometry_n(n_), @mgeometry.geometry_n(n_))
300
+ end
301
+ alias_method :[], :geometry_n
302
+
303
+ def each
304
+ num_geometries.times do |i_|
305
+ yield geometry_n(i_)
306
+ end
307
+ end
308
+
309
+ include ::Enumerable
310
+ end
311
+
312
+ module ZMMultiLineStringMethods # :nodoc:
313
+ def length
314
+ @zgeometry.length
315
+ end
316
+
317
+ def is_closed?
318
+ @zgeometry.is_closed?
319
+ end
320
+
321
+ def coordinates
322
+ each.map(&:coordinates)
323
+ end
324
+ end
325
+
326
+ module ZMMultiPolygonMethods # :nodoc:
327
+ def area
328
+ @zgeometry.area
329
+ end
330
+
331
+ def centroid
332
+ @factory._create_feature(ZMPointImpl, @zgeometry.centroid, @mgeometry.centroid)
333
+ end
334
+
335
+ def point_on_surface
336
+ @factory._create_feature(ZMPointImpl, @zgeometry.centroid, @mgeometry.centroid)
337
+ end
338
+
339
+ def coordinates
340
+ each.map(&:coordinates)
341
+ end
342
+ end
343
+ end
344
+ end
@@ -0,0 +1,19 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Implementation helpers namespace for RGeo
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ module RGeo
8
+ module ImplHelper # :nodoc:
9
+ end
10
+ end
11
+
12
+ # Implementation files
13
+ require "rgeo/impl_helper/utils"
14
+ require "rgeo/impl_helper/math"
15
+ require "rgeo/impl_helper/basic_geometry_methods"
16
+ require "rgeo/impl_helper/basic_geometry_collection_methods"
17
+ require "rgeo/impl_helper/basic_point_methods"
18
+ require "rgeo/impl_helper/basic_line_string_methods"
19
+ require "rgeo/impl_helper/basic_polygon_methods"
@@ -0,0 +1,185 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Common methods for GeometryCollection features
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ module RGeo
8
+ module ImplHelper # :nodoc:
9
+ module BasicGeometryCollectionMethods # :nodoc:
10
+ def initialize(factory_, elements_)
11
+ _set_factory(factory_)
12
+ @elements = elements_.map do |elem_|
13
+ elem_ = Feature.cast(elem_, factory_)
14
+ raise Error::InvalidGeometry, "Could not cast #{elem_}" unless elem_
15
+ elem_
16
+ end
17
+ _validate_geometry
18
+ end
19
+
20
+ def num_geometries
21
+ @elements.size
22
+ end
23
+
24
+ def geometry_n(n_)
25
+ n_ < 0 ? nil : @elements[n_]
26
+ end
27
+
28
+ def [](n_)
29
+ @elements[n_]
30
+ end
31
+
32
+ def each(&block_)
33
+ @elements.each(&block_)
34
+ end
35
+
36
+ def dimension
37
+ unless defined?(@dimension)
38
+ @dimension = -1
39
+ @elements.each do |elem_|
40
+ dim_ = elem_.dimension
41
+ @dimension = dim_ if @dimension < dim_
42
+ end
43
+ end
44
+ @dimension
45
+ end
46
+
47
+ def geometry_type
48
+ Feature::GeometryCollection
49
+ end
50
+
51
+ def is_empty?
52
+ @elements.size == 0
53
+ end
54
+
55
+ def rep_equals?(rhs_)
56
+ if rhs_.is_a?(self.class) && rhs_.factory.eql?(@factory) && @elements.size == rhs_.num_geometries
57
+ rhs_.each_with_index { |p_, i_| return false unless @elements[i_].rep_equals?(p_) }
58
+ else
59
+ false
60
+ end
61
+ end
62
+
63
+ def hash
64
+ @hash ||= begin
65
+ hash_ = [factory, geometry_type].hash
66
+ @elements.inject(hash_) { |h_, g_| (1_664_525 * h_ + g_.hash).hash }
67
+ end
68
+ end
69
+
70
+ def _copy_state_from(obj_) # :nodoc:
71
+ super
72
+ @elements = obj_._elements
73
+ end
74
+
75
+ def _elements # :nodoc:
76
+ @elements
77
+ end
78
+ end
79
+
80
+ module BasicMultiLineStringMethods # :nodoc:
81
+ def initialize(factory_, elements_)
82
+ _set_factory(factory_)
83
+ @elements = elements_.map do |elem_|
84
+ elem_ = Feature.cast(elem_, factory_, Feature::LineString, :keep_subtype)
85
+ raise Error::InvalidGeometry, "Could not cast #{elem_}" unless elem_
86
+ elem_
87
+ end
88
+ _validate_geometry
89
+ end
90
+
91
+ def geometry_type
92
+ Feature::MultiLineString
93
+ end
94
+
95
+ def is_closed?
96
+ all?(&:is_closed?)
97
+ end
98
+
99
+ def length
100
+ @elements.inject(0.0) { |sum_, obj_| sum_ + obj_.length }
101
+ end
102
+
103
+ def _add_boundary(hash_, point_) # :nodoc:
104
+ hval_ = [point_.x, point_.y].hash
105
+ (hash_[hval_] ||= [point_, 0])[1] += 1
106
+ end
107
+
108
+ def boundary
109
+ hash_ = {}
110
+ @elements.each do |line_|
111
+ if !line_.is_empty? && !line_.is_closed?
112
+ _add_boundary(hash_, line_.start_point)
113
+ _add_boundary(hash_, line_.end_point)
114
+ end
115
+ end
116
+ array_ = []
117
+ hash_.each do |_hval_, data_|
118
+ array_ << data_[0] if data_[1].odd?
119
+ end
120
+ factory.multi_point([array_])
121
+ end
122
+
123
+ def coordinates
124
+ @elements.map(&:coordinates)
125
+ end
126
+ end
127
+
128
+ module BasicMultiPointMethods # :nodoc:
129
+ def initialize(factory_, elements_)
130
+ _set_factory(factory_)
131
+ @elements = elements_.map do |elem_|
132
+ elem_ = Feature.cast(elem_, factory_, Feature::Point, :keep_subtype)
133
+ raise Error::InvalidGeometry, "Could not cast #{elem_}" unless elem_
134
+ elem_
135
+ end
136
+ _validate_geometry
137
+ end
138
+
139
+ def geometry_type
140
+ Feature::MultiPoint
141
+ end
142
+
143
+ def boundary
144
+ factory.collection([])
145
+ end
146
+
147
+ def coordinates
148
+ @elements.map(&:coordinates)
149
+ end
150
+ end
151
+
152
+ module BasicMultiPolygonMethods # :nodoc:
153
+ def initialize(factory_, elements_)
154
+ _set_factory(factory_)
155
+ @elements = elements_.map do |elem_|
156
+ elem_ = Feature.cast(elem_, factory_, Feature::Polygon, :keep_subtype)
157
+ raise Error::InvalidGeometry, "Could not cast #{elem_}" unless elem_
158
+ elem_
159
+ end
160
+ _validate_geometry
161
+ end
162
+
163
+ def geometry_type
164
+ Feature::MultiPolygon
165
+ end
166
+
167
+ def area
168
+ @elements.inject(0.0) { |sum_, obj_| sum_ + obj_.area }
169
+ end
170
+
171
+ def boundary
172
+ array_ = []
173
+ @elements.each do |poly_|
174
+ array_ << poly_.exterior_ring unless poly_.is_empty?
175
+ array_.concat(poly_.interior_rings)
176
+ end
177
+ factory.multi_line_string(array_)
178
+ end
179
+
180
+ def coordinates
181
+ @elements.map(&:coordinates)
182
+ end
183
+ end
184
+ end
185
+ end