rgeo 2.3.1 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,28 +2,28 @@
2
2
  Geometry base class 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 <string.h>
11
- #include <ruby.h>
12
9
  #include <geos_c.h>
10
+ #include <ruby.h>
11
+ #include <string.h>
13
12
 
13
+ #include "errors.h"
14
14
  #include "factory.h"
15
15
  #include "geometry.h"
16
+ #include "globals.h"
16
17
 
17
18
  RGEO_BEGIN_C
18
19
 
19
-
20
20
  /**** INTERNAL UTILITY FUNCTIONS ****/
21
21
 
22
+ // Determine the dimension of the given geometry. Empty collections have
23
+ // dimension -1. Recursively checks collection elemenets.
22
24
 
23
- // Determine the dimension of the given geometry. Empty collections have dimension -1.
24
- // Recursively checks collection elemenets.
25
-
26
- static int compute_dimension(GEOSContextHandle_t context, const GEOSGeometry* geom)
25
+ static int
26
+ compute_dimension(const GEOSGeometry* geom)
27
27
  {
28
28
  int result;
29
29
  int size;
@@ -32,50 +32,50 @@ static int compute_dimension(GEOSContextHandle_t context, const GEOSGeometry* ge
32
32
 
33
33
  result = -1;
34
34
  if (geom) {
35
- switch (GEOSGeomTypeId_r(context, geom)) {
36
- case GEOS_POINT:
37
- result = 0;
38
- break;
39
- case GEOS_MULTIPOINT:
40
- if (!GEOSisEmpty_r(context, geom)) {
35
+ switch (GEOSGeomTypeId(geom)) {
36
+ case GEOS_POINT:
41
37
  result = 0;
42
- }
43
- break;
44
- case GEOS_LINESTRING:
45
- case GEOS_LINEARRING:
46
- result = 1;
47
- break;
48
- case GEOS_MULTILINESTRING:
49
- if (!GEOSisEmpty_r(context, geom)) {
38
+ break;
39
+ case GEOS_MULTIPOINT:
40
+ if (!GEOSisEmpty(geom)) {
41
+ result = 0;
42
+ }
43
+ break;
44
+ case GEOS_LINESTRING:
45
+ case GEOS_LINEARRING:
50
46
  result = 1;
51
- }
52
- break;
53
- case GEOS_POLYGON:
54
- result = 2;
55
- break;
56
- case GEOS_MULTIPOLYGON:
57
- if (!GEOSisEmpty_r(context, geom)) {
47
+ break;
48
+ case GEOS_MULTILINESTRING:
49
+ if (!GEOSisEmpty(geom)) {
50
+ result = 1;
51
+ }
52
+ break;
53
+ case GEOS_POLYGON:
58
54
  result = 2;
59
- }
60
- break;
61
- case GEOS_GEOMETRYCOLLECTION:
62
- size = GEOSGetNumGeometries_r(context, geom);
63
- for (i=0; i<size; ++i) {
64
- dim = compute_dimension(context, GEOSGetGeometryN_r(context, geom, i));
65
- if (dim > result) {
66
- result = dim;
55
+ break;
56
+ case GEOS_MULTIPOLYGON:
57
+ if (!GEOSisEmpty(geom)) {
58
+ result = 2;
67
59
  }
68
- }
69
- break;
60
+ break;
61
+ case GEOS_GEOMETRYCOLLECTION:
62
+ size = GEOSGetNumGeometries(geom);
63
+ for (i = 0; i < size; ++i) {
64
+ dim = compute_dimension(GEOSGetGeometryN(geom, i));
65
+ if (dim > result) {
66
+ result = dim;
67
+ }
68
+ }
69
+ break;
70
70
  }
71
71
  }
72
72
  return result;
73
73
  }
74
74
 
75
-
76
75
  // Returns a prepared geometry, honoring the preparation policy.
77
76
 
78
- static const GEOSPreparedGeometry* rgeo_request_prepared_geometry(RGeo_GeometryData* object_data)
77
+ static const GEOSPreparedGeometry*
78
+ rgeo_request_prepared_geometry(RGeo_GeometryData* object_data)
79
79
  {
80
80
  const GEOSPreparedGeometry* prep;
81
81
 
@@ -83,62 +83,59 @@ static const GEOSPreparedGeometry* rgeo_request_prepared_geometry(RGeo_GeometryD
83
83
  if (prep == (const GEOSPreparedGeometry*)1) {
84
84
  object_data->prep = (GEOSPreparedGeometry*)2;
85
85
  prep = NULL;
86
- }
87
- else if (prep == (const GEOSPreparedGeometry*)2) {
86
+ } else if (prep == (const GEOSPreparedGeometry*)2) {
88
87
  if (object_data->geom) {
89
- prep = GEOSPrepare_r(object_data->geos_context, object_data->geom);
90
- }
91
- else {
88
+ prep = GEOSPrepare(object_data->geom);
89
+ } else {
92
90
  prep = NULL;
93
91
  }
94
92
  if (prep) {
95
93
  object_data->prep = prep;
96
- }
97
- else {
94
+ } else {
98
95
  object_data->prep = (const GEOSPreparedGeometry*)3;
99
96
  }
100
- }
101
- else if (prep == (const GEOSPreparedGeometry*)3) {
97
+ } else if (prep == (const GEOSPreparedGeometry*)3) {
102
98
  prep = NULL;
103
99
  }
104
100
  return prep;
105
101
  }
106
102
 
107
-
108
103
  /**** RUBY METHOD DEFINITIONS ****/
109
104
 
110
-
111
- static VALUE method_geometry_initialized_p(VALUE self)
105
+ static VALUE
106
+ method_geometry_initialized_p(VALUE self)
112
107
  {
113
108
  return RGEO_GEOMETRY_DATA_PTR(self)->geom ? Qtrue : Qfalse;
114
109
  }
115
110
 
116
-
117
- static VALUE method_geometry_factory(VALUE self)
111
+ static VALUE
112
+ method_geometry_factory(VALUE self)
118
113
  {
119
114
  return RGEO_GEOMETRY_DATA_PTR(self)->factory;
120
115
  }
121
116
 
122
-
123
- static VALUE method_geometry_set_factory(VALUE self, VALUE factory)
117
+ static VALUE
118
+ method_geometry_set_factory(VALUE self, VALUE factory)
124
119
  {
125
120
  RGEO_GEOMETRY_DATA_PTR(self)->factory = factory;
126
121
  return factory;
127
122
  }
128
123
 
129
-
130
- static VALUE method_geometry_prepared_p(VALUE self)
124
+ static VALUE
125
+ method_geometry_prepared_p(VALUE self)
131
126
  {
132
127
  const GEOSPreparedGeometry* prep;
133
128
 
134
129
  prep = RGEO_GEOMETRY_DATA_PTR(self)->prep;
135
130
  return (prep && prep != (const GEOSPreparedGeometry*)1 &&
136
- prep != (const GEOSPreparedGeometry*)2 &&
137
- prep != (GEOSPreparedGeometry*)3) ? Qtrue : Qfalse;
131
+ prep != (const GEOSPreparedGeometry*)2 &&
132
+ prep != (GEOSPreparedGeometry*)3)
133
+ ? Qtrue
134
+ : Qfalse;
138
135
  }
139
136
 
140
-
141
- static VALUE method_geometry_prepare(VALUE self)
137
+ static VALUE
138
+ method_geometry_prepare(VALUE self)
142
139
  {
143
140
  RGeo_GeometryData* self_data;
144
141
  const GEOSPreparedGeometry* prep;
@@ -146,12 +143,12 @@ static VALUE method_geometry_prepare(VALUE self)
146
143
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
147
144
  if (self_data->geom) {
148
145
  prep = self_data->prep;
149
- if (!prep || prep == (const GEOSPreparedGeometry*)1 || prep == (const GEOSPreparedGeometry*)2) {
150
- prep = GEOSPrepare_r(self_data->geos_context, self_data->geom);
146
+ if (!prep || prep == (const GEOSPreparedGeometry*)1 ||
147
+ prep == (const GEOSPreparedGeometry*)2) {
148
+ prep = GEOSPrepare(self_data->geom);
151
149
  if (prep) {
152
150
  self_data->prep = prep;
153
- }
154
- else {
151
+ } else {
155
152
  self_data->prep = (const GEOSPreparedGeometry*)3;
156
153
  }
157
154
  }
@@ -159,8 +156,8 @@ static VALUE method_geometry_prepare(VALUE self)
159
156
  return self;
160
157
  }
161
158
 
162
-
163
- static VALUE method_geometry_dimension(VALUE self)
159
+ static VALUE
160
+ method_geometry_dimension(VALUE self)
164
161
  {
165
162
  VALUE result;
166
163
  RGeo_GeometryData* self_data;
@@ -170,29 +167,27 @@ static VALUE method_geometry_dimension(VALUE self)
170
167
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
171
168
  self_geom = self_data->geom;
172
169
  if (self_geom) {
173
- result = INT2NUM(compute_dimension(self_data->geos_context, self_geom));
170
+ result = INT2NUM(compute_dimension(self_geom));
174
171
  }
175
172
  return result;
176
173
  }
177
174
 
178
-
179
- static VALUE method_geometry_geometry_type(VALUE self)
175
+ static VALUE
176
+ method_geometry_geometry_type(VALUE self)
180
177
  {
181
178
  VALUE result;
182
179
  RGeo_GeometryData* self_data;
183
- const GEOSGeometry* self_geom;
184
180
 
185
181
  result = Qnil;
186
182
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
187
- self_geom = self_data->geom;
188
- if (self_geom) {
189
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_geometry;
183
+ if (self_data->geom) {
184
+ result = rgeo_feature_geometry_module;
190
185
  }
191
186
  return result;
192
187
  }
193
188
 
194
-
195
- static VALUE method_geometry_srid(VALUE self)
189
+ static VALUE
190
+ method_geometry_srid(VALUE self)
196
191
  {
197
192
  VALUE result;
198
193
  RGeo_GeometryData* self_data;
@@ -202,49 +197,45 @@ static VALUE method_geometry_srid(VALUE self)
202
197
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
203
198
  self_geom = self_data->geom;
204
199
  if (self_geom) {
205
- result = INT2NUM(GEOSGetSRID_r(self_data->geos_context, self_geom));
200
+ result = INT2NUM(GEOSGetSRID(self_geom));
206
201
  }
207
202
  return result;
208
203
  }
209
204
 
210
-
211
- static VALUE method_geometry_envelope(VALUE self)
205
+ static VALUE
206
+ method_geometry_envelope(VALUE self)
212
207
  {
213
208
  VALUE result;
214
209
  RGeo_GeometryData* self_data;
215
210
  const GEOSGeometry* self_geom;
216
- GEOSContextHandle_t geos_context;
217
211
  GEOSGeometry* envelope;
218
212
 
219
213
  result = Qnil;
220
214
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
221
215
  self_geom = self_data->geom;
222
216
  if (self_geom) {
223
- geos_context = self_data->geos_context;
224
- envelope = GEOSEnvelope_r(geos_context, self_geom);
217
+ envelope = GEOSEnvelope(self_geom);
225
218
  if (!envelope) {
226
- envelope = GEOSGeom_createCollection_r(geos_context, GEOS_GEOMETRYCOLLECTION, NULL, 0);
219
+ envelope = GEOSGeom_createCollection(GEOS_GEOMETRYCOLLECTION, NULL, 0);
227
220
  }
228
221
  result = rgeo_wrap_geos_geometry(self_data->factory, envelope, Qnil);
229
222
  }
230
223
  return result;
231
224
  }
232
225
 
233
-
234
- static VALUE method_geometry_boundary(VALUE self)
226
+ static VALUE
227
+ method_geometry_boundary(VALUE self)
235
228
  {
236
229
  VALUE result;
237
230
  RGeo_GeometryData* self_data;
238
231
  const GEOSGeometry* self_geom;
239
- GEOSContextHandle_t geos_context;
240
232
  GEOSGeometry* boundary;
241
233
 
242
234
  result = Qnil;
243
235
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
244
236
  self_geom = self_data->geom;
245
237
  if (self_geom) {
246
- geos_context = self_data->geos_context;
247
- boundary = GEOSBoundary_r(geos_context, self_geom);
238
+ boundary = GEOSBoundary(self_geom);
248
239
  if (boundary) {
249
240
  result = rgeo_wrap_geos_geometry(self_data->factory, boundary, Qnil);
250
241
  }
@@ -252,8 +243,8 @@ static VALUE method_geometry_boundary(VALUE self)
252
243
  return result;
253
244
  }
254
245
 
255
-
256
- static VALUE method_geometry_as_text(VALUE self)
246
+ static VALUE
247
+ method_geometry_as_text(VALUE self)
257
248
  {
258
249
  VALUE result;
259
250
  RGeo_GeometryData* self_data;
@@ -261,7 +252,6 @@ static VALUE method_geometry_as_text(VALUE self)
261
252
  RGeo_FactoryData* factory_data;
262
253
  VALUE wkt_generator;
263
254
  GEOSWKTWriter* wkt_writer;
264
- GEOSContextHandle_t geos_context;
265
255
  char* str;
266
256
 
267
257
  result = Qnil;
@@ -271,27 +261,27 @@ static VALUE method_geometry_as_text(VALUE self)
271
261
  factory_data = RGEO_FACTORY_DATA_PTR(self_data->factory);
272
262
  wkt_generator = factory_data->wkrep_wkt_generator;
273
263
  if (!NIL_P(wkt_generator)) {
274
- result = rb_funcall(wkt_generator, factory_data->globals->id_generate, 1, self);
275
- }
276
- else {
264
+ result = rb_funcall(wkt_generator, rb_intern("generate"), 1, self);
265
+ } else {
277
266
  wkt_writer = factory_data->wkt_writer;
278
- geos_context = self_data->geos_context;
279
267
  if (!wkt_writer) {
280
- wkt_writer = GEOSWKTWriter_create_r(geos_context);
268
+ wkt_writer = GEOSWKTWriter_create();
269
+ GEOSWKTWriter_setOutputDimension(wkt_writer, 2);
270
+ GEOSWKTWriter_setTrim(wkt_writer, 1);
281
271
  factory_data->wkt_writer = wkt_writer;
282
272
  }
283
- str = GEOSWKTWriter_write_r(geos_context, wkt_writer, self_geom);
273
+ str = GEOSWKTWriter_write(wkt_writer, self_geom);
284
274
  if (str) {
285
275
  result = rb_str_new2(str);
286
- GEOSFree_r(geos_context, str);
276
+ GEOSFree(str);
287
277
  }
288
278
  }
289
279
  }
290
280
  return result;
291
281
  }
292
282
 
293
-
294
- static VALUE method_geometry_as_binary(VALUE self)
283
+ static VALUE
284
+ method_geometry_as_binary(VALUE self)
295
285
  {
296
286
  VALUE result;
297
287
  RGeo_GeometryData* self_data;
@@ -299,7 +289,6 @@ static VALUE method_geometry_as_binary(VALUE self)
299
289
  RGeo_FactoryData* factory_data;
300
290
  VALUE wkb_generator;
301
291
  GEOSWKBWriter* wkb_writer;
302
- GEOSContextHandle_t geos_context;
303
292
  size_t size;
304
293
  char* str;
305
294
 
@@ -310,27 +299,27 @@ static VALUE method_geometry_as_binary(VALUE self)
310
299
  factory_data = RGEO_FACTORY_DATA_PTR(self_data->factory);
311
300
  wkb_generator = factory_data->wkrep_wkb_generator;
312
301
  if (!NIL_P(wkb_generator)) {
313
- result = rb_funcall(wkb_generator, factory_data->globals->id_generate, 1, self);
314
- }
315
- else {
302
+ result = rb_funcall(wkb_generator, rb_intern("generate"), 1, self);
303
+ } else {
316
304
  wkb_writer = factory_data->wkb_writer;
317
- geos_context = self_data->geos_context;
305
+
318
306
  if (!wkb_writer) {
319
- wkb_writer = GEOSWKBWriter_create_r(geos_context);
307
+ wkb_writer = GEOSWKBWriter_create();
308
+ GEOSWKBWriter_setOutputDimension(wkb_writer, 2);
320
309
  factory_data->wkb_writer = wkb_writer;
321
310
  }
322
- str = (char*)GEOSWKBWriter_write_r(geos_context, wkb_writer, self_geom, &size);
311
+ str = (char*)GEOSWKBWriter_write(wkb_writer, self_geom, &size);
323
312
  if (str) {
324
313
  result = rb_str_new(str, size);
325
- GEOSFree_r(geos_context, str);
314
+ GEOSFree(str);
326
315
  }
327
316
  }
328
317
  }
329
318
  return result;
330
319
  }
331
320
 
332
-
333
- static VALUE method_geometry_is_empty(VALUE self)
321
+ static VALUE
322
+ method_geometry_is_empty(VALUE self)
334
323
  {
335
324
  VALUE result;
336
325
  RGeo_GeometryData* self_data;
@@ -341,19 +330,18 @@ static VALUE method_geometry_is_empty(VALUE self)
341
330
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
342
331
  self_geom = self_data->geom;
343
332
  if (self_geom) {
344
- val = GEOSisEmpty_r(self_data->geos_context, self_geom);
333
+ val = GEOSisEmpty(self_geom);
345
334
  if (val == 0) {
346
335
  result = Qfalse;
347
- }
348
- else if (val == 1) {
336
+ } else if (val == 1) {
349
337
  result = Qtrue;
350
338
  }
351
339
  }
352
340
  return result;
353
341
  }
354
342
 
355
-
356
- static VALUE method_geometry_is_simple(VALUE self)
343
+ static VALUE
344
+ method_geometry_is_simple(VALUE self)
357
345
  {
358
346
  VALUE result;
359
347
  RGeo_GeometryData* self_data;
@@ -364,26 +352,28 @@ static VALUE method_geometry_is_simple(VALUE self)
364
352
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
365
353
  self_geom = self_data->geom;
366
354
  if (self_geom) {
367
- val = GEOSisSimple_r(self_data->geos_context, self_geom);
355
+ val = GEOSisSimple(self_geom);
368
356
  if (val == 0) {
369
357
  result = Qfalse;
370
- }
371
- else if (val == 1) {
358
+ } else if (val == 1) {
372
359
  result = Qtrue;
373
360
  }
374
361
  }
375
362
  return result;
376
363
  }
377
364
 
378
-
379
- static VALUE method_geometry_equals(VALUE self, VALUE rhs)
365
+ static VALUE
366
+ method_geometry_equals(VALUE self, VALUE rhs)
380
367
  {
381
368
  VALUE result;
382
369
  RGeo_GeometryData* self_data;
383
370
  const GEOSGeometry* self_geom;
384
371
  const GEOSGeometry* rhs_geom;
385
- GEOSContextHandle_t self_context;
386
- char val;
372
+
373
+ // Shortcut when self and rhs are the same object.
374
+ if (self == rhs) {
375
+ return Qtrue;
376
+ }
387
377
 
388
378
  result = Qnil;
389
379
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
@@ -391,42 +381,33 @@ static VALUE method_geometry_equals(VALUE self, VALUE rhs)
391
381
  if (self_geom) {
392
382
  rhs_geom = rgeo_get_geos_geometry_safe(rhs);
393
383
  if (rhs_geom) {
394
- self_context = self_data->geos_context;
395
384
  // GEOS has a bug where empty geometries are not spatially equal
396
385
  // to each other. Work around this case first.
397
- if (GEOSisEmpty_r(self_context, self_geom) == 1 &&
398
- GEOSisEmpty_r(RGEO_GEOMETRY_DATA_PTR(rhs)->geos_context, rhs_geom) == 1) {
386
+ if (GEOSisEmpty(self_geom) == 1 && GEOSisEmpty(rhs_geom) == 1) {
399
387
  result = Qtrue;
400
- }
401
- else {
402
- val = GEOSEquals_r(self_context, self_geom, rhs_geom);
403
- if (val == 0) {
404
- result = Qfalse;
405
- }
406
- else if (val == 1) {
407
- result = Qtrue;
408
- }
388
+ } else {
389
+ result = GEOSEquals(self_geom, rhs_geom) ? Qtrue : Qfalse;
409
390
  }
410
391
  }
411
392
  }
412
393
  return result;
413
394
  }
414
395
 
415
-
416
- static VALUE method_geometry_eql(VALUE self, VALUE rhs)
396
+ static VALUE
397
+ method_geometry_eql(VALUE self, VALUE rhs)
417
398
  {
418
399
  // This should be overridden by the subclass.
419
400
  return self == rhs ? Qtrue : Qfalse;
420
401
  }
421
402
 
422
-
423
- static VALUE method_geometry_disjoint(VALUE self, VALUE rhs)
403
+ static VALUE
404
+ method_geometry_disjoint(VALUE self, VALUE rhs)
424
405
  {
425
406
  VALUE result;
426
407
  RGeo_GeometryData* self_data;
427
408
  const GEOSGeometry* self_geom;
428
409
  const GEOSGeometry* rhs_geom;
429
- char val;
410
+ int state = 0;
430
411
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
431
412
  const GEOSPreparedGeometry* prep;
432
413
  #endif
@@ -435,34 +416,31 @@ static VALUE method_geometry_disjoint(VALUE self, VALUE rhs)
435
416
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
436
417
  self_geom = self_data->geom;
437
418
  if (self_geom) {
438
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
439
- if (rhs_geom) {
419
+ rhs_geom =
420
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
421
+ if (state) {
422
+ rb_jump_tag(state);
423
+ }
440
424
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
441
- prep = rgeo_request_prepared_geometry(self_data);
442
- if (prep)
443
- val = GEOSPreparedDisjoint_r(self_data->geos_context, prep, rhs_geom);
444
- else
425
+ prep = rgeo_request_prepared_geometry(self_data);
426
+ if (prep)
427
+ result = GEOSPreparedDisjoint(prep, rhs_geom) ? Qtrue : Qfalse;
428
+ else
445
429
  #endif
446
- val = GEOSDisjoint_r(self_data->geos_context, self_geom, rhs_geom);
447
- if (val == 0) {
448
- result = Qfalse;
449
- }
450
- else if (val == 1) {
451
- result = Qtrue;
452
- }
453
- }
430
+ result = GEOSDisjoint(self_geom, rhs_geom) ? Qtrue : Qfalse;
454
431
  }
455
432
  return result;
456
433
  }
457
434
 
458
-
459
- static VALUE method_geometry_intersects(VALUE self, VALUE rhs)
435
+ static VALUE
436
+ method_geometry_intersects(VALUE self, VALUE rhs)
460
437
  {
461
438
  VALUE result;
462
439
  RGeo_GeometryData* self_data;
463
440
  const GEOSGeometry* self_geom;
464
441
  const GEOSGeometry* rhs_geom;
465
442
  char val;
443
+ int state = 0;
466
444
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED1
467
445
  const GEOSPreparedGeometry* prep;
468
446
  #endif
@@ -471,34 +449,36 @@ static VALUE method_geometry_intersects(VALUE self, VALUE rhs)
471
449
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
472
450
  self_geom = self_data->geom;
473
451
  if (self_geom) {
474
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
475
- if (rhs_geom) {
452
+ rhs_geom =
453
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
454
+ if (state) {
455
+ rb_jump_tag(state);
456
+ }
476
457
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED1
477
- prep = rgeo_request_prepared_geometry(self_data);
478
- if (prep)
479
- val = GEOSPreparedIntersects_r(self_data->geos_context, prep, rhs_geom);
480
- else
458
+ prep = rgeo_request_prepared_geometry(self_data);
459
+ if (prep)
460
+ val = GEOSPreparedIntersects(prep, rhs_geom);
461
+ else
481
462
  #endif
482
- val = GEOSIntersects_r(self_data->geos_context, self_geom, rhs_geom);
483
- if (val == 0) {
484
- result = Qfalse;
485
- }
486
- else if (val == 1) {
487
- result = Qtrue;
488
- }
463
+ val = GEOSIntersects(self_geom, rhs_geom);
464
+ if (val == 0) {
465
+ result = Qfalse;
466
+ } else if (val == 1) {
467
+ result = Qtrue;
489
468
  }
490
469
  }
491
470
  return result;
492
471
  }
493
472
 
494
-
495
- static VALUE method_geometry_touches(VALUE self, VALUE rhs)
473
+ static VALUE
474
+ method_geometry_touches(VALUE self, VALUE rhs)
496
475
  {
497
476
  VALUE result;
498
477
  RGeo_GeometryData* self_data;
499
478
  const GEOSGeometry* self_geom;
500
479
  const GEOSGeometry* rhs_geom;
501
480
  char val;
481
+ int state = 0;
502
482
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
503
483
  const GEOSPreparedGeometry* prep;
504
484
  #endif
@@ -507,34 +487,36 @@ static VALUE method_geometry_touches(VALUE self, VALUE rhs)
507
487
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
508
488
  self_geom = self_data->geom;
509
489
  if (self_geom) {
510
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
511
- if (rhs_geom) {
490
+ rhs_geom =
491
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
492
+ if (state) {
493
+ rb_jump_tag(state);
494
+ }
512
495
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
513
- prep = rgeo_request_prepared_geometry(self_data);
514
- if (prep)
515
- val = GEOSPreparedTouches_r(self_data->geos_context, prep, rhs_geom);
516
- else
496
+ prep = rgeo_request_prepared_geometry(self_data);
497
+ if (prep)
498
+ val = GEOSPreparedTouches(prep, rhs_geom);
499
+ else
517
500
  #endif
518
- val = GEOSTouches_r(self_data->geos_context, self_geom, rhs_geom);
519
- if (val == 0) {
520
- result = Qfalse;
521
- }
522
- else if (val == 1) {
523
- result = Qtrue;
524
- }
501
+ val = GEOSTouches(self_geom, rhs_geom);
502
+ if (val == 0) {
503
+ result = Qfalse;
504
+ } else if (val == 1) {
505
+ result = Qtrue;
525
506
  }
526
507
  }
527
508
  return result;
528
509
  }
529
510
 
530
-
531
- static VALUE method_geometry_crosses(VALUE self, VALUE rhs)
511
+ static VALUE
512
+ method_geometry_crosses(VALUE self, VALUE rhs)
532
513
  {
533
514
  VALUE result;
534
515
  RGeo_GeometryData* self_data;
535
516
  const GEOSGeometry* self_geom;
536
517
  const GEOSGeometry* rhs_geom;
537
518
  char val;
519
+ int state = 0;
538
520
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
539
521
  const GEOSPreparedGeometry* prep;
540
522
  #endif
@@ -543,34 +525,36 @@ static VALUE method_geometry_crosses(VALUE self, VALUE rhs)
543
525
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
544
526
  self_geom = self_data->geom;
545
527
  if (self_geom) {
546
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
547
- if (rhs_geom) {
528
+ rhs_geom =
529
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
530
+ if (state) {
531
+ rb_jump_tag(state);
532
+ }
548
533
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
549
- prep = rgeo_request_prepared_geometry(self_data);
550
- if (prep)
551
- val = GEOSPreparedCrosses_r(self_data->geos_context, prep, rhs_geom);
552
- else
534
+ prep = rgeo_request_prepared_geometry(self_data);
535
+ if (prep)
536
+ val = GEOSPreparedCrosses(prep, rhs_geom);
537
+ else
553
538
  #endif
554
- val = GEOSCrosses_r(self_data->geos_context, self_geom, rhs_geom);
555
- if (val == 0) {
556
- result = Qfalse;
557
- }
558
- else if (val == 1) {
559
- result = Qtrue;
560
- }
539
+ val = GEOSCrosses(self_geom, rhs_geom);
540
+ if (val == 0) {
541
+ result = Qfalse;
542
+ } else if (val == 1) {
543
+ result = Qtrue;
561
544
  }
562
545
  }
563
546
  return result;
564
547
  }
565
548
 
566
-
567
- static VALUE method_geometry_within(VALUE self, VALUE rhs)
549
+ static VALUE
550
+ method_geometry_within(VALUE self, VALUE rhs)
568
551
  {
569
552
  VALUE result;
570
553
  RGeo_GeometryData* self_data;
571
554
  const GEOSGeometry* self_geom;
572
555
  const GEOSGeometry* rhs_geom;
573
556
  char val;
557
+ int state = 0;
574
558
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
575
559
  const GEOSPreparedGeometry* prep;
576
560
  #endif
@@ -579,34 +563,36 @@ static VALUE method_geometry_within(VALUE self, VALUE rhs)
579
563
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
580
564
  self_geom = self_data->geom;
581
565
  if (self_geom) {
582
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
583
- if (rhs_geom) {
566
+ rhs_geom =
567
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
568
+ if (state) {
569
+ rb_jump_tag(state);
570
+ }
584
571
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
585
- prep = rgeo_request_prepared_geometry(self_data);
586
- if (prep)
587
- val = GEOSPreparedWithin_r(self_data->geos_context, prep, rhs_geom);
588
- else
572
+ prep = rgeo_request_prepared_geometry(self_data);
573
+ if (prep)
574
+ val = GEOSPreparedWithin(prep, rhs_geom);
575
+ else
589
576
  #endif
590
- val = GEOSWithin_r(self_data->geos_context, self_geom, rhs_geom);
591
- if (val == 0) {
592
- result = Qfalse;
593
- }
594
- else if (val == 1) {
595
- result = Qtrue;
596
- }
577
+ val = GEOSWithin(self_geom, rhs_geom);
578
+ if (val == 0) {
579
+ result = Qfalse;
580
+ } else if (val == 1) {
581
+ result = Qtrue;
597
582
  }
598
583
  }
599
584
  return result;
600
585
  }
601
586
 
602
-
603
- static VALUE method_geometry_contains(VALUE self, VALUE rhs)
587
+ static VALUE
588
+ method_geometry_contains(VALUE self, VALUE rhs)
604
589
  {
605
590
  VALUE result;
606
591
  RGeo_GeometryData* self_data;
607
592
  const GEOSGeometry* self_geom;
608
593
  const GEOSGeometry* rhs_geom;
609
594
  char val;
595
+ int state = 0;
610
596
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED1
611
597
  const GEOSPreparedGeometry* prep;
612
598
  #endif
@@ -615,34 +601,36 @@ static VALUE method_geometry_contains(VALUE self, VALUE rhs)
615
601
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
616
602
  self_geom = self_data->geom;
617
603
  if (self_geom) {
618
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
619
- if (rhs_geom) {
604
+ rhs_geom =
605
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
606
+ if (state) {
607
+ rb_jump_tag(state);
608
+ }
620
609
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED1
621
- prep = rgeo_request_prepared_geometry(self_data);
622
- if (prep)
623
- val = GEOSPreparedContains_r(self_data->geos_context, prep, rhs_geom);
624
- else
610
+ prep = rgeo_request_prepared_geometry(self_data);
611
+ if (prep)
612
+ val = GEOSPreparedContains(prep, rhs_geom);
613
+ else
625
614
  #endif
626
- val = GEOSContains_r(self_data->geos_context, self_geom, rhs_geom);
627
- if (val == 0) {
628
- result = Qfalse;
629
- }
630
- else if (val == 1) {
631
- result = Qtrue;
632
- }
615
+ val = GEOSContains(self_geom, rhs_geom);
616
+ if (val == 0) {
617
+ result = Qfalse;
618
+ } else if (val == 1) {
619
+ result = Qtrue;
633
620
  }
634
621
  }
635
622
  return result;
636
623
  }
637
624
 
638
-
639
- static VALUE method_geometry_overlaps(VALUE self, VALUE rhs)
625
+ static VALUE
626
+ method_geometry_overlaps(VALUE self, VALUE rhs)
640
627
  {
641
628
  VALUE result;
642
629
  RGeo_GeometryData* self_data;
643
630
  const GEOSGeometry* self_geom;
644
631
  const GEOSGeometry* rhs_geom;
645
632
  char val;
633
+ int state = 0;
646
634
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
647
635
  const GEOSPreparedGeometry* prep;
648
636
  #endif
@@ -651,78 +639,86 @@ static VALUE method_geometry_overlaps(VALUE self, VALUE rhs)
651
639
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
652
640
  self_geom = self_data->geom;
653
641
  if (self_geom) {
654
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
655
- if (rhs_geom) {
642
+ rhs_geom =
643
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
644
+ if (state) {
645
+ rb_jump_tag(state);
646
+ }
656
647
  #ifdef RGEO_GEOS_SUPPORTS_PREPARED2
657
- prep = rgeo_request_prepared_geometry(self_data);
658
- if (prep)
659
- val = GEOSPreparedOverlaps_r(self_data->geos_context, prep, rhs_geom);
660
- else
648
+ prep = rgeo_request_prepared_geometry(self_data);
649
+ if (prep)
650
+ val = GEOSPreparedOverlaps(prep, rhs_geom);
651
+ else
661
652
  #endif
662
- val = GEOSOverlaps_r(self_data->geos_context, self_geom, rhs_geom);
663
- if (val == 0) {
664
- result = Qfalse;
665
- }
666
- else if (val == 1) {
667
- result = Qtrue;
668
- }
653
+ val = GEOSOverlaps(self_geom, rhs_geom);
654
+ if (val == 0) {
655
+ result = Qfalse;
656
+ } else if (val == 1) {
657
+ result = Qtrue;
669
658
  }
670
659
  }
671
660
  return result;
672
661
  }
673
662
 
674
-
675
- static VALUE method_geometry_relate(VALUE self, VALUE rhs, VALUE pattern)
663
+ static VALUE
664
+ method_geometry_relate(VALUE self, VALUE rhs, VALUE pattern)
676
665
  {
677
666
  VALUE result;
678
667
  RGeo_GeometryData* self_data;
679
668
  const GEOSGeometry* self_geom;
680
669
  const GEOSGeometry* rhs_geom;
681
670
  char val;
671
+ int state = 0;
682
672
 
683
673
  result = Qnil;
684
674
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
685
675
  self_geom = self_data->geom;
686
676
  if (self_geom) {
687
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
688
- if (rhs_geom) {
689
- val = GEOSRelatePattern_r(self_data->geos_context, self_geom, rhs_geom, StringValuePtr(pattern));
690
- if (val == 0) {
691
- result = Qfalse;
692
- }
693
- else if (val == 1) {
694
- result = Qtrue;
695
- }
677
+ rhs_geom =
678
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
679
+ if (state) {
680
+ rb_jump_tag(state);
681
+ }
682
+
683
+ val = GEOSRelatePattern(self_geom, rhs_geom, StringValuePtr(pattern));
684
+ if (val == 0) {
685
+ result = Qfalse;
686
+ } else if (val == 1) {
687
+ result = Qtrue;
696
688
  }
697
689
  }
698
690
  return result;
699
691
  }
700
692
 
701
-
702
- static VALUE method_geometry_distance(VALUE self, VALUE rhs)
693
+ static VALUE
694
+ method_geometry_distance(VALUE self, VALUE rhs)
703
695
  {
704
696
  VALUE result;
705
697
  RGeo_GeometryData* self_data;
706
698
  const GEOSGeometry* self_geom;
707
699
  const GEOSGeometry* rhs_geom;
708
700
  double dist;
701
+ int state = 0;
709
702
 
710
703
  result = Qnil;
711
704
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
712
705
  self_geom = self_data->geom;
713
706
  if (self_geom) {
714
- rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
715
- if (rhs_geom) {
716
- if (GEOSDistance_r(self_data->geos_context, self_geom, rhs_geom, &dist)) {
717
- result = rb_float_new(dist);
718
- }
707
+ rhs_geom =
708
+ rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil, &state);
709
+ if (state) {
710
+ rb_jump_tag(state);
711
+ }
712
+
713
+ if (GEOSDistance(self_geom, rhs_geom, &dist)) {
714
+ result = rb_float_new(dist);
719
715
  }
720
716
  }
721
717
  return result;
722
718
  }
723
719
 
724
-
725
- static VALUE method_geometry_buffer(VALUE self, VALUE distance)
720
+ static VALUE
721
+ method_geometry_buffer(VALUE self, VALUE distance)
726
722
  {
727
723
  VALUE result;
728
724
  RGeo_GeometryData* self_data;
@@ -734,13 +730,19 @@ static VALUE method_geometry_buffer(VALUE self, VALUE distance)
734
730
  self_geom = self_data->geom;
735
731
  if (self_geom) {
736
732
  factory = self_data->factory;
737
- result = rgeo_wrap_geos_geometry(factory, GEOSBuffer_r(self_data->geos_context, self_geom,
738
- rb_num2dbl(distance), RGEO_FACTORY_DATA_PTR(factory)->buffer_resolution), Qnil);
733
+ result = rgeo_wrap_geos_geometry(
734
+ factory,
735
+ GEOSBuffer(self_geom,
736
+ rb_num2dbl(distance),
737
+ RGEO_FACTORY_DATA_PTR(factory)->buffer_resolution),
738
+ Qnil);
739
739
  }
740
740
  return result;
741
741
  }
742
742
 
743
- static VALUE method_geometry_buffer_with_style(VALUE self, VALUE distance, VALUE endCapStyle, VALUE joinStyle, VALUE mitreLimit)
743
+ #ifdef RGEO_GEOS_SUPPORTS_DENSIFY
744
+ static VALUE
745
+ method_geometry_segmentize(VALUE self, VALUE max_segment_length)
744
746
  {
745
747
  VALUE result;
746
748
  RGeo_GeometryData* self_data;
@@ -752,19 +754,19 @@ static VALUE method_geometry_buffer_with_style(VALUE self, VALUE distance, VALUE
752
754
  self_geom = self_data->geom;
753
755
  if (self_geom) {
754
756
  factory = self_data->factory;
755
- result = rgeo_wrap_geos_geometry(factory,
756
- GEOSBufferWithStyle_r(self_data->geos_context, self_geom,
757
- rb_num2dbl(distance),
758
- RGEO_FACTORY_DATA_PTR(factory)->buffer_resolution,
759
- rb_num2int(endCapStyle),
760
- rb_num2int(joinStyle),
761
- rb_num2dbl(mitreLimit)),
762
- Qnil);
757
+ result = rgeo_wrap_geos_geometry(
758
+ factory, GEOSDensify(self_geom, rb_num2dbl(max_segment_length)), Qnil);
763
759
  }
764
760
  return result;
765
761
  }
762
+ #endif
766
763
 
767
- static VALUE method_geometry_simplify(VALUE self, VALUE tolerance)
764
+ static VALUE
765
+ method_geometry_buffer_with_style(VALUE self,
766
+ VALUE distance,
767
+ VALUE endCapStyle,
768
+ VALUE joinStyle,
769
+ VALUE mitreLimit)
768
770
  {
769
771
  VALUE result;
770
772
  RGeo_GeometryData* self_data;
@@ -776,13 +778,21 @@ static VALUE method_geometry_simplify(VALUE self, VALUE tolerance)
776
778
  self_geom = self_data->geom;
777
779
  if (self_geom) {
778
780
  factory = self_data->factory;
779
- result = rgeo_wrap_geos_geometry(factory, GEOSSimplify_r(self_data->geos_context, self_geom,
780
- rb_num2dbl(tolerance)), Qnil);
781
+ result = rgeo_wrap_geos_geometry(
782
+ factory,
783
+ GEOSBufferWithStyle(self_geom,
784
+ rb_num2dbl(distance),
785
+ RGEO_FACTORY_DATA_PTR(factory)->buffer_resolution,
786
+ RB_NUM2INT(endCapStyle),
787
+ RB_NUM2INT(joinStyle),
788
+ rb_num2dbl(mitreLimit)),
789
+ Qnil);
781
790
  }
782
791
  return result;
783
792
  }
784
793
 
785
- static VALUE method_geometry_simplify_preserve_topology(VALUE self, VALUE tolerance)
794
+ static VALUE
795
+ method_geometry_simplify(VALUE self, VALUE tolerance)
786
796
  {
787
797
  VALUE result;
788
798
  RGeo_GeometryData* self_data;
@@ -794,162 +804,194 @@ static VALUE method_geometry_simplify_preserve_topology(VALUE self, VALUE tolera
794
804
  self_geom = self_data->geom;
795
805
  if (self_geom) {
796
806
  factory = self_data->factory;
797
- result = rgeo_wrap_geos_geometry(factory, GEOSTopologyPreserveSimplify_r(self_data->geos_context, self_geom,
798
- rb_num2dbl(tolerance)), Qnil);
807
+ result = rgeo_wrap_geos_geometry(
808
+ factory, GEOSSimplify(self_geom, rb_num2dbl(tolerance)), Qnil);
799
809
  }
800
810
  return result;
801
811
  }
802
812
 
803
-
804
- static VALUE method_geometry_convex_hull(VALUE self)
813
+ static VALUE
814
+ method_geometry_simplify_preserve_topology(VALUE self, VALUE tolerance)
805
815
  {
806
816
  VALUE result;
807
817
  RGeo_GeometryData* self_data;
808
818
  const GEOSGeometry* self_geom;
819
+ VALUE factory;
809
820
 
810
821
  result = Qnil;
811
822
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
812
823
  self_geom = self_data->geom;
813
824
  if (self_geom) {
814
- result = rgeo_wrap_geos_geometry(self_data->factory, GEOSConvexHull_r(self_data->geos_context, self_geom), Qnil);
825
+ factory = self_data->factory;
826
+ result = rgeo_wrap_geos_geometry(
827
+ factory,
828
+ GEOSTopologyPreserveSimplify(self_geom, rb_num2dbl(tolerance)),
829
+ Qnil);
815
830
  }
816
831
  return result;
817
832
  }
818
833
 
834
+ static VALUE
835
+ method_geometry_convex_hull(VALUE self)
836
+ {
837
+ VALUE result;
838
+ RGeo_GeometryData* self_data;
839
+ const GEOSGeometry* self_geom;
819
840
 
820
- static VALUE method_geometry_intersection(VALUE self, VALUE rhs)
841
+ result = Qnil;
842
+ self_data = RGEO_GEOMETRY_DATA_PTR(self);
843
+ self_geom = self_data->geom;
844
+ if (self_geom) {
845
+ result = rgeo_wrap_geos_geometry(
846
+ self_data->factory, GEOSConvexHull(self_geom), Qnil);
847
+ }
848
+ return result;
849
+ }
850
+
851
+ static VALUE
852
+ method_geometry_intersection(VALUE self, VALUE rhs)
821
853
  {
822
854
  VALUE result;
823
855
  RGeo_GeometryData* self_data;
824
856
  const GEOSGeometry* self_geom;
825
857
  VALUE factory;
826
858
  const GEOSGeometry* rhs_geom;
859
+ int state = 0;
827
860
 
828
861
  result = Qnil;
829
862
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
830
863
  self_geom = self_data->geom;
831
864
  if (self_geom) {
832
865
  factory = self_data->factory;
833
- rhs_geom = rgeo_convert_to_geos_geometry(factory, rhs, Qnil);
834
- if (rhs_geom) {
835
- result = rgeo_wrap_geos_geometry(factory, GEOSIntersection_r(self_data->geos_context, self_geom, rhs_geom), Qnil);
866
+ rhs_geom = rgeo_convert_to_geos_geometry(factory, rhs, Qnil, &state);
867
+ if (state) {
868
+ rb_jump_tag(state);
836
869
  }
870
+
871
+ result = rgeo_wrap_geos_geometry(
872
+ factory, GEOSIntersection(self_geom, rhs_geom), Qnil);
837
873
  }
838
874
  return result;
839
875
  }
840
876
 
841
-
842
- static VALUE method_geometry_union(VALUE self, VALUE rhs)
877
+ static VALUE
878
+ method_geometry_union(VALUE self, VALUE rhs)
843
879
  {
844
880
  VALUE result;
845
881
  RGeo_GeometryData* self_data;
846
882
  const GEOSGeometry* self_geom;
847
883
  VALUE factory;
848
884
  const GEOSGeometry* rhs_geom;
885
+ int state = 0;
849
886
 
850
887
  result = Qnil;
851
888
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
852
889
  self_geom = self_data->geom;
853
890
  if (self_geom) {
854
891
  factory = self_data->factory;
855
- rhs_geom = rgeo_convert_to_geos_geometry(factory, rhs, Qnil);
856
- if (rhs_geom) {
857
- result = rgeo_wrap_geos_geometry(factory, GEOSUnion_r(self_data->geos_context, self_geom, rhs_geom), Qnil);
892
+ rhs_geom = rgeo_convert_to_geos_geometry(factory, rhs, Qnil, &state);
893
+ if (state) {
894
+ rb_jump_tag(state);
858
895
  }
896
+
897
+ result =
898
+ rgeo_wrap_geos_geometry(factory, GEOSUnion(self_geom, rhs_geom), Qnil);
859
899
  }
860
900
  return result;
861
901
  }
862
902
 
863
-
864
- static VALUE method_geometry_unary_union(VALUE self)
903
+ static VALUE
904
+ method_geometry_unary_union(VALUE self)
865
905
  {
866
- VALUE result;
906
+ #ifdef RGEO_GEOS_SUPPORTS_UNARYUNION
867
907
  RGeo_GeometryData* self_data;
868
908
  const GEOSGeometry* self_geom;
869
909
 
870
- result = Qnil;
871
-
872
- #ifdef RGEO_GEOS_SUPPORTS_UNARYUNION
873
910
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
874
911
  self_geom = self_data->geom;
875
912
  if (self_geom) {
876
- GEOSContextHandle_t self_context = self_data->geos_context;
877
- result = rgeo_wrap_geos_geometry(self_data->factory,
878
- GEOSUnaryUnion_r(self_context, self_geom),
879
- Qnil);
913
+ return rgeo_wrap_geos_geometry(
914
+ self_data->factory, GEOSUnaryUnion(self_geom), Qnil);
880
915
  }
881
916
  #endif
882
917
 
883
- return result;
918
+ return Qnil;
884
919
  }
885
920
 
886
-
887
- static VALUE method_geometry_difference(VALUE self, VALUE rhs)
921
+ static VALUE
922
+ method_geometry_difference(VALUE self, VALUE rhs)
888
923
  {
889
924
  VALUE result;
890
925
  RGeo_GeometryData* self_data;
891
926
  const GEOSGeometry* self_geom;
892
927
  VALUE factory;
893
928
  const GEOSGeometry* rhs_geom;
929
+ int state = 0;
894
930
 
895
931
  result = Qnil;
896
932
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
897
933
  self_geom = self_data->geom;
898
934
  if (self_geom) {
899
935
  factory = self_data->factory;
900
- rhs_geom = rgeo_convert_to_geos_geometry(factory, rhs, Qnil);
901
- if (rhs_geom) {
902
- result = rgeo_wrap_geos_geometry(factory, GEOSDifference_r(self_data->geos_context, self_geom, rhs_geom), Qnil);
936
+ rhs_geom = rgeo_convert_to_geos_geometry(factory, rhs, Qnil, &state);
937
+ if (state) {
938
+ rb_jump_tag(state);
903
939
  }
940
+
941
+ result = rgeo_wrap_geos_geometry(
942
+ factory, GEOSDifference(self_geom, rhs_geom), Qnil);
904
943
  }
905
944
  return result;
906
945
  }
907
946
 
908
-
909
- static VALUE method_geometry_sym_difference(VALUE self, VALUE rhs)
947
+ static VALUE
948
+ method_geometry_sym_difference(VALUE self, VALUE rhs)
910
949
  {
911
950
  VALUE result;
912
951
  RGeo_GeometryData* self_data;
913
952
  const GEOSGeometry* self_geom;
914
953
  VALUE factory;
915
954
  const GEOSGeometry* rhs_geom;
955
+ int state = 0;
916
956
 
917
957
  result = Qnil;
918
958
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
919
959
  self_geom = self_data->geom;
920
960
  if (self_geom) {
921
961
  factory = self_data->factory;
922
- rhs_geom = rgeo_convert_to_geos_geometry(factory, rhs, Qnil);
923
- if (rhs_geom) {
924
- result = rgeo_wrap_geos_geometry(factory, GEOSSymDifference_r(self_data->geos_context, self_geom, rhs_geom), Qnil);
962
+ rhs_geom = rgeo_convert_to_geos_geometry(factory, rhs, Qnil, &state);
963
+ if (state) {
964
+ rb_jump_tag(state);
925
965
  }
966
+
967
+ result = rgeo_wrap_geos_geometry(
968
+ factory, GEOSSymDifference(self_geom, rhs_geom), Qnil);
926
969
  }
927
970
  return result;
928
971
  }
929
972
 
930
-
931
- static VALUE method_geometry_initialize_copy(VALUE self, VALUE orig)
973
+ static VALUE
974
+ method_geometry_initialize_copy(VALUE self, VALUE orig)
932
975
  {
933
976
  RGeo_GeometryData* self_data;
934
977
  const GEOSPreparedGeometry* prep;
935
978
  const GEOSGeometry* geom;
936
979
  RGeo_GeometryData* orig_data;
937
- GEOSContextHandle_t orig_context;
938
980
  GEOSGeometry* clone_geom;
939
981
  RGeo_FactoryData* factory_data;
940
982
 
941
983
  // Clear out any existing value
942
984
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
943
985
  if (self_data->geom) {
944
- GEOSGeom_destroy_r(self_data->geos_context, self_data->geom);
986
+ GEOSGeom_destroy(self_data->geom);
945
987
  self_data->geom = NULL;
946
988
  }
947
989
  prep = self_data->prep;
948
- if (prep && prep != (GEOSPreparedGeometry*)1 && prep != (GEOSPreparedGeometry*)2) {
949
- GEOSPreparedGeom_destroy_r(self_data->geos_context, prep);
990
+ if (prep && prep != (GEOSPreparedGeometry*)1 &&
991
+ prep != (GEOSPreparedGeometry*)2) {
992
+ GEOSPreparedGeom_destroy(prep);
950
993
  }
951
994
  self_data->prep = NULL;
952
- self_data->geos_context = NULL;
953
995
  self_data->factory = Qnil;
954
996
  self_data->klasses = Qnil;
955
997
 
@@ -957,15 +999,16 @@ static VALUE method_geometry_initialize_copy(VALUE self, VALUE orig)
957
999
  geom = rgeo_get_geos_geometry_safe(orig);
958
1000
  if (geom) {
959
1001
  orig_data = RGEO_GEOMETRY_DATA_PTR(orig);
960
- orig_context = orig_data->geos_context;
961
- clone_geom = GEOSGeom_clone_r(orig_context, geom);
1002
+ clone_geom = GEOSGeom_clone(geom);
962
1003
  if (clone_geom) {
963
1004
  factory_data = RGEO_FACTORY_DATA_PTR(orig_data->factory);
964
- GEOSSetSRID_r(orig_context, clone_geom, GEOSGetSRID_r(orig_context, geom));
1005
+ GEOSSetSRID(clone_geom, GEOSGetSRID(geom));
965
1006
  self_data->geom = clone_geom;
966
- self_data->geos_context = orig_context;
967
- self_data->prep = factory_data && ((factory_data->flags & RGEO_FACTORYFLAGS_PREPARE_HEURISTIC) != 0) ?
968
- (GEOSPreparedGeometry*)1 : NULL;
1007
+ self_data->prep =
1008
+ factory_data &&
1009
+ ((factory_data->flags & RGEO_FACTORYFLAGS_PREPARE_HEURISTIC) != 0)
1010
+ ? (GEOSPreparedGeometry*)1
1011
+ : NULL;
969
1012
  self_data->factory = orig_data->factory;
970
1013
  self_data->klasses = orig_data->klasses;
971
1014
  }
@@ -973,8 +1016,8 @@ static VALUE method_geometry_initialize_copy(VALUE self, VALUE orig)
973
1016
  return self;
974
1017
  }
975
1018
 
976
-
977
- static VALUE method_geometry_steal(VALUE self, VALUE orig)
1019
+ static VALUE
1020
+ method_geometry_steal(VALUE self, VALUE orig)
978
1021
  {
979
1022
  RGeo_GeometryData* self_data;
980
1023
  const GEOSPreparedGeometry* prep;
@@ -986,32 +1029,32 @@ static VALUE method_geometry_steal(VALUE self, VALUE orig)
986
1029
  // Clear out any existing value
987
1030
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
988
1031
  if (self_data->geom) {
989
- GEOSGeom_destroy_r(self_data->geos_context, self_data->geom);
1032
+ GEOSGeom_destroy(self_data->geom);
990
1033
  }
991
1034
  prep = self_data->prep;
992
- if (prep && prep != (GEOSPreparedGeometry*)1 && prep != (GEOSPreparedGeometry*)2) {
993
- GEOSPreparedGeom_destroy_r(self_data->geos_context, prep);
1035
+ if (prep && prep != (GEOSPreparedGeometry*)1 &&
1036
+ prep != (GEOSPreparedGeometry*)2) {
1037
+ GEOSPreparedGeom_destroy(prep);
994
1038
  }
995
1039
 
996
1040
  // Steal value from orig
997
1041
  orig_data = RGEO_GEOMETRY_DATA_PTR(orig);
998
1042
  self_data->geom = orig_data->geom;
999
1043
  self_data->prep = orig_data->prep;
1000
- self_data->geos_context = orig_data->geos_context;
1001
1044
  self_data->factory = orig_data->factory;
1002
1045
  self_data->klasses = orig_data->klasses;
1003
1046
 
1004
1047
  // Clear out orig
1005
1048
  orig_data->geom = NULL;
1006
1049
  orig_data->prep = NULL;
1007
- orig_data->geos_context = NULL;
1008
1050
  orig_data->factory = Qnil;
1009
1051
  orig_data->klasses = Qnil;
1010
1052
  }
1011
1053
  return self;
1012
1054
  }
1013
1055
 
1014
- static VALUE method_geometry_is_valid(VALUE self)
1056
+ static VALUE
1057
+ method_geometry_is_valid(VALUE self)
1015
1058
  {
1016
1059
  VALUE result;
1017
1060
  RGeo_GeometryData* self_data;
@@ -1022,18 +1065,18 @@ static VALUE method_geometry_is_valid(VALUE self)
1022
1065
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
1023
1066
  self_geom = self_data->geom;
1024
1067
  if (self_geom) {
1025
- val = GEOSisValid_r(self_data->geos_context, self_geom);
1068
+ val = GEOSisValid(self_geom);
1026
1069
  if (val == 0) {
1027
1070
  result = Qfalse;
1028
- }
1029
- else if (val == 1) {
1071
+ } else if (val == 1) {
1030
1072
  result = Qtrue;
1031
1073
  }
1032
1074
  }
1033
1075
  return result;
1034
1076
  }
1035
1077
 
1036
- static VALUE method_geometry_invalid_reason(VALUE self)
1078
+ static VALUE
1079
+ method_geometry_invalid_reason(VALUE self)
1037
1080
  {
1038
1081
  VALUE result;
1039
1082
  RGeo_GeometryData* self_data;
@@ -1044,91 +1087,254 @@ static VALUE method_geometry_invalid_reason(VALUE self)
1044
1087
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
1045
1088
  self_geom = self_data->geom;
1046
1089
  if (self_geom) {
1047
- str = GEOSisValidReason_r(self_data->geos_context, self_geom);
1048
- // Per documentation, a valid geometry should give an empty string.
1049
- // However it seems not to be the case. Hence the comparison against
1050
- // the string that is really given: `"Valid Geometry"`.
1051
- // See https://github.com/libgeos/geos/issues/431.
1052
- if (str) result = (str[0] == '\0' || !strcmp(str, "Valid Geometry")) ? Qnil : rb_str_new2(str);
1053
- else result = rb_str_new2("Exception");
1054
- GEOSFree_r(self_data->geos_context, str);
1090
+ // We use NULL there to tell GEOS that we don't care about the position.
1091
+ switch (GEOSisValidDetail(self_geom, 0, &str, NULL)) {
1092
+ case 0: // invalid
1093
+ result = rb_utf8_str_new_cstr(str);
1094
+ case 1: // valid
1095
+ break;
1096
+ case 2: // exception
1097
+ default:
1098
+ result = rb_utf8_str_new_cstr("Exception");
1099
+ break;
1100
+ };
1101
+ if (str)
1102
+ GEOSFree(str);
1055
1103
  }
1056
1104
  return result;
1057
1105
  }
1058
1106
 
1059
- static VALUE method_geometry_point_on_surface(VALUE self)
1107
+ static VALUE
1108
+ method_geometry_invalid_reason_location(VALUE self)
1060
1109
  {
1061
1110
  VALUE result;
1062
1111
  RGeo_GeometryData* self_data;
1063
1112
  const GEOSGeometry* self_geom;
1113
+ GEOSGeometry* location = NULL;
1064
1114
 
1065
1115
  result = Qnil;
1066
1116
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
1067
1117
  self_geom = self_data->geom;
1068
1118
  if (self_geom) {
1069
- result = rgeo_wrap_geos_geometry(self_data->factory, GEOSPointOnSurface_r(self_data->geos_context, self_geom), Qnil);
1119
+ // We use NULL there to tell GEOS that we don't care about the reason.
1120
+ switch (GEOSisValidDetail(self_geom, 0, NULL, &location)) {
1121
+ case 0: // invalid
1122
+ result = rgeo_wrap_geos_geometry(self_data->factory, location, Qnil);
1123
+ case 1: // valid
1124
+ break;
1125
+ case 2: // exception
1126
+ break;
1127
+ default:
1128
+ break;
1129
+ };
1070
1130
  }
1071
1131
  return result;
1072
1132
  }
1073
1133
 
1134
+ static VALUE
1135
+ method_geometry_make_valid(VALUE self)
1136
+ {
1137
+ RGeo_GeometryData* self_data;
1138
+ const GEOSGeometry* self_geom;
1139
+ GEOSGeometry* valid_geom;
1140
+ self_data = RGEO_GEOMETRY_DATA_PTR(self);
1141
+ self_geom = self_data->geom;
1142
+ if (!self_geom)
1143
+ return Qnil;
1144
+
1145
+ // According to GEOS implementation, MakeValid always returns.
1146
+ valid_geom = GEOSMakeValid(self_geom);
1147
+ if (!valid_geom) {
1148
+ rb_raise(rb_eRGeoInvalidGeometry,
1149
+ "%" PRIsVALUE,
1150
+ method_geometry_invalid_reason(self));
1151
+ }
1152
+ return rgeo_wrap_geos_geometry(self_data->factory, valid_geom, Qnil);
1153
+ }
1074
1154
 
1075
- /**** INITIALIZATION FUNCTION ****/
1155
+ static VALUE
1156
+ method_geometry_point_on_surface(VALUE self)
1157
+ {
1158
+ VALUE result;
1159
+ RGeo_GeometryData* self_data;
1160
+ const GEOSGeometry* self_geom;
1076
1161
 
1162
+ result = Qnil;
1163
+ self_data = RGEO_GEOMETRY_DATA_PTR(self);
1164
+ self_geom = self_data->geom;
1165
+ if (self_geom) {
1166
+ result = rgeo_wrap_geos_geometry(
1167
+ self_data->factory, GEOSPointOnSurface(self_geom), Qnil);
1168
+ }
1169
+ return result;
1170
+ }
1171
+
1172
+ /**
1173
+ * call-seq:
1174
+ * some.polygonize -> RGeo::Feature::GeometryCollection
1175
+ *
1176
+ * Polygonizes a set of Geometries which contain linework that
1177
+ * represents the edges of a planar graph.
1178
+ *
1179
+ * All types of Geometry are accepted as input;
1180
+ * the constituent linework is extracted as the edges to be polygonized.
1181
+ *
1182
+ * The edges must be correctly noded;
1183
+ * that is, they must only meet at their endpoints and not overlap anywhere.
1184
+ *
1185
+ * @see
1186
+ * https://libgeos.org/doxygen/geos__c_8h.html#a9d98e448d3b846d591c726d1c0000d25
1187
+ * GEOSPolygonize
1188
+ */
1189
+ static VALUE
1190
+ method_geometry_polygonize(VALUE self)
1191
+ {
1192
+ VALUE result;
1193
+ RGeo_GeometryData* self_data;
1194
+ const GEOSGeometry* self_geom;
1195
+ GEOSGeometry* geos_polygon_collection;
1196
+
1197
+ result = Qnil;
1198
+ self_data = RGEO_GEOMETRY_DATA_PTR(self);
1199
+ self_geom = self_data->geom;
1200
+ if (self_geom) {
1201
+ geos_polygon_collection = GEOSPolygonize(&self_geom, 1);
1202
+
1203
+ if (geos_polygon_collection == NULL) {
1204
+ rb_raise(rb_eGeosError, "GEOS can't polygonize this geometry.");
1205
+ }
1077
1206
 
1078
- void rgeo_init_geos_geometry(RGeo_Globals* globals)
1207
+ result = rgeo_wrap_geos_geometry(
1208
+ self_data->factory, geos_polygon_collection, Qnil);
1209
+ }
1210
+ return result;
1211
+ }
1212
+
1213
+ VALUE
1214
+ rgeo_geos_geometries_strict_eql(const GEOSGeometry* geom1,
1215
+ const GEOSGeometry* geom2)
1216
+ {
1217
+ switch (GEOSEqualsExact(geom1, geom2, 0.0)) {
1218
+ case 0:
1219
+ return Qfalse;
1220
+ case 1:
1221
+ return Qtrue;
1222
+ case 2:
1223
+ default:
1224
+ rb_raise(rb_eGeosError, "Cannot test equality.");
1225
+ }
1226
+ }
1227
+
1228
+ /**** INITIALIZATION FUNCTION ****/
1229
+
1230
+ void
1231
+ rgeo_init_geos_geometry()
1079
1232
  {
1080
1233
  VALUE geos_geometry_methods;
1081
1234
 
1082
- geos_geometry_methods = rb_define_module_under(globals->geos_module, "CAPIGeometryMethods");
1235
+ geos_geometry_methods =
1236
+ rb_define_module_under(rgeo_geos_module, "CAPIGeometryMethods");
1083
1237
 
1084
- rb_define_method(geos_geometry_methods, "factory=", method_geometry_set_factory, 1);
1085
- rb_define_method(geos_geometry_methods, "initialize_copy", method_geometry_initialize_copy, 1);
1238
+ rb_define_method(
1239
+ geos_geometry_methods, "factory=", method_geometry_set_factory, 1);
1240
+ rb_define_method(geos_geometry_methods,
1241
+ "initialize_copy",
1242
+ method_geometry_initialize_copy,
1243
+ 1);
1086
1244
  rb_define_method(geos_geometry_methods, "_steal", method_geometry_steal, 1);
1087
- rb_define_method(geos_geometry_methods, "initialized?", method_geometry_initialized_p, 0);
1088
- rb_define_method(geos_geometry_methods, "factory", method_geometry_factory, 0);
1089
- rb_define_method(geos_geometry_methods, "prepared?", method_geometry_prepared_p, 0);
1090
- rb_define_method(geos_geometry_methods, "prepare!", method_geometry_prepare, 0);
1091
- rb_define_method(geos_geometry_methods, "dimension", method_geometry_dimension, 0);
1092
- rb_define_method(geos_geometry_methods, "geometry_type", method_geometry_geometry_type, 0);
1245
+ rb_define_method(
1246
+ geos_geometry_methods, "initialized?", method_geometry_initialized_p, 0);
1247
+ rb_define_method(
1248
+ geos_geometry_methods, "factory", method_geometry_factory, 0);
1249
+ rb_define_method(
1250
+ geos_geometry_methods, "prepared?", method_geometry_prepared_p, 0);
1251
+ rb_define_method(
1252
+ geos_geometry_methods, "prepare!", method_geometry_prepare, 0);
1253
+ rb_define_method(
1254
+ geos_geometry_methods, "dimension", method_geometry_dimension, 0);
1255
+ rb_define_method(
1256
+ geos_geometry_methods, "geometry_type", method_geometry_geometry_type, 0);
1093
1257
  rb_define_method(geos_geometry_methods, "srid", method_geometry_srid, 0);
1094
- rb_define_method(geos_geometry_methods, "envelope", method_geometry_envelope, 0);
1095
- rb_define_method(geos_geometry_methods, "boundary", method_geometry_boundary, 0);
1096
- rb_define_method(geos_geometry_methods, "_as_text", method_geometry_as_text, 0);
1097
- rb_define_method(geos_geometry_methods, "as_binary", method_geometry_as_binary, 0);
1098
- rb_define_method(geos_geometry_methods, "empty?", method_geometry_is_empty, 0);
1099
- rb_define_method(geos_geometry_methods, "simple?", method_geometry_is_simple, 0);
1258
+ rb_define_method(
1259
+ geos_geometry_methods, "envelope", method_geometry_envelope, 0);
1260
+ rb_define_method(
1261
+ geos_geometry_methods, "boundary", method_geometry_boundary, 0);
1262
+ rb_define_method(
1263
+ geos_geometry_methods, "_as_text", method_geometry_as_text, 0);
1264
+ rb_define_method(
1265
+ geos_geometry_methods, "as_binary", method_geometry_as_binary, 0);
1266
+ rb_define_method(
1267
+ geos_geometry_methods, "empty?", method_geometry_is_empty, 0);
1268
+ rb_define_method(
1269
+ geos_geometry_methods, "simple?", method_geometry_is_simple, 0);
1100
1270
  rb_define_method(geos_geometry_methods, "equals?", method_geometry_equals, 1);
1101
1271
  rb_define_method(geos_geometry_methods, "==", method_geometry_equals, 1);
1102
- rb_define_method(geos_geometry_methods, "rep_equals?", method_geometry_eql, 1);
1272
+ rb_define_method(
1273
+ geos_geometry_methods, "rep_equals?", method_geometry_eql, 1);
1103
1274
  rb_define_method(geos_geometry_methods, "eql?", method_geometry_eql, 1);
1104
- rb_define_method(geos_geometry_methods, "disjoint?", method_geometry_disjoint, 1);
1105
- rb_define_method(geos_geometry_methods, "intersects?", method_geometry_intersects, 1);
1106
- rb_define_method(geos_geometry_methods, "touches?", method_geometry_touches, 1);
1107
- rb_define_method(geos_geometry_methods, "crosses?", method_geometry_crosses, 1);
1275
+ rb_define_method(
1276
+ geos_geometry_methods, "disjoint?", method_geometry_disjoint, 1);
1277
+ rb_define_method(
1278
+ geos_geometry_methods, "intersects?", method_geometry_intersects, 1);
1279
+ rb_define_method(
1280
+ geos_geometry_methods, "touches?", method_geometry_touches, 1);
1281
+ rb_define_method(
1282
+ geos_geometry_methods, "crosses?", method_geometry_crosses, 1);
1108
1283
  rb_define_method(geos_geometry_methods, "within?", method_geometry_within, 1);
1109
- rb_define_method(geos_geometry_methods, "contains?", method_geometry_contains, 1);
1110
- rb_define_method(geos_geometry_methods, "overlaps?", method_geometry_overlaps, 1);
1284
+ rb_define_method(
1285
+ geos_geometry_methods, "contains?", method_geometry_contains, 1);
1286
+ rb_define_method(
1287
+ geos_geometry_methods, "overlaps?", method_geometry_overlaps, 1);
1111
1288
  rb_define_method(geos_geometry_methods, "relate?", method_geometry_relate, 2);
1112
- rb_define_method(geos_geometry_methods, "distance", method_geometry_distance, 1);
1289
+ rb_define_method(
1290
+ geos_geometry_methods, "distance", method_geometry_distance, 1);
1113
1291
  rb_define_method(geos_geometry_methods, "buffer", method_geometry_buffer, 1);
1114
- rb_define_method(geos_geometry_methods, "buffer_with_style", method_geometry_buffer_with_style, 4);
1115
- rb_define_method(geos_geometry_methods, "simplify", method_geometry_simplify, 1);
1116
- rb_define_method(geos_geometry_methods, "simplify_preserve_topology", method_geometry_simplify_preserve_topology, 1);
1117
- rb_define_method(geos_geometry_methods, "convex_hull", method_geometry_convex_hull, 0);
1118
- rb_define_method(geos_geometry_methods, "intersection", method_geometry_intersection, 1);
1292
+ rb_define_method(geos_geometry_methods,
1293
+ "buffer_with_style",
1294
+ method_geometry_buffer_with_style,
1295
+ 4);
1296
+ rb_define_method(
1297
+ geos_geometry_methods, "simplify", method_geometry_simplify, 1);
1298
+ rb_define_method(geos_geometry_methods,
1299
+ "simplify_preserve_topology",
1300
+ method_geometry_simplify_preserve_topology,
1301
+ 1);
1302
+ rb_define_method(
1303
+ geos_geometry_methods, "convex_hull", method_geometry_convex_hull, 0);
1304
+ rb_define_method(
1305
+ geos_geometry_methods, "intersection", method_geometry_intersection, 1);
1119
1306
  rb_define_method(geos_geometry_methods, "*", method_geometry_intersection, 1);
1120
1307
  rb_define_method(geos_geometry_methods, "union", method_geometry_union, 1);
1121
- rb_define_method(geos_geometry_methods, "unary_union", method_geometry_unary_union, 0);
1308
+ rb_define_method(
1309
+ geos_geometry_methods, "unary_union", method_geometry_unary_union, 0);
1122
1310
  rb_define_method(geos_geometry_methods, "+", method_geometry_union, 1);
1123
- rb_define_method(geos_geometry_methods, "difference", method_geometry_difference, 1);
1311
+ rb_define_method(
1312
+ geos_geometry_methods, "difference", method_geometry_difference, 1);
1124
1313
  rb_define_method(geos_geometry_methods, "-", method_geometry_difference, 1);
1125
- rb_define_method(geos_geometry_methods, "sym_difference", method_geometry_sym_difference, 1);
1126
- rb_define_method(geos_geometry_methods, "valid?", method_geometry_is_valid, 0);
1127
- rb_define_method(geos_geometry_methods, "invalid_reason", method_geometry_invalid_reason, 0);
1128
- rb_define_method(geos_geometry_methods, "point_on_surface", method_geometry_point_on_surface, 0);
1314
+ rb_define_method(
1315
+ geos_geometry_methods, "sym_difference", method_geometry_sym_difference, 1);
1316
+ rb_define_method(
1317
+ geos_geometry_methods, "valid?", method_geometry_is_valid, 0);
1318
+ rb_define_method(
1319
+ geos_geometry_methods, "invalid_reason", method_geometry_invalid_reason, 0);
1320
+ rb_define_method(geos_geometry_methods,
1321
+ "invalid_reason_location",
1322
+ method_geometry_invalid_reason_location,
1323
+ 0);
1324
+ rb_define_method(geos_geometry_methods,
1325
+ "point_on_surface",
1326
+ method_geometry_point_on_surface,
1327
+ 0);
1328
+ rb_define_method(
1329
+ geos_geometry_methods, "make_valid", method_geometry_make_valid, 0);
1330
+ rb_define_method(
1331
+ geos_geometry_methods, "polygonize", method_geometry_polygonize, 0);
1332
+ #ifdef RGEO_GEOS_SUPPORTS_DENSIFY
1333
+ rb_define_method(
1334
+ geos_geometry_methods, "segmentize", method_geometry_segmentize, 1);
1335
+ #endif
1129
1336
  }
1130
1337
 
1131
-
1132
1338
  RGEO_END_C
1133
1339
 
1134
1340
  #endif