rgeo 2.3.1 → 3.0.0.pre.rc.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +6 -0
- data/README.md +11 -10
- data/ext/geos_c_impl/analysis.c +8 -6
- data/ext/geos_c_impl/analysis.h +1 -3
- data/ext/geos_c_impl/errors.c +10 -8
- data/ext/geos_c_impl/errors.h +7 -3
- data/ext/geos_c_impl/extconf.rb +3 -0
- data/ext/geos_c_impl/factory.c +273 -202
- data/ext/geos_c_impl/factory.h +51 -63
- data/ext/geos_c_impl/geometry.c +124 -22
- data/ext/geos_c_impl/geometry.h +8 -3
- data/ext/geos_c_impl/geometry_collection.c +81 -185
- data/ext/geos_c_impl/geometry_collection.h +1 -14
- data/ext/geos_c_impl/globals.c +91 -0
- data/ext/geos_c_impl/globals.h +45 -0
- data/ext/geos_c_impl/line_string.c +28 -29
- data/ext/geos_c_impl/line_string.h +1 -3
- data/ext/geos_c_impl/main.c +10 -9
- data/ext/geos_c_impl/point.c +9 -8
- data/ext/geos_c_impl/point.h +1 -3
- data/ext/geos_c_impl/polygon.c +43 -72
- data/ext/geos_c_impl/polygon.h +1 -3
- data/ext/geos_c_impl/preface.h +12 -0
- data/ext/geos_c_impl/ruby_more.c +65 -0
- data/ext/geos_c_impl/ruby_more.h +16 -0
- data/lib/rgeo/cartesian/calculations.rb +54 -17
- data/lib/rgeo/cartesian/factory.rb +6 -14
- data/lib/rgeo/cartesian/feature_classes.rb +68 -46
- data/lib/rgeo/cartesian/feature_methods.rb +67 -20
- data/lib/rgeo/cartesian/interface.rb +0 -36
- data/lib/rgeo/cartesian/planar_graph.rb +379 -0
- data/lib/rgeo/cartesian/sweepline_intersector.rb +149 -0
- data/lib/rgeo/cartesian/valid_op.rb +71 -0
- data/lib/rgeo/cartesian.rb +3 -0
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +6 -6
- data/lib/rgeo/coord_sys.rb +0 -11
- data/lib/rgeo/error.rb +15 -0
- data/lib/rgeo/feature/factory_generator.rb +0 -3
- data/lib/rgeo/feature/geometry.rb +107 -28
- data/lib/rgeo/feature/geometry_collection.rb +13 -5
- data/lib/rgeo/feature/line_string.rb +3 -3
- data/lib/rgeo/feature/multi_surface.rb +3 -3
- data/lib/rgeo/feature/point.rb +4 -4
- data/lib/rgeo/feature/surface.rb +3 -3
- data/lib/rgeo/geographic/factory.rb +6 -7
- data/lib/rgeo/geographic/interface.rb +6 -49
- data/lib/rgeo/geographic/proj4_projector.rb +0 -2
- data/lib/rgeo/geographic/projected_feature_classes.rb +21 -9
- data/lib/rgeo/geographic/projected_feature_methods.rb +67 -28
- data/lib/rgeo/geographic/simple_mercator_projector.rb +0 -2
- data/lib/rgeo/geographic/spherical_feature_classes.rb +29 -9
- data/lib/rgeo/geographic/spherical_feature_methods.rb +79 -2
- data/lib/rgeo/geos/capi_factory.rb +21 -38
- data/lib/rgeo/geos/capi_feature_classes.rb +54 -11
- data/lib/rgeo/geos/ffi_factory.rb +6 -35
- data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
- data/lib/rgeo/geos/ffi_feature_methods.rb +39 -5
- data/lib/rgeo/geos/interface.rb +0 -24
- data/lib/rgeo/geos/zm_factory.rb +0 -19
- data/lib/rgeo/geos/zm_feature_methods.rb +16 -0
- data/lib/rgeo/geos.rb +6 -3
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +4 -4
- data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -1
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +15 -19
- data/lib/rgeo/impl_helper/basic_point_methods.rb +1 -1
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +1 -1
- data/lib/rgeo/impl_helper/valid_op.rb +354 -0
- data/lib/rgeo/impl_helper/validity_check.rb +139 -0
- data/lib/rgeo/impl_helper.rb +1 -0
- data/lib/rgeo/version.rb +1 -1
- metadata +45 -9
- data/lib/rgeo/coord_sys/srs_database/entry.rb +0 -107
- data/lib/rgeo/coord_sys/srs_database/sr_org.rb +0 -64
- data/lib/rgeo/coord_sys/srs_database/url_reader.rb +0 -65
@@ -10,13 +10,16 @@
|
|
10
10
|
#include <ruby.h>
|
11
11
|
#include <geos_c.h>
|
12
12
|
|
13
|
+
|
14
|
+
#include "coordinates.h"
|
15
|
+
#include "errors.h"
|
13
16
|
#include "factory.h"
|
14
17
|
#include "geometry.h"
|
18
|
+
#include "geometry_collection.h"
|
19
|
+
#include "globals.h"
|
15
20
|
#include "line_string.h"
|
16
21
|
#include "polygon.h"
|
17
|
-
#include "geometry_collection.h"
|
18
22
|
|
19
|
-
#include "coordinates.h"
|
20
23
|
|
21
24
|
RGEO_BEGIN_C
|
22
25
|
|
@@ -41,95 +44,69 @@ static VALUE create_geometry_collection(VALUE module, int type, VALUE factory, V
|
|
41
44
|
VALUE cast_type;
|
42
45
|
GEOSGeometry* geom;
|
43
46
|
GEOSGeometry* collection;
|
44
|
-
|
45
|
-
GEOSGeometry* igeom;
|
46
|
-
GEOSGeometry* jgeom;
|
47
|
+
int state = 0;
|
47
48
|
|
48
49
|
result = Qnil;
|
49
50
|
Check_Type(array, T_ARRAY);
|
50
51
|
len = (unsigned int)RARRAY_LEN(array);
|
51
52
|
geoms = ALLOC_N(GEOSGeometry*, len == 0 ? 1 : len);
|
52
|
-
if (geoms) {
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
53
|
+
if (!geoms) { rb_raise(rb_eRGeoError, "not enough memory available"); }
|
54
|
+
|
55
|
+
factory_data = RGEO_FACTORY_DATA_PTR(factory);
|
56
|
+
geos_context = factory_data->geos_context;
|
57
|
+
klasses = Qnil;
|
58
|
+
cast_type = Qnil;
|
59
|
+
switch (type) {
|
58
60
|
case GEOS_MULTIPOINT:
|
59
|
-
cast_type =
|
61
|
+
cast_type = rgeo_feature_point_module;
|
60
62
|
break;
|
61
63
|
case GEOS_MULTILINESTRING:
|
62
|
-
cast_type =
|
64
|
+
cast_type = rgeo_feature_line_string_module;
|
63
65
|
break;
|
64
66
|
case GEOS_MULTIPOLYGON:
|
65
|
-
cast_type =
|
67
|
+
cast_type = rgeo_feature_polygon_module;
|
68
|
+
break;
|
69
|
+
}
|
70
|
+
for (i=0; i<len; ++i) {
|
71
|
+
geom = rgeo_convert_to_detached_geos_geometry(rb_ary_entry(array, i), factory, cast_type, &klass, &state);
|
72
|
+
if (state || !geom) {
|
66
73
|
break;
|
67
74
|
}
|
68
|
-
|
69
|
-
|
70
|
-
|
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);
|
82
|
-
}
|
83
|
-
}
|
84
|
-
if (i != len) {
|
75
|
+
geoms[i] = geom;
|
76
|
+
if (!NIL_P(klass) && NIL_P(klasses)) {
|
77
|
+
klasses = rb_ary_new2(len);
|
85
78
|
for (j=0; j<i; ++j) {
|
86
|
-
|
79
|
+
rb_ary_push(klasses, Qnil);
|
87
80
|
}
|
88
81
|
}
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
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);
|
84
|
+
}
|
85
|
+
}
|
86
|
+
if (i != len) {
|
87
|
+
for (j=0; j<i; ++j) {
|
88
|
+
GEOSGeom_destroy_r(geos_context, geoms[j]);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
else {
|
92
|
+
collection = GEOSGeom_createCollection_r(geos_context, type, geoms, len);
|
93
|
+
if (collection) {
|
94
|
+
result = rgeo_wrap_geos_geometry(factory, collection, module);
|
95
|
+
RGEO_GEOMETRY_DATA_PTR(result)->klasses = klasses;
|
125
96
|
}
|
126
|
-
|
97
|
+
// NOTE: We are assuming that GEOS will do its own cleanup of the
|
98
|
+
// element geometries if it fails to create the collection, so we
|
99
|
+
// are not doing that ourselves. If that turns out not to be the
|
100
|
+
// case, this will be a memory leak.
|
101
|
+
}
|
102
|
+
FREE(geoms);
|
103
|
+
if (state) {
|
104
|
+
rb_exc_raise(rb_errinfo()); // raise $!
|
127
105
|
}
|
128
106
|
|
129
107
|
return result;
|
130
108
|
}
|
131
109
|
|
132
|
-
|
133
110
|
/**** RUBY METHOD DEFINITIONS ****/
|
134
111
|
|
135
112
|
|
@@ -141,7 +118,7 @@ static VALUE method_geometry_collection_eql(VALUE self, VALUE rhs)
|
|
141
118
|
result = rgeo_geos_klasses_and_factories_eql(self, rhs);
|
142
119
|
if (RTEST(result)) {
|
143
120
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
144
|
-
result =
|
121
|
+
result = rgeo_geos_geometries_strict_eql(self_data->geos_context, self_data->geom, RGEO_GEOMETRY_DATA_PTR(rhs)->geom);
|
145
122
|
}
|
146
123
|
return result;
|
147
124
|
}
|
@@ -156,8 +133,7 @@ static VALUE method_geometry_collection_hash(VALUE self)
|
|
156
133
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
157
134
|
factory = self_data->factory;
|
158
135
|
hash = rb_hash_start(0);
|
159
|
-
hash = rgeo_geos_objbase_hash(factory,
|
160
|
-
RGEO_FACTORY_DATA_PTR(factory)->globals->feature_geometry_collection, hash);
|
136
|
+
hash = rgeo_geos_objbase_hash(factory, rgeo_feature_geometry_collection_module, hash);
|
161
137
|
hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
|
162
138
|
return LONG2FIX(rb_hash_end(hash));
|
163
139
|
}
|
@@ -171,7 +147,7 @@ static VALUE method_geometry_collection_geometry_type(VALUE self)
|
|
171
147
|
result = Qnil;
|
172
148
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
173
149
|
if (self_data->geom) {
|
174
|
-
result =
|
150
|
+
result = rgeo_feature_geometry_collection_module;
|
175
151
|
}
|
176
152
|
return result;
|
177
153
|
}
|
@@ -239,6 +215,8 @@ static VALUE method_geometry_collection_brackets(VALUE self, VALUE n)
|
|
239
215
|
|
240
216
|
static VALUE method_geometry_collection_each(VALUE self)
|
241
217
|
{
|
218
|
+
RETURN_ENUMERATOR(self, 0, 0); /* return enum_for(__callee__) unless block_given? */
|
219
|
+
|
242
220
|
RGeo_GeometryData* self_data;
|
243
221
|
const GEOSGeometry* self_geom;
|
244
222
|
int len;
|
@@ -249,27 +227,22 @@ static VALUE method_geometry_collection_each(VALUE self)
|
|
249
227
|
|
250
228
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
251
229
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
rb_yield(elem);
|
264
|
-
}
|
230
|
+
self_geom = self_data->geom;
|
231
|
+
if (self_geom) {
|
232
|
+
GEOSContextHandle_t self_context = self_data->geos_context;
|
233
|
+
len = GEOSGetNumGeometries_r(self_context, self_geom);
|
234
|
+
if (len > 0) {
|
235
|
+
klasses = self_data->klasses;
|
236
|
+
for (i=0; i<len; ++i) {
|
237
|
+
elem_geom = GEOSGetGeometryN_r(self_context, self_geom, i);
|
238
|
+
elem = rgeo_wrap_geos_geometry_clone(self_data->factory, elem_geom, NIL_P(klasses) ? Qnil : rb_ary_entry(klasses, i));
|
239
|
+
if (!NIL_P(elem)) {
|
240
|
+
rb_yield(elem);
|
265
241
|
}
|
266
242
|
}
|
267
243
|
}
|
268
|
-
return self;
|
269
|
-
}
|
270
|
-
else {
|
271
|
-
return rb_funcall(self, RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->id_enum_for, 0);
|
272
244
|
}
|
245
|
+
return self;
|
273
246
|
}
|
274
247
|
|
275
248
|
static VALUE method_multi_point_geometry_type(VALUE self)
|
@@ -280,7 +253,7 @@ 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 =
|
256
|
+
result = rgeo_feature_multi_point_module;
|
284
257
|
}
|
285
258
|
return result;
|
286
259
|
}
|
@@ -295,8 +268,7 @@ 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);
|
271
|
+
hash = rgeo_geos_objbase_hash(factory, rgeo_feature_multi_point_module, hash);
|
300
272
|
hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
|
301
273
|
return LONG2FIX(rb_hash_end(hash));
|
302
274
|
}
|
@@ -342,7 +314,7 @@ static VALUE method_multi_line_string_geometry_type(VALUE self)
|
|
342
314
|
result = Qnil;
|
343
315
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
344
316
|
if (self_data->geom) {
|
345
|
-
result =
|
317
|
+
result = rgeo_feature_multi_line_string_module;
|
346
318
|
}
|
347
319
|
return result;
|
348
320
|
}
|
@@ -357,8 +329,7 @@ static VALUE method_multi_line_string_hash(VALUE self)
|
|
357
329
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
358
330
|
factory = self_data->factory;
|
359
331
|
hash = rb_hash_start(0);
|
360
|
-
hash = rgeo_geos_objbase_hash(factory,
|
361
|
-
RGEO_FACTORY_DATA_PTR(factory)->globals->feature_multi_line_string, hash);
|
332
|
+
hash = rgeo_geos_objbase_hash(factory, rgeo_feature_multi_line_string_module, hash);
|
362
333
|
hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
|
363
334
|
return LONG2FIX(rb_hash_end(hash));
|
364
335
|
}
|
@@ -396,7 +367,7 @@ static VALUE method_multi_line_string_coordinates(VALUE self)
|
|
396
367
|
|
397
368
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
398
369
|
self_geom = self_data->geom;
|
399
|
-
|
370
|
+
|
400
371
|
if(self_geom) {
|
401
372
|
zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
|
402
373
|
context = self_data->geos_context;
|
@@ -472,7 +443,7 @@ static VALUE method_multi_polygon_geometry_type(VALUE self)
|
|
472
443
|
result = Qnil;
|
473
444
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
474
445
|
if (self_data->geom) {
|
475
|
-
result =
|
446
|
+
result = rgeo_feature_multi_polygon_module;
|
476
447
|
}
|
477
448
|
return result;
|
478
449
|
}
|
@@ -487,8 +458,7 @@ static VALUE method_multi_polygon_hash(VALUE self)
|
|
487
458
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
488
459
|
factory = self_data->factory;
|
489
460
|
hash = rb_hash_start(0);
|
490
|
-
hash = rgeo_geos_objbase_hash(factory,
|
491
|
-
RGEO_FACTORY_DATA_PTR(factory)->globals->feature_multi_polygon, hash);
|
461
|
+
hash = rgeo_geos_objbase_hash(factory, rgeo_feature_multi_polygon_module, hash);
|
492
462
|
hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
|
493
463
|
return LONG2FIX(rb_hash_end(hash));
|
494
464
|
}
|
@@ -508,7 +478,7 @@ static VALUE method_multi_polygon_coordinates(VALUE self)
|
|
508
478
|
|
509
479
|
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
510
480
|
self_geom = self_data->geom;
|
511
|
-
|
481
|
+
|
512
482
|
if(self_geom) {
|
513
483
|
zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
|
514
484
|
context = self_data->geos_context;
|
@@ -586,7 +556,7 @@ static VALUE cmethod_multi_polygon_create(VALUE module, VALUE factory, VALUE arr
|
|
586
556
|
/**** INITIALIZATION FUNCTION ****/
|
587
557
|
|
588
558
|
|
589
|
-
void rgeo_init_geos_geometry_collection(
|
559
|
+
void rgeo_init_geos_geometry_collection()
|
590
560
|
{
|
591
561
|
VALUE geos_geometry_collection_methods;
|
592
562
|
VALUE geos_multi_point_methods;
|
@@ -594,13 +564,13 @@ void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
|
|
594
564
|
VALUE geos_multi_polygon_methods;
|
595
565
|
|
596
566
|
// Class methods for geometry collection classes
|
597
|
-
rb_define_module_function(
|
598
|
-
rb_define_module_function(
|
599
|
-
rb_define_module_function(
|
600
|
-
rb_define_module_function(
|
567
|
+
rb_define_module_function(rgeo_geos_geometry_collection_class, "create", cmethod_geometry_collection_create, 2);
|
568
|
+
rb_define_module_function(rgeo_geos_multi_point_class, "create", cmethod_multi_point_create, 2);
|
569
|
+
rb_define_module_function(rgeo_geos_multi_line_string_class, "create", cmethod_multi_line_string_create, 2);
|
570
|
+
rb_define_module_function(rgeo_geos_multi_polygon_class, "create", cmethod_multi_polygon_create, 2);
|
601
571
|
|
602
572
|
// Methods for GeometryCollectionImpl
|
603
|
-
geos_geometry_collection_methods = rb_define_module_under(
|
573
|
+
geos_geometry_collection_methods = rb_define_module_under(rgeo_geos_module, "CAPIGeometryCollectionMethods");
|
604
574
|
rb_define_method(geos_geometry_collection_methods, "rep_equals?", method_geometry_collection_eql, 1);
|
605
575
|
rb_define_method(geos_geometry_collection_methods, "eql?", method_geometry_collection_eql, 1);
|
606
576
|
rb_define_method(geos_geometry_collection_methods, "hash", method_geometry_collection_hash, 0);
|
@@ -614,13 +584,13 @@ void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
|
|
614
584
|
|
615
585
|
|
616
586
|
// Methods for MultiPointImpl
|
617
|
-
geos_multi_point_methods = rb_define_module_under(
|
587
|
+
geos_multi_point_methods = rb_define_module_under(rgeo_geos_module, "CAPIMultiPointMethods");
|
618
588
|
rb_define_method(geos_multi_point_methods, "geometry_type", method_multi_point_geometry_type, 0);
|
619
589
|
rb_define_method(geos_multi_point_methods, "hash", method_multi_point_hash, 0);
|
620
590
|
rb_define_method(geos_multi_point_methods, "coordinates", method_multi_point_coordinates, 0);
|
621
591
|
|
622
592
|
// Methods for MultiLineStringImpl
|
623
|
-
geos_multi_line_string_methods = rb_define_module_under(
|
593
|
+
geos_multi_line_string_methods = rb_define_module_under(rgeo_geos_module, "CAPIMultiLineStringMethods");
|
624
594
|
rb_define_method(geos_multi_line_string_methods, "geometry_type", method_multi_line_string_geometry_type, 0);
|
625
595
|
rb_define_method(geos_multi_line_string_methods, "length", method_multi_line_string_length, 0);
|
626
596
|
rb_define_method(geos_multi_line_string_methods, "closed?", method_multi_line_string_is_closed, 0);
|
@@ -628,7 +598,7 @@ void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
|
|
628
598
|
rb_define_method(geos_multi_line_string_methods, "coordinates", method_multi_line_string_coordinates, 0);
|
629
599
|
|
630
600
|
// Methods for MultiPolygonImpl
|
631
|
-
geos_multi_polygon_methods = rb_define_module_under(
|
601
|
+
geos_multi_polygon_methods = rb_define_module_under(rgeo_geos_module, "CAPIMultiPolygonMethods");
|
632
602
|
rb_define_method(geos_multi_polygon_methods, "geometry_type", method_multi_polygon_geometry_type, 0);
|
633
603
|
rb_define_method(geos_multi_polygon_methods, "area", method_multi_polygon_area, 0);
|
634
604
|
rb_define_method(geos_multi_polygon_methods, "centroid", method_multi_polygon_centroid, 0);
|
@@ -640,80 +610,6 @@ void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
|
|
640
610
|
/**** OTHER PUBLIC FUNCTIONS ****/
|
641
611
|
|
642
612
|
|
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
613
|
st_index_t rgeo_geos_geometry_collection_hash(GEOSContextHandle_t context, const GEOSGeometry* geom, st_index_t hash)
|
718
614
|
{
|
719
615
|
const GEOSGeometry* sub_geom;
|
@@ -9,8 +9,6 @@
|
|
9
9
|
#include <ruby.h>
|
10
10
|
#include <geos_c.h>
|
11
11
|
|
12
|
-
#include "factory.h"
|
13
|
-
|
14
12
|
RGEO_BEGIN_C
|
15
13
|
|
16
14
|
|
@@ -18,18 +16,7 @@ RGEO_BEGIN_C
|
|
18
16
|
Initializes the geometry collection module. This should be called after
|
19
17
|
the geometry module is initialized.
|
20
18
|
*/
|
21
|
-
void rgeo_init_geos_geometry_collection(
|
22
|
-
|
23
|
-
/*
|
24
|
-
Comopares the contents of two geometry collections. Does not test the
|
25
|
-
types of the collections themselves, but tests the types, values, and
|
26
|
-
contents of all the contents. The two given geometries MUST be
|
27
|
-
collection types-- i.e. GeometryCollection, MultiPoint, MultiLineString,
|
28
|
-
or MultiPolygon.
|
29
|
-
Returns Qtrue if the contents of the two geometry collections are equal,
|
30
|
-
Qfalse if they are inequal, or Qnil if an error occurs.
|
31
|
-
*/
|
32
|
-
VALUE rgeo_geos_geometry_collections_eql(GEOSContextHandle_t context, const GEOSGeometry* geom1, const GEOSGeometry* geom2, char check_z);
|
19
|
+
void rgeo_init_geos_geometry_collection();
|
33
20
|
|
34
21
|
/*
|
35
22
|
A tool for building up hash values.
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#include "preface.h"
|
2
|
+
|
3
|
+
#ifdef RGEO_GEOS_SUPPORTED
|
4
|
+
|
5
|
+
#include <ruby.h>
|
6
|
+
|
7
|
+
#include "globals.h"
|
8
|
+
|
9
|
+
RGEO_BEGIN_C
|
10
|
+
|
11
|
+
VALUE rgeo_module;
|
12
|
+
|
13
|
+
VALUE rgeo_feature_module;
|
14
|
+
VALUE rgeo_feature_geometry_module;
|
15
|
+
VALUE rgeo_feature_point_module;
|
16
|
+
VALUE rgeo_feature_line_string_module;
|
17
|
+
VALUE rgeo_feature_linear_ring_module;
|
18
|
+
VALUE rgeo_feature_line_module;
|
19
|
+
VALUE rgeo_feature_polygon_module;
|
20
|
+
VALUE rgeo_feature_geometry_collection_module;
|
21
|
+
VALUE rgeo_feature_multi_point_module;
|
22
|
+
VALUE rgeo_feature_multi_line_string_module;
|
23
|
+
VALUE rgeo_feature_multi_polygon_module;
|
24
|
+
|
25
|
+
VALUE rgeo_geos_module;
|
26
|
+
VALUE rgeo_geos_geometry_class;
|
27
|
+
VALUE rgeo_geos_point_class;
|
28
|
+
VALUE rgeo_geos_line_string_class;
|
29
|
+
VALUE rgeo_geos_linear_ring_class;
|
30
|
+
VALUE rgeo_geos_line_class;
|
31
|
+
VALUE rgeo_geos_polygon_class;
|
32
|
+
VALUE rgeo_geos_geometry_collection_class;
|
33
|
+
VALUE rgeo_geos_multi_point_class;
|
34
|
+
VALUE rgeo_geos_multi_line_string_class;
|
35
|
+
VALUE rgeo_geos_multi_polygon_class;
|
36
|
+
|
37
|
+
void rgeo_init_geos_globals()
|
38
|
+
{
|
39
|
+
rgeo_module = rb_define_module("RGeo");
|
40
|
+
rb_gc_register_mark_object(rgeo_module);
|
41
|
+
|
42
|
+
rgeo_feature_module = rb_define_module_under(rgeo_module, "Feature");
|
43
|
+
rb_gc_register_mark_object(rgeo_feature_module);
|
44
|
+
rgeo_feature_geometry_module = rb_const_get_at(rgeo_feature_module, rb_intern("Geometry"));
|
45
|
+
rb_gc_register_mark_object(rgeo_feature_geometry_module);
|
46
|
+
rgeo_feature_point_module = rb_const_get_at(rgeo_feature_module, rb_intern("Point"));
|
47
|
+
rb_gc_register_mark_object(rgeo_feature_point_module);
|
48
|
+
rgeo_feature_line_string_module = rb_const_get_at(rgeo_feature_module, rb_intern("LineString"));
|
49
|
+
rb_gc_register_mark_object(rgeo_feature_line_string_module);
|
50
|
+
rgeo_feature_linear_ring_module = rb_const_get_at(rgeo_feature_module, rb_intern("LinearRing"));
|
51
|
+
rb_gc_register_mark_object(rgeo_feature_linear_ring_module);
|
52
|
+
rgeo_feature_line_module = rb_const_get_at(rgeo_feature_module, rb_intern("Line"));
|
53
|
+
rb_gc_register_mark_object(rgeo_feature_line_module);
|
54
|
+
rgeo_feature_polygon_module = rb_const_get_at(rgeo_feature_module, rb_intern("Polygon"));
|
55
|
+
rb_gc_register_mark_object(rgeo_feature_polygon_module);
|
56
|
+
rgeo_feature_geometry_collection_module = rb_const_get_at(rgeo_feature_module, rb_intern("GeometryCollection"));
|
57
|
+
rb_gc_register_mark_object(rgeo_feature_geometry_collection_module);
|
58
|
+
rgeo_feature_multi_point_module = rb_const_get_at(rgeo_feature_module, rb_intern("MultiPoint"));
|
59
|
+
rb_gc_register_mark_object(rgeo_feature_multi_point_module);
|
60
|
+
rgeo_feature_multi_line_string_module = rb_const_get_at(rgeo_feature_module, rb_intern("MultiLineString"));
|
61
|
+
rb_gc_register_mark_object(rgeo_feature_multi_line_string_module);
|
62
|
+
rgeo_feature_multi_polygon_module = rb_const_get_at(rgeo_feature_module, rb_intern("MultiPolygon"));
|
63
|
+
rb_gc_register_mark_object(rgeo_feature_multi_polygon_module);
|
64
|
+
|
65
|
+
rgeo_geos_module = rb_define_module_under(rgeo_module, "Geos");
|
66
|
+
rb_gc_register_mark_object(rgeo_geos_module);
|
67
|
+
rgeo_geos_geometry_class = rb_define_class_under(rgeo_geos_module, "CAPIGeometryImpl", rb_cObject);
|
68
|
+
rb_gc_register_mark_object(rgeo_geos_geometry_class);
|
69
|
+
rgeo_geos_point_class = rb_define_class_under(rgeo_geos_module, "CAPIPointImpl", rb_cObject);
|
70
|
+
rb_gc_register_mark_object(rgeo_geos_point_class);
|
71
|
+
rgeo_geos_line_string_class = rb_define_class_under(rgeo_geos_module, "CAPILineStringImpl", rb_cObject);
|
72
|
+
rb_gc_register_mark_object(rgeo_geos_line_string_class);
|
73
|
+
rgeo_geos_linear_ring_class = rb_define_class_under(rgeo_geos_module, "CAPILinearRingImpl", rb_cObject);
|
74
|
+
rb_gc_register_mark_object(rgeo_geos_linear_ring_class);
|
75
|
+
rgeo_geos_line_class = rb_define_class_under(rgeo_geos_module, "CAPILineImpl", rb_cObject);
|
76
|
+
rb_gc_register_mark_object(rgeo_geos_line_class);
|
77
|
+
rgeo_geos_polygon_class = rb_define_class_under(rgeo_geos_module, "CAPIPolygonImpl", rb_cObject);
|
78
|
+
rb_gc_register_mark_object(rgeo_geos_polygon_class);
|
79
|
+
rgeo_geos_geometry_collection_class = rb_define_class_under(rgeo_geos_module, "CAPIGeometryCollectionImpl", rb_cObject);
|
80
|
+
rb_gc_register_mark_object(rgeo_geos_geometry_collection_class);
|
81
|
+
rgeo_geos_multi_point_class = rb_define_class_under(rgeo_geos_module, "CAPIMultiPointImpl", rb_cObject);
|
82
|
+
rb_gc_register_mark_object(rgeo_geos_multi_point_class);
|
83
|
+
rgeo_geos_multi_line_string_class = rb_define_class_under(rgeo_geos_module, "CAPIMultiLineStringImpl", rb_cObject);
|
84
|
+
rb_gc_register_mark_object(rgeo_geos_multi_line_string_class);
|
85
|
+
rgeo_geos_multi_polygon_class = rb_define_class_under(rgeo_geos_module, "CAPIMultiPolygonImpl", rb_cObject);
|
86
|
+
rb_gc_register_mark_object(rgeo_geos_multi_polygon_class);
|
87
|
+
}
|
88
|
+
|
89
|
+
RGEO_END_C
|
90
|
+
|
91
|
+
#endif
|
@@ -0,0 +1,45 @@
|
|
1
|
+
/*
|
2
|
+
Per-interpreter globals.
|
3
|
+
Most of these are cached references to commonly used classes, modules,
|
4
|
+
and symbols so we don't have to do a lot of constant lookups and calls
|
5
|
+
to rb_intern.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#ifndef RGEO_GEOS_GLOBALS_INCLUDED
|
9
|
+
#define RGEO_GEOS_GLOBALS_INCLUDED
|
10
|
+
|
11
|
+
#include <ruby.h>
|
12
|
+
|
13
|
+
RGEO_BEGIN_C
|
14
|
+
|
15
|
+
extern VALUE rgeo_module;
|
16
|
+
|
17
|
+
extern VALUE rgeo_feature_module;
|
18
|
+
extern VALUE rgeo_feature_geometry_module;
|
19
|
+
extern VALUE rgeo_feature_point_module;
|
20
|
+
extern VALUE rgeo_feature_line_string_module;
|
21
|
+
extern VALUE rgeo_feature_linear_ring_module;
|
22
|
+
extern VALUE rgeo_feature_line_module;
|
23
|
+
extern VALUE rgeo_feature_polygon_module;
|
24
|
+
extern VALUE rgeo_feature_geometry_collection_module;
|
25
|
+
extern VALUE rgeo_feature_multi_point_module;
|
26
|
+
extern VALUE rgeo_feature_multi_line_string_module;
|
27
|
+
extern VALUE rgeo_feature_multi_polygon_module;
|
28
|
+
|
29
|
+
extern VALUE rgeo_geos_module;
|
30
|
+
extern VALUE rgeo_geos_geometry_class;
|
31
|
+
extern VALUE rgeo_geos_point_class;
|
32
|
+
extern VALUE rgeo_geos_line_string_class;
|
33
|
+
extern VALUE rgeo_geos_linear_ring_class;
|
34
|
+
extern VALUE rgeo_geos_line_class;
|
35
|
+
extern VALUE rgeo_geos_polygon_class;
|
36
|
+
extern VALUE rgeo_geos_geometry_collection_class;
|
37
|
+
extern VALUE rgeo_geos_multi_point_class;
|
38
|
+
extern VALUE rgeo_geos_multi_line_string_class;
|
39
|
+
extern VALUE rgeo_geos_multi_polygon_class;
|
40
|
+
|
41
|
+
void rgeo_init_geos_globals();
|
42
|
+
|
43
|
+
RGEO_END_C
|
44
|
+
|
45
|
+
#endif
|