rgeo 0.3.13 → 0.3.14

Sign up to get free protection for your applications and to get access to all the features.
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