rgeo 0.3.13 → 0.3.14

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 (51) hide show
  1. data/History.rdoc +8 -0
  2. data/README.rdoc +4 -4
  3. data/Version +1 -1
  4. data/ext/geos_c_impl/extconf.rb +1 -0
  5. data/ext/geos_c_impl/factory.c +118 -5
  6. data/ext/geos_c_impl/factory.h +24 -1
  7. data/ext/geos_c_impl/geometry.c +42 -53
  8. data/ext/geos_c_impl/geometry_collection.c +137 -54
  9. data/ext/geos_c_impl/geometry_collection.h +9 -0
  10. data/ext/geos_c_impl/line_string.c +88 -45
  11. data/ext/geos_c_impl/point.c +31 -17
  12. data/ext/geos_c_impl/polygon.c +50 -22
  13. data/ext/geos_c_impl/polygon.h +9 -0
  14. data/ext/geos_c_impl/preface.h +10 -0
  15. data/lib/rgeo/cartesian/factory.rb +9 -1
  16. data/lib/rgeo/coord_sys/cs/entities.rb +10 -1
  17. data/lib/rgeo/coord_sys/proj4.rb +1 -1
  18. data/lib/rgeo/feature/types.rb +29 -5
  19. data/lib/rgeo/geographic/factory.rb +5 -0
  20. data/lib/rgeo/geographic/projected_feature_classes.rb +3 -47
  21. data/lib/rgeo/geographic/projected_feature_methods.rb +69 -0
  22. data/lib/rgeo/geographic/spherical_feature_classes.rb +1 -74
  23. data/lib/rgeo/geographic/spherical_feature_methods.rb +84 -0
  24. data/lib/rgeo/geographic/spherical_math.rb +3 -3
  25. data/lib/rgeo/geos.rb +17 -9
  26. data/lib/rgeo/geos/{factory.rb → capi_factory.rb} +36 -15
  27. data/lib/rgeo/geos/{impl_additions.rb → capi_feature_classes.rb} +127 -16
  28. data/lib/rgeo/geos/ffi_factory.rb +55 -41
  29. data/lib/rgeo/geos/ffi_feature_classes.rb +168 -0
  30. data/lib/rgeo/geos/{ffi_classes.rb → ffi_feature_methods.rb} +56 -57
  31. data/lib/rgeo/geos/interface.rb +5 -5
  32. data/lib/rgeo/geos/utils.rb +7 -0
  33. data/lib/rgeo/geos/zm_factory.rb +40 -12
  34. data/lib/rgeo/geos/zm_feature_classes.rb +165 -0
  35. data/lib/rgeo/geos/{zm_impl.rb → zm_feature_methods.rb} +33 -52
  36. data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +8 -0
  37. data/lib/rgeo/impl_helper/basic_line_string_methods.rb +8 -0
  38. data/lib/rgeo/impl_helper/basic_point_methods.rb +5 -0
  39. data/lib/rgeo/impl_helper/basic_polygon_methods.rb +8 -0
  40. data/test/common/factory_tests.rb +8 -2
  41. data/test/common/geometry_collection_tests.rb +23 -0
  42. data/test/common/line_string_tests.rb +25 -0
  43. data/test/common/multi_line_string_tests.rb +7 -0
  44. data/test/common/multi_point_tests.rb +7 -0
  45. data/test/common/multi_polygon_tests.rb +7 -0
  46. data/test/common/point_tests.rb +21 -0
  47. data/test/common/polygon_tests.rb +15 -0
  48. data/test/coord_sys/tc_proj4.rb +8 -1
  49. data/test/geos_capi/tc_misc.rb +1 -1
  50. data/test/tc_mixins.rb +1 -1
  51. metadata +9 -7
@@ -0,0 +1,165 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # GEOS implementation additions written in Ruby
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010-2012 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 Geos
40
+
41
+
42
+ class ZMPointImpl # :nodoc:
43
+
44
+
45
+ include ZMGeometryMethods
46
+ include ZMPointMethods
47
+
48
+ Feature::MixinCollection::GLOBAL.for_type(Feature::Point).include_in_class(self, true)
49
+
50
+
51
+ end
52
+
53
+
54
+ class ZMLineStringImpl # :nodoc:
55
+
56
+
57
+ include ZMGeometryMethods
58
+ include ZMLineStringMethods
59
+
60
+ Feature::MixinCollection::GLOBAL.for_type(Feature::LineString).include_in_class(self, true)
61
+
62
+
63
+ end
64
+
65
+
66
+ class ZMLinearRingImpl # :nodoc:
67
+
68
+
69
+ include ZMGeometryMethods
70
+ include ZMLineStringMethods
71
+
72
+ Feature::MixinCollection::GLOBAL.for_type(Feature::LinearRing).include_in_class(self, true)
73
+
74
+
75
+ end
76
+
77
+
78
+ class ZMLineImpl # :nodoc:
79
+
80
+
81
+ include ZMGeometryMethods
82
+ include ZMLineStringMethods
83
+
84
+ Feature::MixinCollection::GLOBAL.for_type(Feature::Line).include_in_class(self, true)
85
+
86
+
87
+ end
88
+
89
+
90
+ class ZMPolygonImpl # :nodoc:
91
+
92
+
93
+ include ZMGeometryMethods
94
+ include ZMPolygonMethods
95
+
96
+ Feature::MixinCollection::GLOBAL.for_type(Feature::Polygon).include_in_class(self, true)
97
+
98
+
99
+ end
100
+
101
+
102
+ class ZMGeometryCollectionImpl # :nodoc:
103
+
104
+
105
+ include ZMGeometryMethods
106
+ include ZMGeometryCollectionMethods
107
+
108
+ Feature::MixinCollection::GLOBAL.for_type(Feature::GeometryCollection).include_in_class(self, true)
109
+
110
+
111
+ end
112
+
113
+
114
+ class ZMMultiPointImpl # :nodoc:
115
+
116
+
117
+ include ZMGeometryMethods
118
+ include ZMGeometryCollectionMethods
119
+
120
+ Feature::MixinCollection::GLOBAL.for_type(Feature::MultiPoint).include_in_class(self, true)
121
+
122
+
123
+ end
124
+
125
+
126
+ class ZMMultiLineStringImpl # :nodoc:
127
+
128
+
129
+ include ZMGeometryMethods
130
+ include ZMGeometryCollectionMethods
131
+ include ZMMultiLineStringMethods
132
+
133
+ Feature::MixinCollection::GLOBAL.for_type(Feature::MultiLineString).include_in_class(self, true)
134
+
135
+
136
+ end
137
+
138
+
139
+ class ZMMultiPolygonImpl # :nodoc:
140
+
141
+
142
+ include ZMGeometryMethods
143
+ include ZMGeometryCollectionMethods
144
+ include ZMMultiPolygonMethods
145
+
146
+ Feature::MixinCollection::GLOBAL.for_type(Feature::MultiPolygon).include_in_class(self, true)
147
+
148
+
149
+ end
150
+
151
+
152
+ class ZMGeometryImpl # :nodoc:
153
+
154
+
155
+ include ZMGeometryMethods
156
+
157
+ Feature::MixinCollection::GLOBAL.for_type(Feature::Geometry).include_in_class(self, true)
158
+
159
+
160
+ end
161
+
162
+
163
+ end
164
+
165
+ end
@@ -39,7 +39,7 @@ module RGeo
39
39
  module Geos
40
40
 
41
41
 
42
- class ZMGeometryImpl # :nodoc:
42
+ module ZMGeometryMethods # :nodoc:
43
43
 
44
44
  include Feature::Instance
45
45
 
@@ -60,6 +60,11 @@ module RGeo
60
60
  end
61
61
 
62
62
 
63
+ def hash
64
+ @factory.hash ^ @zgeometry.hash ^ @mgeometry.hash
65
+ end
66
+
67
+
63
68
  def factory
64
69
  @factory
65
70
  end
@@ -91,7 +96,7 @@ module RGeo
91
96
 
92
97
 
93
98
  def envelope
94
- ZMGeometryImpl.create(@factory, @zgeometry.envelope, @mgeometry.envelope)
99
+ @factory._create_feature(nil, @zgeometry.envelope, @mgeometry.envelope)
95
100
  end
96
101
 
97
102
 
@@ -116,7 +121,7 @@ module RGeo
116
121
 
117
122
 
118
123
  def boundary
119
- ZMGeometryImpl.create(@factory, @zgeometry.boundary, @mgeometry.boundary)
124
+ @factory._create_feature(nil, @zgeometry.boundary, @mgeometry.boundary)
120
125
  end
121
126
 
122
127
 
@@ -172,36 +177,36 @@ module RGeo
172
177
 
173
178
 
174
179
  def buffer(distance_)
175
- ZMGeometryImpl.create(@factory, @zgeometry.buffer(distance_), @mgeometry.buffer(distance_))
180
+ @factory._create_feature(nil, @zgeometry.buffer(distance_), @mgeometry.buffer(distance_))
176
181
  end
177
182
 
178
183
 
179
184
  def convex_hull
180
- ZMGeometryImpl.create(@factory, @zgeometry.convex_hull, @mgeometry.convex_hull)
185
+ @factory._create_feature(nil, @zgeometry.convex_hull, @mgeometry.convex_hull)
181
186
  end
182
187
 
183
188
 
184
189
  def intersection(rhs_)
185
190
  rhs_ = ::RGeo::Feature.cast(rhs_, self)
186
- ZMGeometryImpl.create(@factory, @zgeometry.intersection(rhs_.z_geometry), @mgeometry.intersection(rhs_.m_geometry))
191
+ @factory._create_feature(nil, @zgeometry.intersection(rhs_.z_geometry), @mgeometry.intersection(rhs_.m_geometry))
187
192
  end
188
193
 
189
194
 
190
195
  def union(rhs_)
191
196
  rhs_ = ::RGeo::Feature.cast(rhs_, self)
192
- ZMGeometryImpl.create(@factory, @zgeometry.union(rhs_.z_geometry), @mgeometry.union(rhs_.m_geometry))
197
+ @factory._create_feature(nil, @zgeometry.union(rhs_.z_geometry), @mgeometry.union(rhs_.m_geometry))
193
198
  end
194
199
 
195
200
 
196
201
  def difference(rhs_)
197
202
  rhs_ = ::RGeo::Feature.cast(rhs_, self)
198
- ZMGeometryImpl.create(@factory, @zgeometry.difference(rhs_.z_geometry), @mgeometry.difference(rhs_.m_geometry))
203
+ @factory._create_feature(nil, @zgeometry.difference(rhs_.z_geometry), @mgeometry.difference(rhs_.m_geometry))
199
204
  end
200
205
 
201
206
 
202
207
  def sym_difference(rhs_)
203
208
  rhs_ = ::RGeo::Feature.cast(rhs_, self)
204
- ZMGeometryImpl.create(@factory, @zgeometry.sym_difference(rhs_.z_geometry), @mgeometry.sym_difference(rhs_.m_geometry))
209
+ @factory._create_feature(nil, @zgeometry.sym_difference(rhs_.z_geometry), @mgeometry.sym_difference(rhs_.m_geometry))
205
210
  end
206
211
 
207
212
 
@@ -247,7 +252,7 @@ module RGeo
247
252
  end
248
253
 
249
254
 
250
- class ZMPointImpl < ZMGeometryImpl # :nodoc:
255
+ module ZMPointMethods # :nodoc:
251
256
 
252
257
 
253
258
  def x
@@ -273,7 +278,7 @@ module RGeo
273
278
  end
274
279
 
275
280
 
276
- class ZMLineStringImpl < ZMGeometryImpl # :nodoc:
281
+ module ZMLineStringMethods # :nodoc:
277
282
 
278
283
 
279
284
  def length
@@ -307,7 +312,7 @@ module RGeo
307
312
 
308
313
 
309
314
  def point_n(n_)
310
- ZMPointImpl.create(@factory, @zgeometry.point_n(n_), @mgeometry.point_n(n_))
315
+ @factory._create_feature(ZMPointImpl, @zgeometry.point_n(n_), @mgeometry.point_n(n_))
311
316
  end
312
317
 
313
318
 
@@ -316,7 +321,7 @@ module RGeo
316
321
  zpoints_ = @zgeometry.points
317
322
  mpoints_ = @mgeometry.points
318
323
  zpoints_.size.times do |i_|
319
- result_ << ZMPointImpl.create(@factory, zpoints_[i_], mpoints_[i_])
324
+ result_ << @factory._create_feature(ZMPointImpl, zpoints_[i_], mpoints_[i_])
320
325
  end
321
326
  result_
322
327
  end
@@ -325,7 +330,7 @@ module RGeo
325
330
  end
326
331
 
327
332
 
328
- class ZMPolygonImpl < ZMGeometryImpl # :nodoc:
333
+ module ZMPolygonMethods # :nodoc:
329
334
 
330
335
 
331
336
  def area
@@ -334,17 +339,17 @@ module RGeo
334
339
 
335
340
 
336
341
  def centroid
337
- ZMPointImpl.create(@factory, @zgeometry.centroid, @mgeometry.centroid)
342
+ @factory._create_feature(ZMPointImpl, @zgeometry.centroid, @mgeometry.centroid)
338
343
  end
339
344
 
340
345
 
341
346
  def point_on_surface
342
- ZMPointImpl.create(@factory, @zgeometry.centroid, @mgeometry.centroid)
347
+ @factory._create_feature(ZMPointImpl, @zgeometry.centroid, @mgeometry.centroid)
343
348
  end
344
349
 
345
350
 
346
351
  def exterior_ring
347
- ZMLineStringImpl.create(@factory, @zgeometry.exterior_ring, @mgeometry.exterior_ring)
352
+ @factory._create_feature(ZMLineStringImpl, @zgeometry.exterior_ring, @mgeometry.exterior_ring)
348
353
  end
349
354
 
350
355
 
@@ -354,7 +359,7 @@ module RGeo
354
359
 
355
360
 
356
361
  def interior_ring_n(n_)
357
- ZMLineStringImpl.create(@factory, @zgeometry.interior_ring_n(n_), @mgeometry.interior_ring_n(n_))
362
+ @factory._create_feature(ZMLineStringImpl, @zgeometry.interior_ring_n(n_), @mgeometry.interior_ring_n(n_))
358
363
  end
359
364
 
360
365
 
@@ -363,7 +368,7 @@ module RGeo
363
368
  zrings_ = @zgeometry.interior_rings
364
369
  mrings_ = @mgeometry.interior_rings
365
370
  zrings_.size.times do |i_|
366
- result_ << ZMLineStringImpl.create(@factory, zrings_[i_], mrings_[i_])
371
+ result_ << @factory._create_feature(ZMLineStringImpl, zrings_[i_], mrings_[i_])
367
372
  end
368
373
  result_
369
374
  end
@@ -372,10 +377,7 @@ module RGeo
372
377
  end
373
378
 
374
379
 
375
- class ZMGeometryCollectionImpl < ZMGeometryImpl # :nodoc:
376
-
377
-
378
- include ::Enumerable
380
+ module ZMGeometryCollectionMethods # :nodoc:
379
381
 
380
382
 
381
383
  def num_geometries
@@ -385,7 +387,7 @@ module RGeo
385
387
 
386
388
 
387
389
  def geometry_n(n_)
388
- ZMGeometryImpl.create(@factory, @zgeometry.geometry_n(n_), @mgeometry.geometry_n(n_))
390
+ @factory._create_feature(nil, @zgeometry.geometry_n(n_), @mgeometry.geometry_n(n_))
389
391
  end
390
392
  alias_method :[], :geometry_n
391
393
 
@@ -397,10 +399,13 @@ module RGeo
397
399
  end
398
400
 
399
401
 
402
+ include ::Enumerable
403
+
404
+
400
405
  end
401
406
 
402
407
 
403
- class ZMMultiLineStringImpl < ZMGeometryCollectionImpl # :nodoc:
408
+ module ZMMultiLineStringMethods # :nodoc:
404
409
 
405
410
 
406
411
  def length
@@ -416,7 +421,7 @@ module RGeo
416
421
  end
417
422
 
418
423
 
419
- class ZMMultiPolygonImpl < ZMGeometryCollectionImpl # :nodoc:
424
+ module ZMMultiPolygonMethods # :nodoc:
420
425
 
421
426
 
422
427
  def area
@@ -425,36 +430,12 @@ module RGeo
425
430
 
426
431
 
427
432
  def centroid
428
- ZMPointImpl.create(@factory, @zgeometry.centroid, @mgeometry.centroid)
433
+ @factory._create_feature(ZMPointImpl, @zgeometry.centroid, @mgeometry.centroid)
429
434
  end
430
435
 
431
436
 
432
437
  def point_on_surface
433
- ZMPointImpl.create(@factory, @zgeometry.centroid, @mgeometry.centroid)
434
- end
435
-
436
-
437
- end
438
-
439
-
440
- class ZMGeometryImpl # :nodoc:
441
-
442
- TYPE_KLASSES = {
443
- Feature::Point => ZMPointImpl,
444
- Feature::LineString => ZMLineStringImpl,
445
- Feature::Line => ZMLineStringImpl,
446
- Feature::LinearRing => ZMLineStringImpl,
447
- Feature::Polygon => ZMPolygonImpl,
448
- Feature::GeometryCollection => ZMGeometryCollectionImpl,
449
- Feature::MultiPoint => ZMGeometryCollectionImpl,
450
- Feature::MultiLineString => ZMMultiLineStringImpl,
451
- Feature::MultiPolygon => ZMMultiPolygonImpl,
452
- }.freeze
453
-
454
-
455
- def self.create(factory_, zgeometry_, mgeometry_)
456
- klass_ = self == ZMGeometryImpl ? TYPE_KLASSES[zgeometry_.geometry_type] : self
457
- klass_ && zgeometry_ && mgeometry_ ? klass_.new(factory_, zgeometry_, mgeometry_) : nil
438
+ @factory._create_feature(ZMPointImpl, @zgeometry.centroid, @mgeometry.centroid)
458
439
  end
459
440
 
460
441
 
@@ -106,6 +106,14 @@ module RGeo
106
106
  end
107
107
 
108
108
 
109
+ def hash
110
+ @hash ||= begin
111
+ hash_ = [factory, geometry_type].hash
112
+ @elements.inject(hash_){ |h_, g_| (1664525 * h_ + g_.hash).hash }
113
+ end
114
+ end
115
+
116
+
109
117
  def _copy_state_from(obj_) # :nodoc:
110
118
  super
111
119
  @elements = obj_._elements
@@ -133,6 +133,14 @@ module RGeo
133
133
  end
134
134
 
135
135
 
136
+ def hash
137
+ @hash ||= begin
138
+ hash_ = [factory, geometry_type].hash
139
+ @points.inject(hash_){ |h_, p_| (1664525 * h_ + p_.hash).hash }
140
+ end
141
+ end
142
+
143
+
136
144
  def _copy_state_from(obj_) # :nodoc:
137
145
  super
138
146
  @points = obj_.points
@@ -130,6 +130,11 @@ module RGeo
130
130
  end
131
131
 
132
132
 
133
+ def hash
134
+ @hash ||= [factory, geometry_type, @x, @y, @z, @m].hash
135
+ end
136
+
137
+
133
138
  def _copy_state_from(obj_) # :nodoc:
134
139
  super
135
140
  @x = obj_.x