rgeo 2.3.1 → 3.0.1

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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -0
  3. data/README.md +23 -14
  4. data/ext/geos_c_impl/analysis.c +30 -25
  5. data/ext/geos_c_impl/analysis.h +8 -7
  6. data/ext/geos_c_impl/coordinates.c +27 -21
  7. data/ext/geos_c_impl/coordinates.h +5 -2
  8. data/ext/geos_c_impl/errors.c +19 -10
  9. data/ext/geos_c_impl/errors.h +11 -4
  10. data/ext/geos_c_impl/extconf.rb +42 -28
  11. data/ext/geos_c_impl/factory.c +540 -451
  12. data/ext/geos_c_impl/factory.h +105 -95
  13. data/ext/geos_c_impl/geometry.c +593 -387
  14. data/ext/geos_c_impl/geometry.h +10 -5
  15. data/ext/geos_c_impl/geometry_collection.c +306 -339
  16. data/ext/geos_c_impl/geometry_collection.h +6 -20
  17. data/ext/geos_c_impl/globals.c +169 -0
  18. data/ext/geos_c_impl/globals.h +46 -0
  19. data/ext/geos_c_impl/line_string.c +271 -231
  20. data/ext/geos_c_impl/line_string.h +5 -8
  21. data/ext/geos_c_impl/main.c +16 -16
  22. data/ext/geos_c_impl/point.c +65 -67
  23. data/ext/geos_c_impl/point.h +4 -7
  24. data/ext/geos_c_impl/polygon.c +137 -135
  25. data/ext/geos_c_impl/polygon.h +11 -11
  26. data/ext/geos_c_impl/preface.h +16 -10
  27. data/ext/geos_c_impl/ruby_more.c +67 -0
  28. data/ext/geos_c_impl/ruby_more.h +25 -0
  29. data/lib/rgeo/cartesian/analysis.rb +5 -3
  30. data/lib/rgeo/cartesian/bounding_box.rb +74 -79
  31. data/lib/rgeo/cartesian/calculations.rb +64 -33
  32. data/lib/rgeo/cartesian/factory.rb +57 -102
  33. data/lib/rgeo/cartesian/feature_classes.rb +68 -46
  34. data/lib/rgeo/cartesian/feature_methods.rb +67 -25
  35. data/lib/rgeo/cartesian/interface.rb +6 -41
  36. data/lib/rgeo/cartesian/planar_graph.rb +373 -0
  37. data/lib/rgeo/cartesian/sweepline_intersector.rb +147 -0
  38. data/lib/rgeo/cartesian/valid_op.rb +69 -0
  39. data/lib/rgeo/cartesian.rb +3 -0
  40. data/lib/rgeo/coord_sys/cs/entities.rb +303 -99
  41. data/lib/rgeo/coord_sys/cs/factories.rb +0 -2
  42. data/lib/rgeo/coord_sys/cs/wkt_parser.rb +90 -42
  43. data/lib/rgeo/coord_sys.rb +1 -20
  44. data/lib/rgeo/error.rb +15 -0
  45. data/lib/rgeo/feature/curve.rb +0 -11
  46. data/lib/rgeo/feature/factory.rb +26 -36
  47. data/lib/rgeo/feature/factory_generator.rb +6 -14
  48. data/lib/rgeo/feature/geometry.rb +146 -66
  49. data/lib/rgeo/feature/geometry_collection.rb +16 -9
  50. data/lib/rgeo/feature/line_string.rb +4 -5
  51. data/lib/rgeo/feature/linear_ring.rb +0 -1
  52. data/lib/rgeo/feature/multi_curve.rb +0 -6
  53. data/lib/rgeo/feature/multi_surface.rb +3 -4
  54. data/lib/rgeo/feature/point.rb +4 -5
  55. data/lib/rgeo/feature/polygon.rb +1 -2
  56. data/lib/rgeo/feature/surface.rb +3 -4
  57. data/lib/rgeo/feature/types.rb +69 -85
  58. data/lib/rgeo/geographic/factory.rb +98 -125
  59. data/lib/rgeo/geographic/interface.rb +69 -166
  60. data/lib/rgeo/geographic/projected_feature_classes.rb +21 -9
  61. data/lib/rgeo/geographic/projected_feature_methods.rb +67 -42
  62. data/lib/rgeo/geographic/projected_window.rb +36 -22
  63. data/lib/rgeo/geographic/{proj4_projector.rb → projector.rb} +3 -5
  64. data/lib/rgeo/geographic/simple_mercator_projector.rb +26 -25
  65. data/lib/rgeo/geographic/spherical_feature_classes.rb +29 -9
  66. data/lib/rgeo/geographic/spherical_feature_methods.rb +86 -9
  67. data/lib/rgeo/geographic/spherical_math.rb +17 -20
  68. data/lib/rgeo/geographic.rb +1 -1
  69. data/lib/rgeo/geos/capi_factory.rb +87 -158
  70. data/lib/rgeo/geos/capi_feature_classes.rb +50 -36
  71. data/lib/rgeo/geos/ffi_factory.rb +105 -173
  72. data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
  73. data/lib/rgeo/geos/ffi_feature_methods.rb +105 -127
  74. data/lib/rgeo/geos/interface.rb +20 -59
  75. data/lib/rgeo/geos/utils.rb +5 -5
  76. data/lib/rgeo/geos/zm_factory.rb +53 -95
  77. data/lib/rgeo/geos/zm_feature_methods.rb +30 -33
  78. data/lib/rgeo/geos.rb +8 -8
  79. data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +9 -22
  80. data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -2
  81. data/lib/rgeo/impl_helper/basic_line_string_methods.rb +28 -56
  82. data/lib/rgeo/impl_helper/basic_point_methods.rb +2 -14
  83. data/lib/rgeo/impl_helper/basic_polygon_methods.rb +17 -26
  84. data/lib/rgeo/impl_helper/utils.rb +21 -0
  85. data/lib/rgeo/impl_helper/valid_op.rb +350 -0
  86. data/lib/rgeo/impl_helper/validity_check.rb +139 -0
  87. data/lib/rgeo/impl_helper.rb +1 -0
  88. data/lib/rgeo/version.rb +1 -1
  89. data/lib/rgeo/wkrep/wkb_generator.rb +73 -63
  90. data/lib/rgeo/wkrep/wkb_parser.rb +33 -31
  91. data/lib/rgeo/wkrep/wkt_generator.rb +52 -45
  92. data/lib/rgeo/wkrep/wkt_parser.rb +48 -35
  93. data/lib/rgeo.rb +1 -3
  94. metadata +50 -13
  95. data/lib/rgeo/coord_sys/srs_database/entry.rb +0 -107
  96. data/lib/rgeo/coord_sys/srs_database/sr_org.rb +0 -64
  97. data/lib/rgeo/coord_sys/srs_database/url_reader.rb +0 -65
@@ -2,38 +2,35 @@
2
2
  Geometry collection methods for GEOS wrapper
3
3
  */
4
4
 
5
-
6
5
  #include "preface.h"
7
6
 
8
7
  #ifdef RGEO_GEOS_SUPPORTED
9
8
 
10
- #include <ruby.h>
11
9
  #include <geos_c.h>
10
+ #include <ruby.h>
12
11
 
12
+ #include "coordinates.h"
13
+ #include "errors.h"
13
14
  #include "factory.h"
14
15
  #include "geometry.h"
16
+ #include "geometry_collection.h"
17
+ #include "globals.h"
15
18
  #include "line_string.h"
16
19
  #include "polygon.h"
17
- #include "geometry_collection.h"
18
-
19
- #include "coordinates.h"
20
20
 
21
21
  RGEO_BEGIN_C
22
22
 
23
-
24
23
  /**** INTERNAL IMPLEMENTATION OF CREATE ****/
25
24
 
26
-
27
25
  // Main implementation of the "create" class method for geometry collections.
28
26
  // You must pass in the correct GEOS geometry type ID.
29
27
 
30
- static VALUE create_geometry_collection(VALUE module, int type, VALUE factory, VALUE array)
28
+ static VALUE
29
+ create_geometry_collection(VALUE module, int type, VALUE factory, VALUE array)
31
30
  {
32
31
  VALUE result;
33
32
  unsigned int len;
34
33
  GEOSGeometry** geoms;
35
- RGeo_FactoryData* factory_data;
36
- GEOSContextHandle_t geos_context;
37
34
  VALUE klass;
38
35
  unsigned int i;
39
36
  unsigned int j;
@@ -41,99 +38,73 @@ static VALUE create_geometry_collection(VALUE module, int type, VALUE factory, V
41
38
  VALUE cast_type;
42
39
  GEOSGeometry* geom;
43
40
  GEOSGeometry* collection;
44
- char problem;
45
- GEOSGeometry* igeom;
46
- GEOSGeometry* jgeom;
41
+ int state = 0;
47
42
 
48
43
  result = Qnil;
49
44
  Check_Type(array, T_ARRAY);
50
45
  len = (unsigned int)RARRAY_LEN(array);
51
46
  geoms = ALLOC_N(GEOSGeometry*, len == 0 ? 1 : len);
52
- if (geoms) {
53
- factory_data = RGEO_FACTORY_DATA_PTR(factory);
54
- geos_context = factory_data->geos_context;
55
- klasses = Qnil;
56
- cast_type = Qnil;
57
- switch (type) {
47
+ if (!geoms) {
48
+ rb_raise(rb_eRGeoError, "not enough memory available");
49
+ }
50
+
51
+ klasses = Qnil;
52
+ cast_type = Qnil;
53
+ switch (type) {
58
54
  case GEOS_MULTIPOINT:
59
- cast_type = factory_data->globals->feature_point;
55
+ cast_type = rgeo_feature_point_module;
60
56
  break;
61
57
  case GEOS_MULTILINESTRING:
62
- cast_type = factory_data->globals->feature_line_string;
58
+ cast_type = rgeo_feature_line_string_module;
63
59
  break;
64
60
  case GEOS_MULTIPOLYGON:
65
- cast_type = factory_data->globals->feature_polygon;
61
+ cast_type = rgeo_feature_polygon_module;
66
62
  break;
67
- }
68
- for (i=0; i<len; ++i) {
69
- geom = rgeo_convert_to_detached_geos_geometry(rb_ary_entry(array, i), factory, cast_type, &klass);
70
- if (!geom) {
71
- break;
72
- }
73
- geoms[i] = geom;
74
- if (!NIL_P(klass) && NIL_P(klasses)) {
75
- klasses = rb_ary_new2(len);
76
- for (j=0; j<i; ++j) {
77
- rb_ary_push(klasses, Qnil);
78
- }
79
- }
80
- if (!NIL_P(klasses)) {
81
- rb_ary_push(klasses, klass);
63
+ }
64
+ for (i = 0; i < len; ++i) {
65
+ geom = rgeo_convert_to_detached_geos_geometry(
66
+ rb_ary_entry(array, i), factory, cast_type, &klass, &state);
67
+ if (state) {
68
+ for (j = 0; j < i; j++) {
69
+ GEOSGeom_destroy(geoms[j]);
82
70
  }
71
+ FREE(geoms);
72
+ rb_jump_tag(state);
83
73
  }
84
- if (i != len) {
85
- for (j=0; j<i; ++j) {
86
- GEOSGeom_destroy_r(geos_context, geoms[j]);
74
+
75
+ geoms[i] = geom;
76
+ if (!NIL_P(klass) && NIL_P(klasses)) {
77
+ klasses = rb_ary_new2(len);
78
+ for (j = 0; j < i; ++j) {
79
+ rb_ary_push(klasses, Qnil);
87
80
  }
88
81
  }
89
- else {
90
- collection = GEOSGeom_createCollection_r(geos_context, type, geoms, len);
91
- // Due to a limitation of GEOS, the MultiPolygon assertions are not checked.
92
- // We do that manually here.
93
- if (collection && type == GEOS_MULTIPOLYGON && (factory_data->flags & 1) == 0) {
94
- problem = 0;
95
- for (i=1; i<len; ++i) {
96
- for (j=0; j<i; ++j) {
97
- igeom = geoms[i];
98
- jgeom = geoms[j];
99
- problem = GEOSRelatePattern_r(geos_context, igeom, jgeom, "2********");
100
- if (problem) {
101
- break;
102
- }
103
- problem = GEOSRelatePattern_r(geos_context, igeom, jgeom, "****1****");
104
- if (problem) {
105
- break;
106
- }
107
- }
108
- if (problem) {
109
- break;
110
- }
111
- }
112
- if (problem) {
113
- GEOSGeom_destroy_r(geos_context, collection);
114
- collection = NULL;
115
- }
116
- }
117
- if (collection) {
118
- result = rgeo_wrap_geos_geometry(factory, collection, module);
119
- RGEO_GEOMETRY_DATA_PTR(result)->klasses = klasses;
120
- }
121
- // NOTE: We are assuming that GEOS will do its own cleanup of the
122
- // element geometries if it fails to create the collection, so we
123
- // are not doing that ourselves. If that turns out not to be the
124
- // case, this will be a memory leak.
82
+ if (!NIL_P(klasses)) {
83
+ rb_ary_push(klasses, klass);
125
84
  }
126
- free(geoms);
85
+ }
86
+ collection = GEOSGeom_createCollection(type, geoms, len);
87
+ if (collection) {
88
+ result = rgeo_wrap_geos_geometry(factory, collection, module);
89
+ RGEO_GEOMETRY_DATA_PTR(result)->klasses = klasses;
90
+ }
91
+
92
+ // NOTE: We are assuming that GEOS will do its own cleanup of the
93
+ // element geometries if it fails to create the collection, so we
94
+ // are not doing that ourselves. If that turns out not to be the
95
+ // case, this will be a memory leak.
96
+ FREE(geoms);
97
+ if (state) {
98
+ rb_jump_tag(state);
127
99
  }
128
100
 
129
101
  return result;
130
102
  }
131
103
 
132
-
133
104
  /**** RUBY METHOD DEFINITIONS ****/
134
105
 
135
-
136
- static VALUE method_geometry_collection_eql(VALUE self, VALUE rhs)
106
+ static VALUE
107
+ method_geometry_collection_eql(VALUE self, VALUE rhs)
137
108
  {
138
109
  VALUE result;
139
110
  RGeo_GeometryData* self_data;
@@ -141,13 +112,14 @@ static VALUE method_geometry_collection_eql(VALUE self, VALUE rhs)
141
112
  result = rgeo_geos_klasses_and_factories_eql(self, rhs);
142
113
  if (RTEST(result)) {
143
114
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
144
- result = rgeo_geos_geometry_collections_eql(self_data->geos_context, self_data->geom, RGEO_GEOMETRY_DATA_PTR(rhs)->geom, RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M);
115
+ result = rgeo_geos_geometries_strict_eql(self_data->geom,
116
+ RGEO_GEOMETRY_DATA_PTR(rhs)->geom);
145
117
  }
146
118
  return result;
147
119
  }
148
120
 
149
-
150
- static VALUE method_geometry_collection_hash(VALUE self)
121
+ static VALUE
122
+ method_geometry_collection_hash(VALUE self)
151
123
  {
152
124
  st_index_t hash;
153
125
  RGeo_GeometryData* self_data;
@@ -156,14 +128,14 @@ static VALUE method_geometry_collection_hash(VALUE self)
156
128
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
157
129
  factory = self_data->factory;
158
130
  hash = rb_hash_start(0);
159
- hash = rgeo_geos_objbase_hash(factory,
160
- RGEO_FACTORY_DATA_PTR(factory)->globals->feature_geometry_collection, hash);
161
- hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
131
+ hash = rgeo_geos_objbase_hash(
132
+ factory, rgeo_feature_geometry_collection_module, hash);
133
+ hash = rgeo_geos_geometry_collection_hash(self_data->geom, hash);
162
134
  return LONG2FIX(rb_hash_end(hash));
163
135
  }
164
136
 
165
-
166
- static VALUE method_geometry_collection_geometry_type(VALUE self)
137
+ static VALUE
138
+ method_geometry_collection_geometry_type(VALUE self)
167
139
  {
168
140
  VALUE result;
169
141
  RGeo_GeometryData* self_data;
@@ -171,13 +143,13 @@ static VALUE method_geometry_collection_geometry_type(VALUE self)
171
143
  result = Qnil;
172
144
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
173
145
  if (self_data->geom) {
174
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_geometry_collection;
146
+ result = rgeo_feature_geometry_collection_module;
175
147
  }
176
148
  return result;
177
149
  }
178
150
 
179
-
180
- static VALUE method_geometry_collection_num_geometries(VALUE self)
151
+ static VALUE
152
+ method_geometry_collection_num_geometries(VALUE self)
181
153
  {
182
154
  VALUE result;
183
155
  RGeo_GeometryData* self_data;
@@ -187,13 +159,13 @@ static VALUE method_geometry_collection_num_geometries(VALUE self)
187
159
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
188
160
  self_geom = self_data->geom;
189
161
  if (self_geom) {
190
- result = INT2NUM(GEOSGetNumGeometries_r(self_data->geos_context, self_geom));
162
+ result = INT2NUM(GEOSGetNumGeometries(self_geom));
191
163
  }
192
164
  return result;
193
165
  }
194
166
 
195
-
196
- static VALUE impl_geometry_n(VALUE self, VALUE n, char allow_negatives)
167
+ static VALUE
168
+ impl_geometry_n(VALUE self, VALUE n, char allow_negatives)
197
169
  {
198
170
  VALUE result;
199
171
  RGeo_GeometryData* self_data;
@@ -207,16 +179,16 @@ static VALUE impl_geometry_n(VALUE self, VALUE n, char allow_negatives)
207
179
  self_geom = self_data->geom;
208
180
  if (self_geom) {
209
181
  klasses = self_data->klasses;
210
- i = NUM2INT(n);
182
+ i = RB_NUM2INT(n);
211
183
  if (allow_negatives || i >= 0) {
212
- GEOSContextHandle_t self_context = self_data->geos_context;
213
- len = GEOSGetNumGeometries_r(self_context, self_geom);
184
+ len = GEOSGetNumGeometries(self_geom);
214
185
  if (i < 0) {
215
186
  i += len;
216
187
  }
217
188
  if (i >= 0 && i < len) {
218
- result = rgeo_wrap_geos_geometry_clone(self_data->factory,
219
- GEOSGetGeometryN_r(self_context, self_geom, i),
189
+ result = rgeo_wrap_geos_geometry_clone(
190
+ self_data->factory,
191
+ GEOSGetGeometryN(self_geom, i),
220
192
  NIL_P(klasses) ? Qnil : rb_ary_entry(klasses, i));
221
193
  }
222
194
  }
@@ -224,21 +196,24 @@ static VALUE impl_geometry_n(VALUE self, VALUE n, char allow_negatives)
224
196
  return result;
225
197
  }
226
198
 
227
-
228
- static VALUE method_geometry_collection_geometry_n(VALUE self, VALUE n)
199
+ static VALUE
200
+ method_geometry_collection_geometry_n(VALUE self, VALUE n)
229
201
  {
230
202
  return impl_geometry_n(self, n, 0);
231
203
  }
232
204
 
233
-
234
- static VALUE method_geometry_collection_brackets(VALUE self, VALUE n)
205
+ static VALUE
206
+ method_geometry_collection_brackets(VALUE self, VALUE n)
235
207
  {
236
208
  return impl_geometry_n(self, n, 1);
237
209
  }
238
210
 
239
-
240
- static VALUE method_geometry_collection_each(VALUE self)
211
+ static VALUE
212
+ method_geometry_collection_each(VALUE self)
241
213
  {
214
+ RETURN_ENUMERATOR(
215
+ self, 0, 0); /* return enum_for(__callee__) unless block_given? */
216
+
242
217
  RGeo_GeometryData* self_data;
243
218
  const GEOSGeometry* self_geom;
244
219
  int len;
@@ -249,30 +224,28 @@ static VALUE method_geometry_collection_each(VALUE self)
249
224
 
250
225
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
251
226
 
252
- if (rb_block_given_p()) {
253
- self_geom = self_data->geom;
254
- if (self_geom) {
255
- GEOSContextHandle_t self_context = self_data->geos_context;
256
- len = GEOSGetNumGeometries_r(self_context, self_geom);
257
- if (len > 0) {
258
- klasses = self_data->klasses;
259
- for (i=0; i<len; ++i) {
260
- elem_geom = GEOSGetGeometryN_r(self_context, self_geom, i);
261
- elem = rgeo_wrap_geos_geometry_clone(self_data->factory, elem_geom, NIL_P(klasses) ? Qnil : rb_ary_entry(klasses, i));
262
- if (!NIL_P(elem)) {
263
- rb_yield(elem);
264
- }
227
+ self_geom = self_data->geom;
228
+ if (self_geom) {
229
+ len = GEOSGetNumGeometries(self_geom);
230
+ if (len > 0) {
231
+ klasses = self_data->klasses;
232
+ for (i = 0; i < len; ++i) {
233
+ elem_geom = GEOSGetGeometryN(self_geom, i);
234
+ elem = rgeo_wrap_geos_geometry_clone(
235
+ self_data->factory,
236
+ elem_geom,
237
+ NIL_P(klasses) ? Qnil : rb_ary_entry(klasses, i));
238
+ if (!NIL_P(elem)) {
239
+ rb_yield(elem);
265
240
  }
266
241
  }
267
242
  }
268
- return self;
269
- }
270
- else {
271
- return rb_funcall(self, RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->id_enum_for, 0);
272
243
  }
244
+ return self;
273
245
  }
274
246
 
275
- static VALUE method_multi_point_geometry_type(VALUE self)
247
+ static VALUE
248
+ method_multi_point_geometry_type(VALUE self)
276
249
  {
277
250
  VALUE result;
278
251
  RGeo_GeometryData* self_data;
@@ -280,13 +253,13 @@ static VALUE method_multi_point_geometry_type(VALUE self)
280
253
  result = Qnil;
281
254
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
282
255
  if (self_data->geom) {
283
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_multi_point;
256
+ result = rgeo_feature_multi_point_module;
284
257
  }
285
258
  return result;
286
259
  }
287
260
 
288
-
289
- static VALUE method_multi_point_hash(VALUE self)
261
+ static VALUE
262
+ method_multi_point_hash(VALUE self)
290
263
  {
291
264
  st_index_t hash;
292
265
  RGeo_GeometryData* self_data;
@@ -295,19 +268,17 @@ static VALUE method_multi_point_hash(VALUE self)
295
268
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
296
269
  factory = self_data->factory;
297
270
  hash = rb_hash_start(0);
298
- hash = rgeo_geos_objbase_hash(factory,
299
- RGEO_FACTORY_DATA_PTR(factory)->globals->feature_multi_point, hash);
300
- hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
271
+ hash = rgeo_geos_objbase_hash(factory, rgeo_feature_multi_point_module, hash);
272
+ hash = rgeo_geos_geometry_collection_hash(self_data->geom, hash);
301
273
  return LONG2FIX(rb_hash_end(hash));
302
274
  }
303
275
 
304
-
305
- static VALUE method_multi_point_coordinates(VALUE self)
276
+ static VALUE
277
+ method_multi_point_coordinates(VALUE self)
306
278
  {
307
279
  VALUE result = Qnil;
308
280
  RGeo_GeometryData* self_data;
309
281
  const GEOSGeometry* self_geom;
310
- GEOSContextHandle_t context;
311
282
  const GEOSCoordSequence* coord_sequence;
312
283
 
313
284
  const GEOSGeometry* point;
@@ -318,23 +289,26 @@ static VALUE method_multi_point_coordinates(VALUE self)
318
289
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
319
290
  self_geom = self_data->geom;
320
291
 
321
- if(self_geom) {
322
- zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
323
- context = self_data->geos_context;
324
- count = GEOSGetNumGeometries_r(context, self_geom);
292
+ if (self_geom) {
293
+ zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags &
294
+ RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
295
+
296
+ count = GEOSGetNumGeometries(self_geom);
325
297
  result = rb_ary_new2(count);
326
- for(i = 0; i < count; ++i) {
327
- point = GEOSGetGeometryN_r(context, self_geom, i);
328
- coord_sequence = GEOSGeom_getCoordSeq_r(context, point);
329
- rb_ary_push(result, rb_ary_pop(extract_points_from_coordinate_sequence(context, coord_sequence, zCoordinate)));
298
+ for (i = 0; i < count; ++i) {
299
+ point = GEOSGetGeometryN(self_geom, i);
300
+ coord_sequence = GEOSGeom_getCoordSeq(point);
301
+ rb_ary_push(result,
302
+ rb_ary_pop(extract_points_from_coordinate_sequence(
303
+ coord_sequence, zCoordinate)));
330
304
  }
331
305
  }
332
306
 
333
307
  return result;
334
308
  }
335
309
 
336
-
337
- static VALUE method_multi_line_string_geometry_type(VALUE self)
310
+ static VALUE
311
+ method_multi_line_string_geometry_type(VALUE self)
338
312
  {
339
313
  VALUE result;
340
314
  RGeo_GeometryData* self_data;
@@ -342,13 +316,13 @@ static VALUE method_multi_line_string_geometry_type(VALUE self)
342
316
  result = Qnil;
343
317
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
344
318
  if (self_data->geom) {
345
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_multi_line_string;
319
+ result = rgeo_feature_multi_line_string_module;
346
320
  }
347
321
  return result;
348
322
  }
349
323
 
350
-
351
- static VALUE method_multi_line_string_hash(VALUE self)
324
+ static VALUE
325
+ method_multi_line_string_hash(VALUE self)
352
326
  {
353
327
  st_index_t hash;
354
328
  RGeo_GeometryData* self_data;
@@ -357,36 +331,35 @@ static VALUE method_multi_line_string_hash(VALUE self)
357
331
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
358
332
  factory = self_data->factory;
359
333
  hash = rb_hash_start(0);
360
- hash = rgeo_geos_objbase_hash(factory,
361
- RGEO_FACTORY_DATA_PTR(factory)->globals->feature_multi_line_string, hash);
362
- hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
334
+ hash = rgeo_geos_objbase_hash(
335
+ factory, rgeo_feature_multi_line_string_module, hash);
336
+ hash = rgeo_geos_geometry_collection_hash(self_data->geom, hash);
363
337
  return LONG2FIX(rb_hash_end(hash));
364
338
  }
365
339
 
366
- static VALUE method_geometry_collection_node(VALUE self)
340
+ static VALUE
341
+ method_geometry_collection_node(VALUE self)
367
342
  {
368
343
  VALUE result = Qnil;
369
344
  RGeo_GeometryData* self_data;
370
345
  const GEOSGeometry* self_geom;
371
346
  GEOSGeometry* noded;
372
- GEOSContextHandle_t context;
373
347
 
374
348
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
375
349
  self_geom = self_data->geom;
376
- context = self_data->geos_context;
377
350
 
378
- noded = GEOSNode_r(context, self_geom);
351
+ noded = GEOSNode(self_geom);
379
352
  result = rgeo_wrap_geos_geometry(self_data->factory, noded, Qnil);
380
353
 
381
354
  return result;
382
355
  }
383
356
 
384
- static VALUE method_multi_line_string_coordinates(VALUE self)
357
+ static VALUE
358
+ method_multi_line_string_coordinates(VALUE self)
385
359
  {
386
360
  VALUE result = Qnil;
387
361
  RGeo_GeometryData* self_data;
388
362
  const GEOSGeometry* self_geom;
389
- GEOSContextHandle_t context;
390
363
  const GEOSCoordSequence* coord_sequence;
391
364
 
392
365
  const GEOSGeometry* line_string;
@@ -396,23 +369,26 @@ static VALUE method_multi_line_string_coordinates(VALUE self)
396
369
 
397
370
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
398
371
  self_geom = self_data->geom;
399
-
400
- if(self_geom) {
401
- zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
402
- context = self_data->geos_context;
403
- count = GEOSGetNumGeometries_r(context, self_geom);
372
+
373
+ if (self_geom) {
374
+ zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags &
375
+ RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
376
+ count = GEOSGetNumGeometries(self_geom);
404
377
  result = rb_ary_new2(count);
405
- for(i = 0; i < count; ++i) {
406
- line_string = GEOSGetGeometryN_r(context, self_geom, i);
407
- coord_sequence = GEOSGeom_getCoordSeq_r(context, line_string);
408
- rb_ary_push(result, extract_points_from_coordinate_sequence(context, coord_sequence, zCoordinate));
378
+ for (i = 0; i < count; ++i) {
379
+ line_string = GEOSGetGeometryN(self_geom, i);
380
+ coord_sequence = GEOSGeom_getCoordSeq(line_string);
381
+ rb_ary_push(
382
+ result,
383
+ extract_points_from_coordinate_sequence(coord_sequence, zCoordinate));
409
384
  }
410
385
  }
411
386
 
412
387
  return result;
413
388
  }
414
389
 
415
- static VALUE method_multi_line_string_length(VALUE self)
390
+ static VALUE
391
+ method_multi_line_string_length(VALUE self)
416
392
  {
417
393
  VALUE result;
418
394
  RGeo_GeometryData* self_data;
@@ -423,20 +399,19 @@ static VALUE method_multi_line_string_length(VALUE self)
423
399
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
424
400
  self_geom = self_data->geom;
425
401
  if (self_geom) {
426
- if (GEOSLength_r(self_data->geos_context, self_geom, &len)) {
402
+ if (GEOSLength(self_geom, &len)) {
427
403
  result = rb_float_new(len);
428
404
  }
429
405
  }
430
406
  return result;
431
407
  }
432
408
 
433
-
434
- static VALUE method_multi_line_string_is_closed(VALUE self)
409
+ static VALUE
410
+ method_multi_line_string_is_closed(VALUE self)
435
411
  {
436
412
  VALUE result;
437
413
  RGeo_GeometryData* self_data;
438
414
  const GEOSGeometry* self_geom;
439
- GEOSContextHandle_t self_context;
440
415
  int len;
441
416
  int i;
442
417
  const GEOSGeometry* geom;
@@ -445,14 +420,13 @@ static VALUE method_multi_line_string_is_closed(VALUE self)
445
420
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
446
421
  self_geom = self_data->geom;
447
422
  if (self_geom) {
448
- self_context = self_data->geos_context;
449
423
  result = Qtrue;
450
- len = GEOSGetNumGeometries_r(self_context, self_geom);
424
+ len = GEOSGetNumGeometries(self_geom);
451
425
  if (len > 0) {
452
- for (i=0; i<len; ++i) {
453
- geom = GEOSGetGeometryN_r(self_context, self_geom, i);
426
+ for (i = 0; i < len; ++i) {
427
+ geom = GEOSGetGeometryN(self_geom, i);
454
428
  if (geom) {
455
- result = rgeo_is_geos_line_string_closed(self_context, self_geom);
429
+ result = rgeo_is_geos_line_string_closed(self_geom);
456
430
  if (result != Qtrue) {
457
431
  break;
458
432
  }
@@ -463,8 +437,8 @@ static VALUE method_multi_line_string_is_closed(VALUE self)
463
437
  return result;
464
438
  }
465
439
 
466
-
467
- static VALUE method_multi_polygon_geometry_type(VALUE self)
440
+ static VALUE
441
+ method_multi_polygon_geometry_type(VALUE self)
468
442
  {
469
443
  VALUE result;
470
444
  RGeo_GeometryData* self_data;
@@ -472,13 +446,13 @@ static VALUE method_multi_polygon_geometry_type(VALUE self)
472
446
  result = Qnil;
473
447
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
474
448
  if (self_data->geom) {
475
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_multi_polygon;
449
+ result = rgeo_feature_multi_polygon_module;
476
450
  }
477
451
  return result;
478
452
  }
479
453
 
480
-
481
- static VALUE method_multi_polygon_hash(VALUE self)
454
+ static VALUE
455
+ method_multi_polygon_hash(VALUE self)
482
456
  {
483
457
  st_index_t hash;
484
458
  RGeo_GeometryData* self_data;
@@ -487,19 +461,18 @@ static VALUE method_multi_polygon_hash(VALUE self)
487
461
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
488
462
  factory = self_data->factory;
489
463
  hash = rb_hash_start(0);
490
- hash = rgeo_geos_objbase_hash(factory,
491
- RGEO_FACTORY_DATA_PTR(factory)->globals->feature_multi_polygon, hash);
492
- hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
464
+ hash =
465
+ rgeo_geos_objbase_hash(factory, rgeo_feature_multi_polygon_module, hash);
466
+ hash = rgeo_geos_geometry_collection_hash(self_data->geom, hash);
493
467
  return LONG2FIX(rb_hash_end(hash));
494
468
  }
495
469
 
496
-
497
- static VALUE method_multi_polygon_coordinates(VALUE self)
470
+ static VALUE
471
+ method_multi_polygon_coordinates(VALUE self)
498
472
  {
499
473
  VALUE result = Qnil;
500
474
  RGeo_GeometryData* self_data;
501
475
  const GEOSGeometry* self_geom;
502
- GEOSContextHandle_t context;
503
476
 
504
477
  const GEOSGeometry* poly;
505
478
  unsigned int count;
@@ -508,23 +481,23 @@ static VALUE method_multi_polygon_coordinates(VALUE self)
508
481
 
509
482
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
510
483
  self_geom = self_data->geom;
511
-
512
- if(self_geom) {
513
- zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
514
- context = self_data->geos_context;
515
- count = GEOSGetNumGeometries_r(context, self_geom);
484
+
485
+ if (self_geom) {
486
+ zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags &
487
+ RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
488
+ count = GEOSGetNumGeometries(self_geom);
516
489
  result = rb_ary_new2(count);
517
- for(i = 0; i < count; ++i) {
518
- poly = GEOSGetGeometryN_r(context, self_geom, i);
519
- rb_ary_push(result, extract_points_from_polygon(context, poly, zCoordinate));
490
+ for (i = 0; i < count; ++i) {
491
+ poly = GEOSGetGeometryN(self_geom, i);
492
+ rb_ary_push(result, extract_points_from_polygon(poly, zCoordinate));
520
493
  }
521
494
  }
522
495
 
523
496
  return result;
524
497
  }
525
498
 
526
-
527
- static VALUE method_multi_polygon_area(VALUE self)
499
+ static VALUE
500
+ method_multi_polygon_area(VALUE self)
528
501
  {
529
502
  VALUE result;
530
503
  RGeo_GeometryData* self_data;
@@ -535,15 +508,15 @@ static VALUE method_multi_polygon_area(VALUE self)
535
508
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
536
509
  self_geom = self_data->geom;
537
510
  if (self_geom) {
538
- if (GEOSArea_r(self_data->geos_context, self_geom, &area)) {
511
+ if (GEOSArea(self_geom, &area)) {
539
512
  result = rb_float_new(area);
540
513
  }
541
514
  }
542
515
  return result;
543
516
  }
544
517
 
545
-
546
- static VALUE method_multi_polygon_centroid(VALUE self)
518
+ static VALUE
519
+ method_multi_polygon_centroid(VALUE self)
547
520
  {
548
521
  VALUE result;
549
522
  RGeo_GeometryData* self_data;
@@ -553,40 +526,42 @@ static VALUE method_multi_polygon_centroid(VALUE self)
553
526
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
554
527
  self_geom = self_data->geom;
555
528
  if (self_geom) {
556
- result = rgeo_wrap_geos_geometry(self_data->factory, GEOSGetCentroid_r(self_data->geos_context, self_geom), Qnil);
529
+ result = rgeo_wrap_geos_geometry(
530
+ self_data->factory, GEOSGetCentroid(self_geom), Qnil);
557
531
  }
558
532
  return result;
559
533
  }
560
534
 
561
-
562
- static VALUE cmethod_geometry_collection_create(VALUE module, VALUE factory, VALUE array)
535
+ static VALUE
536
+ cmethod_geometry_collection_create(VALUE module, VALUE factory, VALUE array)
563
537
  {
564
- return create_geometry_collection(module, GEOS_GEOMETRYCOLLECTION, factory, array);
538
+ return create_geometry_collection(
539
+ module, GEOS_GEOMETRYCOLLECTION, factory, array);
565
540
  }
566
541
 
567
-
568
- static VALUE cmethod_multi_point_create(VALUE module, VALUE factory, VALUE array)
542
+ static VALUE
543
+ cmethod_multi_point_create(VALUE module, VALUE factory, VALUE array)
569
544
  {
570
545
  return create_geometry_collection(module, GEOS_MULTIPOINT, factory, array);
571
546
  }
572
547
 
573
-
574
- static VALUE cmethod_multi_line_string_create(VALUE module, VALUE factory, VALUE array)
548
+ static VALUE
549
+ cmethod_multi_line_string_create(VALUE module, VALUE factory, VALUE array)
575
550
  {
576
- return create_geometry_collection(module, GEOS_MULTILINESTRING, factory, array);
551
+ return create_geometry_collection(
552
+ module, GEOS_MULTILINESTRING, factory, array);
577
553
  }
578
554
 
579
-
580
- static VALUE cmethod_multi_polygon_create(VALUE module, VALUE factory, VALUE array)
555
+ static VALUE
556
+ cmethod_multi_polygon_create(VALUE module, VALUE factory, VALUE array)
581
557
  {
582
558
  return create_geometry_collection(module, GEOS_MULTIPOLYGON, factory, array);
583
559
  }
584
560
 
585
-
586
561
  /**** INITIALIZATION FUNCTION ****/
587
562
 
588
-
589
- void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
563
+ void
564
+ rgeo_init_geos_geometry_collection()
590
565
  {
591
566
  VALUE geos_geometry_collection_methods;
592
567
  VALUE geos_multi_point_methods;
@@ -594,127 +569,120 @@ void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
594
569
  VALUE geos_multi_polygon_methods;
595
570
 
596
571
  // Class methods for geometry collection classes
597
- rb_define_module_function(globals->geos_geometry_collection, "create", cmethod_geometry_collection_create, 2);
598
- rb_define_module_function(globals->geos_multi_point, "create", cmethod_multi_point_create, 2);
599
- rb_define_module_function(globals->geos_multi_line_string, "create", cmethod_multi_line_string_create, 2);
600
- rb_define_module_function(globals->geos_multi_polygon, "create", cmethod_multi_polygon_create, 2);
572
+ rb_define_module_function(rgeo_geos_geometry_collection_class,
573
+ "create",
574
+ cmethod_geometry_collection_create,
575
+ 2);
576
+ rb_define_module_function(
577
+ rgeo_geos_multi_point_class, "create", cmethod_multi_point_create, 2);
578
+ rb_define_module_function(rgeo_geos_multi_line_string_class,
579
+ "create",
580
+ cmethod_multi_line_string_create,
581
+ 2);
582
+ rb_define_module_function(
583
+ rgeo_geos_multi_polygon_class, "create", cmethod_multi_polygon_create, 2);
601
584
 
602
585
  // Methods for GeometryCollectionImpl
603
- geos_geometry_collection_methods = rb_define_module_under(globals->geos_module, "CAPIGeometryCollectionMethods");
604
- rb_define_method(geos_geometry_collection_methods, "rep_equals?", method_geometry_collection_eql, 1);
605
- rb_define_method(geos_geometry_collection_methods, "eql?", method_geometry_collection_eql, 1);
606
- rb_define_method(geos_geometry_collection_methods, "hash", method_geometry_collection_hash, 0);
607
- rb_define_method(geos_geometry_collection_methods, "geometry_type", method_geometry_collection_geometry_type, 0);
608
- rb_define_method(geos_geometry_collection_methods, "num_geometries", method_geometry_collection_num_geometries, 0);
609
- rb_define_method(geos_geometry_collection_methods, "size", method_geometry_collection_num_geometries, 0);
610
- rb_define_method(geos_geometry_collection_methods, "geometry_n", method_geometry_collection_geometry_n, 1);
611
- rb_define_method(geos_geometry_collection_methods, "[]", method_geometry_collection_brackets, 1);
612
- rb_define_method(geos_geometry_collection_methods, "each", method_geometry_collection_each, 0);
613
- rb_define_method(geos_geometry_collection_methods, "node", method_geometry_collection_node, 0);
614
-
586
+ geos_geometry_collection_methods =
587
+ rb_define_module_under(rgeo_geos_module, "CAPIGeometryCollectionMethods");
588
+ rb_define_method(geos_geometry_collection_methods,
589
+ "rep_equals?",
590
+ method_geometry_collection_eql,
591
+ 1);
592
+ rb_define_method(geos_geometry_collection_methods,
593
+ "eql?",
594
+ method_geometry_collection_eql,
595
+ 1);
596
+ rb_define_method(geos_geometry_collection_methods,
597
+ "hash",
598
+ method_geometry_collection_hash,
599
+ 0);
600
+ rb_define_method(geos_geometry_collection_methods,
601
+ "geometry_type",
602
+ method_geometry_collection_geometry_type,
603
+ 0);
604
+ rb_define_method(geos_geometry_collection_methods,
605
+ "num_geometries",
606
+ method_geometry_collection_num_geometries,
607
+ 0);
608
+ rb_define_method(geos_geometry_collection_methods,
609
+ "size",
610
+ method_geometry_collection_num_geometries,
611
+ 0);
612
+ rb_define_method(geos_geometry_collection_methods,
613
+ "geometry_n",
614
+ method_geometry_collection_geometry_n,
615
+ 1);
616
+ rb_define_method(geos_geometry_collection_methods,
617
+ "[]",
618
+ method_geometry_collection_brackets,
619
+ 1);
620
+ rb_define_method(geos_geometry_collection_methods,
621
+ "each",
622
+ method_geometry_collection_each,
623
+ 0);
624
+ rb_define_method(geos_geometry_collection_methods,
625
+ "node",
626
+ method_geometry_collection_node,
627
+ 0);
615
628
 
616
629
  // Methods for MultiPointImpl
617
- geos_multi_point_methods = rb_define_module_under(globals->geos_module, "CAPIMultiPointMethods");
618
- rb_define_method(geos_multi_point_methods, "geometry_type", method_multi_point_geometry_type, 0);
619
- rb_define_method(geos_multi_point_methods, "hash", method_multi_point_hash, 0);
620
- rb_define_method(geos_multi_point_methods, "coordinates", method_multi_point_coordinates, 0);
630
+ geos_multi_point_methods =
631
+ rb_define_module_under(rgeo_geos_module, "CAPIMultiPointMethods");
632
+ rb_define_method(geos_multi_point_methods,
633
+ "geometry_type",
634
+ method_multi_point_geometry_type,
635
+ 0);
636
+ rb_define_method(
637
+ geos_multi_point_methods, "hash", method_multi_point_hash, 0);
638
+ rb_define_method(
639
+ geos_multi_point_methods, "coordinates", method_multi_point_coordinates, 0);
621
640
 
622
641
  // Methods for MultiLineStringImpl
623
- geos_multi_line_string_methods = rb_define_module_under(globals->geos_module, "CAPIMultiLineStringMethods");
624
- rb_define_method(geos_multi_line_string_methods, "geometry_type", method_multi_line_string_geometry_type, 0);
625
- rb_define_method(geos_multi_line_string_methods, "length", method_multi_line_string_length, 0);
626
- rb_define_method(geos_multi_line_string_methods, "closed?", method_multi_line_string_is_closed, 0);
627
- rb_define_method(geos_multi_line_string_methods, "hash", method_multi_line_string_hash, 0);
628
- rb_define_method(geos_multi_line_string_methods, "coordinates", method_multi_line_string_coordinates, 0);
642
+ geos_multi_line_string_methods =
643
+ rb_define_module_under(rgeo_geos_module, "CAPIMultiLineStringMethods");
644
+ rb_define_method(geos_multi_line_string_methods,
645
+ "geometry_type",
646
+ method_multi_line_string_geometry_type,
647
+ 0);
648
+ rb_define_method(geos_multi_line_string_methods,
649
+ "length",
650
+ method_multi_line_string_length,
651
+ 0);
652
+ rb_define_method(geos_multi_line_string_methods,
653
+ "closed?",
654
+ method_multi_line_string_is_closed,
655
+ 0);
656
+ rb_define_method(
657
+ geos_multi_line_string_methods, "hash", method_multi_line_string_hash, 0);
658
+ rb_define_method(geos_multi_line_string_methods,
659
+ "coordinates",
660
+ method_multi_line_string_coordinates,
661
+ 0);
629
662
 
630
663
  // Methods for MultiPolygonImpl
631
- geos_multi_polygon_methods = rb_define_module_under(globals->geos_module, "CAPIMultiPolygonMethods");
632
- rb_define_method(geos_multi_polygon_methods, "geometry_type", method_multi_polygon_geometry_type, 0);
633
- rb_define_method(geos_multi_polygon_methods, "area", method_multi_polygon_area, 0);
634
- rb_define_method(geos_multi_polygon_methods, "centroid", method_multi_polygon_centroid, 0);
635
- rb_define_method(geos_multi_polygon_methods, "hash", method_multi_polygon_hash, 0);
636
- rb_define_method(geos_multi_polygon_methods, "coordinates", method_multi_polygon_coordinates, 0);
664
+ geos_multi_polygon_methods =
665
+ rb_define_module_under(rgeo_geos_module, "CAPIMultiPolygonMethods");
666
+ rb_define_method(geos_multi_polygon_methods,
667
+ "geometry_type",
668
+ method_multi_polygon_geometry_type,
669
+ 0);
670
+ rb_define_method(
671
+ geos_multi_polygon_methods, "area", method_multi_polygon_area, 0);
672
+ rb_define_method(
673
+ geos_multi_polygon_methods, "centroid", method_multi_polygon_centroid, 0);
674
+ rb_define_method(
675
+ geos_multi_polygon_methods, "hash", method_multi_polygon_hash, 0);
676
+ rb_define_method(geos_multi_polygon_methods,
677
+ "coordinates",
678
+ method_multi_polygon_coordinates,
679
+ 0);
637
680
  }
638
681
 
639
-
640
682
  /**** OTHER PUBLIC FUNCTIONS ****/
641
683
 
642
-
643
- VALUE rgeo_geos_geometry_collections_eql(GEOSContextHandle_t context, const GEOSGeometry* geom1, const GEOSGeometry* geom2, char check_z)
644
- {
645
- VALUE result;
646
- int len1;
647
- int len2;
648
- int i;
649
- const GEOSGeometry* sub_geom1;
650
- const GEOSGeometry* sub_geom2;
651
- int type1;
652
- int type2;
653
-
654
- result = Qnil;
655
- if (geom1 && geom2) {
656
- len1 = GEOSGetNumGeometries_r(context, geom1);
657
- len2 = GEOSGetNumGeometries_r(context, geom2);
658
- if (len1 >= 0 && len2 >= 0) {
659
- if (len1 == len2) {
660
- result = Qtrue;
661
- for (i=0; i<len1; ++i) {
662
- sub_geom1 = GEOSGetGeometryN_r(context, geom1, i);
663
- sub_geom2 = GEOSGetGeometryN_r(context, geom2, i);
664
- if (sub_geom1 && sub_geom2) {
665
- type1 = GEOSGeomTypeId_r(context, sub_geom1);
666
- type2 = GEOSGeomTypeId_r(context, sub_geom2);
667
- if (type1 >= 0 && type2 >= 0) {
668
- if (type1 == type2) {
669
- switch (type1) {
670
- case GEOS_POINT:
671
- case GEOS_LINESTRING:
672
- case GEOS_LINEARRING:
673
- result = rgeo_geos_coordseqs_eql(context, sub_geom1, sub_geom2, check_z);
674
- break;
675
- case GEOS_POLYGON:
676
- result = rgeo_geos_polygons_eql(context, sub_geom1, sub_geom2, check_z);
677
- break;
678
- case GEOS_GEOMETRYCOLLECTION:
679
- case GEOS_MULTIPOINT:
680
- case GEOS_MULTILINESTRING:
681
- case GEOS_MULTIPOLYGON:
682
- result = rgeo_geos_geometry_collections_eql(context, sub_geom1, sub_geom2, check_z);
683
- break;
684
- default:
685
- result = Qnil;
686
- break;
687
- }
688
- if (!RTEST(result)) {
689
- break;
690
- }
691
- }
692
- else {
693
- result = Qfalse;
694
- break;
695
- }
696
- }
697
- else {
698
- result = Qnil;
699
- break;
700
- }
701
- }
702
- else {
703
- result = Qnil;
704
- break;
705
- }
706
- }
707
- }
708
- else {
709
- result = Qfalse;
710
- }
711
- }
712
- }
713
- return result;
714
- }
715
-
716
-
717
- st_index_t rgeo_geos_geometry_collection_hash(GEOSContextHandle_t context, const GEOSGeometry* geom, st_index_t hash)
684
+ st_index_t
685
+ rgeo_geos_geometry_collection_hash(const GEOSGeometry* geom, st_index_t hash)
718
686
  {
719
687
  const GEOSGeometry* sub_geom;
720
688
  int type;
@@ -722,28 +690,28 @@ st_index_t rgeo_geos_geometry_collection_hash(GEOSContextHandle_t context, const
722
690
  unsigned int i;
723
691
 
724
692
  if (geom) {
725
- len = GEOSGetNumGeometries_r(context, geom);
726
- for (i=0; i<len; ++i) {
727
- sub_geom = GEOSGetGeometryN_r(context, geom, i);
693
+ len = GEOSGetNumGeometries(geom);
694
+ for (i = 0; i < len; ++i) {
695
+ sub_geom = GEOSGetGeometryN(geom, i);
728
696
  if (sub_geom) {
729
- type = GEOSGeomTypeId_r(context, sub_geom);
697
+ type = GEOSGeomTypeId(sub_geom);
730
698
  if (type >= 0) {
731
699
  hash = hash ^ type;
732
700
  switch (type) {
733
- case GEOS_POINT:
734
- case GEOS_LINESTRING:
735
- case GEOS_LINEARRING:
736
- hash = rgeo_geos_coordseq_hash(context, sub_geom, hash);
737
- break;
738
- case GEOS_POLYGON:
739
- hash = rgeo_geos_polygon_hash(context, sub_geom, hash);
740
- break;
741
- case GEOS_GEOMETRYCOLLECTION:
742
- case GEOS_MULTIPOINT:
743
- case GEOS_MULTILINESTRING:
744
- case GEOS_MULTIPOLYGON:
745
- hash = rgeo_geos_geometry_collection_hash(context, sub_geom, hash);
746
- break;
701
+ case GEOS_POINT:
702
+ case GEOS_LINESTRING:
703
+ case GEOS_LINEARRING:
704
+ hash = rgeo_geos_coordseq_hash(sub_geom, hash);
705
+ break;
706
+ case GEOS_POLYGON:
707
+ hash = rgeo_geos_polygon_hash(sub_geom, hash);
708
+ break;
709
+ case GEOS_GEOMETRYCOLLECTION:
710
+ case GEOS_MULTIPOINT:
711
+ case GEOS_MULTILINESTRING:
712
+ case GEOS_MULTIPOLYGON:
713
+ hash = rgeo_geos_geometry_collection_hash(sub_geom, hash);
714
+ break;
747
715
  }
748
716
  }
749
717
  }
@@ -752,7 +720,6 @@ st_index_t rgeo_geos_geometry_collection_hash(GEOSContextHandle_t context, const
752
720
  return hash;
753
721
  }
754
722
 
755
-
756
723
  RGEO_END_C
757
724
 
758
725
  #endif