rgeo 2.4.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -0
  3. data/README.md +23 -14
  4. data/ext/geos_c_impl/analysis.c +29 -26
  5. data/ext/geos_c_impl/analysis.h +8 -5
  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 +43 -29
  11. data/ext/geos_c_impl/factory.c +443 -351
  12. data/ext/geos_c_impl/factory.h +98 -55
  13. data/ext/geos_c_impl/geometry.c +589 -383
  14. data/ext/geos_c_impl/geometry.h +10 -3
  15. data/ext/geos_c_impl/geometry_collection.c +288 -316
  16. data/ext/geos_c_impl/geometry_collection.h +6 -18
  17. data/ext/geos_c_impl/globals.c +98 -21
  18. data/ext/geos_c_impl/globals.h +3 -2
  19. data/ext/geos_c_impl/line_string.c +263 -222
  20. data/ext/geos_c_impl/line_string.h +5 -6
  21. data/ext/geos_c_impl/main.c +8 -9
  22. data/ext/geos_c_impl/point.c +63 -65
  23. data/ext/geos_c_impl/point.h +4 -5
  24. data/ext/geos_c_impl/polygon.c +168 -131
  25. data/ext/geos_c_impl/polygon.h +11 -9
  26. data/ext/geos_c_impl/preface.h +15 -11
  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 +59 -104
  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 +305 -101
  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 +71 -87
  58. data/lib/rgeo/geographic/factory.rb +100 -127
  59. data/lib/rgeo/geographic/interface.rb +71 -168
  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 +107 -175
  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 +55 -97
  77. data/lib/rgeo/geos/zm_feature_methods.rb +30 -33
  78. data/lib/rgeo/geos.rb +15 -9
  79. data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +11 -24
  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 +63 -16
  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,27 @@
2
2
  Line string methods for GEOS wrapper
3
3
  */
4
4
 
5
-
6
5
  #ifndef RGEO_GEOS_LINE_STRING_INCLUDED
7
6
  #define RGEO_GEOS_LINE_STRING_INCLUDED
8
7
 
9
- #include <ruby.h>
10
8
  #include <geos_c.h>
9
+ #include <ruby.h>
11
10
 
12
11
  RGEO_BEGIN_C
13
12
 
14
-
15
13
  /*
16
14
  Initializes the line string module. This should be called after
17
15
  the geometry module is initialized.
18
16
  */
19
- void rgeo_init_geos_line_string();
17
+ void
18
+ rgeo_init_geos_line_string();
20
19
 
21
20
  /*
22
21
  Determines whether the given GEOS line string is closed.
23
22
  Returns Qtrue if true, Qfalse if false, or Qnil on an error.
24
23
  */
25
- VALUE rgeo_is_geos_line_string_closed(GEOSContextHandle_t context, const GEOSGeometry* geom);
26
-
24
+ VALUE
25
+ rgeo_is_geos_line_string_closed(const GEOSGeometry* geom);
27
26
 
28
27
  RGEO_END_C
29
28
 
@@ -6,26 +6,26 @@
6
6
 
7
7
  #ifdef RGEO_GEOS_SUPPORTED
8
8
 
9
- #include <ruby.h>
10
9
  #include <geos_c.h>
10
+ #include <ruby.h>
11
11
 
12
- #include "globals.h"
13
-
12
+ #include "analysis.h"
14
13
  #include "errors.h"
15
-
16
14
  #include "factory.h"
17
15
  #include "geometry.h"
18
- #include "point.h"
16
+ #include "geometry_collection.h"
17
+ #include "globals.h"
19
18
  #include "line_string.h"
19
+ #include "point.h"
20
20
  #include "polygon.h"
21
- #include "geometry_collection.h"
22
- #include "analysis.h"
21
+ #include "ruby_more.h"
23
22
 
24
23
  #endif
25
24
 
26
25
  RGEO_BEGIN_C
27
26
 
28
- void Init_geos_c_impl()
27
+ void
28
+ Init_geos_c_impl()
29
29
  {
30
30
  #ifdef RGEO_GEOS_SUPPORTED
31
31
  rgeo_init_geos_globals();
@@ -40,5 +40,4 @@ void Init_geos_c_impl()
40
40
  #endif
41
41
  }
42
42
 
43
-
44
43
  RGEO_END_C
@@ -6,21 +6,19 @@
6
6
 
7
7
  #ifdef RGEO_GEOS_SUPPORTED
8
8
 
9
- #include <ruby.h>
10
9
  #include <geos_c.h>
10
+ #include <ruby.h>
11
11
 
12
- #include "globals.h"
13
-
12
+ #include "coordinates.h"
14
13
  #include "factory.h"
15
14
  #include "geometry.h"
15
+ #include "globals.h"
16
16
  #include "point.h"
17
17
 
18
- #include "coordinates.h"
19
-
20
18
  RGEO_BEGIN_C
21
19
 
22
-
23
- static VALUE method_point_geometry_type(VALUE self)
20
+ static VALUE
21
+ method_point_geometry_type(VALUE self)
24
22
  {
25
23
  VALUE result;
26
24
  RGeo_GeometryData* self_data;
@@ -33,13 +31,12 @@ static VALUE method_point_geometry_type(VALUE self)
33
31
  return result;
34
32
  }
35
33
 
36
-
37
- static VALUE method_point_coordinates(VALUE self)
34
+ static VALUE
35
+ method_point_coordinates(VALUE self)
38
36
  {
39
37
  VALUE result = Qnil;
40
38
  RGeo_GeometryData* self_data;
41
39
  const GEOSGeometry* self_geom;
42
- GEOSContextHandle_t context;
43
40
  const GEOSCoordSequence* coord_sequence;
44
41
  int zCoordinate;
45
42
 
@@ -47,23 +44,23 @@ static VALUE method_point_coordinates(VALUE self)
47
44
  self_geom = self_data->geom;
48
45
 
49
46
  if (self_geom) {
50
- zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
51
- context = self_data->geos_context;
52
- coord_sequence = GEOSGeom_getCoordSeq_r(context, self_geom);
53
- if(coord_sequence) {
54
- result = rb_ary_pop(extract_points_from_coordinate_sequence(context, coord_sequence, zCoordinate));
47
+ zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags &
48
+ RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
49
+ coord_sequence = GEOSGeom_getCoordSeq(self_geom);
50
+ if (coord_sequence) {
51
+ result = rb_ary_pop(
52
+ extract_points_from_coordinate_sequence(coord_sequence, zCoordinate));
55
53
  }
56
54
  }
57
55
  return result;
58
56
  }
59
57
 
60
-
61
- static VALUE method_point_x(VALUE self)
58
+ static VALUE
59
+ method_point_x(VALUE self)
62
60
  {
63
61
  VALUE result;
64
62
  RGeo_GeometryData* self_data;
65
63
  const GEOSGeometry* self_geom;
66
- GEOSContextHandle_t self_context;
67
64
  const GEOSCoordSequence* coord_seq;
68
65
  double val;
69
66
 
@@ -71,10 +68,9 @@ static VALUE method_point_x(VALUE self)
71
68
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
72
69
  self_geom = self_data->geom;
73
70
  if (self_geom) {
74
- self_context = self_data->geos_context;
75
- coord_seq = GEOSGeom_getCoordSeq_r(self_context, self_geom);
71
+ coord_seq = GEOSGeom_getCoordSeq(self_geom);
76
72
  if (coord_seq) {
77
- if (GEOSCoordSeq_getX_r(self_context, coord_seq, 0, &val)) {
73
+ if (GEOSCoordSeq_getX(coord_seq, 0, &val)) {
78
74
  result = rb_float_new(val);
79
75
  }
80
76
  }
@@ -82,13 +78,12 @@ static VALUE method_point_x(VALUE self)
82
78
  return result;
83
79
  }
84
80
 
85
-
86
- static VALUE method_point_y(VALUE self)
81
+ static VALUE
82
+ method_point_y(VALUE self)
87
83
  {
88
84
  VALUE result;
89
85
  RGeo_GeometryData* self_data;
90
86
  const GEOSGeometry* self_geom;
91
- GEOSContextHandle_t self_context;
92
87
  const GEOSCoordSequence* coord_seq;
93
88
  double val;
94
89
 
@@ -96,10 +91,9 @@ static VALUE method_point_y(VALUE self)
96
91
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
97
92
  self_geom = self_data->geom;
98
93
  if (self_geom) {
99
- self_context = self_data->geos_context;
100
- coord_seq = GEOSGeom_getCoordSeq_r(self_context, self_geom);
94
+ coord_seq = GEOSGeom_getCoordSeq(self_geom);
101
95
  if (coord_seq) {
102
- if (GEOSCoordSeq_getY_r(self_context, coord_seq, 0, &val)) {
96
+ if (GEOSCoordSeq_getY(coord_seq, 0, &val)) {
103
97
  result = rb_float_new(val);
104
98
  }
105
99
  }
@@ -107,13 +101,12 @@ static VALUE method_point_y(VALUE self)
107
101
  return result;
108
102
  }
109
103
 
110
-
111
- static VALUE get_3d_point(VALUE self, int flag)
104
+ static VALUE
105
+ get_3d_point(VALUE self, int flag)
112
106
  {
113
107
  VALUE result;
114
108
  RGeo_GeometryData* self_data;
115
109
  const GEOSGeometry* self_geom;
116
- GEOSContextHandle_t self_context;
117
110
  const GEOSCoordSequence* coord_seq;
118
111
  double val;
119
112
 
@@ -122,10 +115,9 @@ static VALUE get_3d_point(VALUE self, int flag)
122
115
  self_geom = self_data->geom;
123
116
  if (self_geom) {
124
117
  if (RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & flag) {
125
- self_context = self_data->geos_context;
126
- coord_seq = GEOSGeom_getCoordSeq_r(self_context, self_geom);
118
+ coord_seq = GEOSGeom_getCoordSeq(self_geom);
127
119
  if (coord_seq) {
128
- if (GEOSCoordSeq_getZ_r(self_context, coord_seq, 0, &val)) {
120
+ if (GEOSCoordSeq_getZ(coord_seq, 0, &val)) {
129
121
  result = rb_float_new(val);
130
122
  }
131
123
  }
@@ -134,20 +126,20 @@ static VALUE get_3d_point(VALUE self, int flag)
134
126
  return result;
135
127
  }
136
128
 
137
-
138
- static VALUE method_point_z(VALUE self)
129
+ static VALUE
130
+ method_point_z(VALUE self)
139
131
  {
140
132
  return get_3d_point(self, RGEO_FACTORYFLAGS_SUPPORTS_Z);
141
133
  }
142
134
 
143
-
144
- static VALUE method_point_m(VALUE self)
135
+ static VALUE
136
+ method_point_m(VALUE self)
145
137
  {
146
138
  return get_3d_point(self, RGEO_FACTORYFLAGS_SUPPORTS_M);
147
139
  }
148
140
 
149
-
150
- static VALUE method_point_eql(VALUE self, VALUE rhs)
141
+ static VALUE
142
+ method_point_eql(VALUE self, VALUE rhs)
151
143
  {
152
144
  VALUE result;
153
145
  RGeo_GeometryData* self_data;
@@ -155,13 +147,14 @@ static VALUE method_point_eql(VALUE self, VALUE rhs)
155
147
  result = rgeo_geos_klasses_and_factories_eql(self, rhs);
156
148
  if (RTEST(result)) {
157
149
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
158
- result = rgeo_geos_coordseqs_eql(self_data->geos_context, self_data->geom, RGEO_GEOMETRY_DATA_PTR(rhs)->geom, RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M);
150
+ result = rgeo_geos_geometries_strict_eql(self_data->geom,
151
+ RGEO_GEOMETRY_DATA_PTR(rhs)->geom);
159
152
  }
160
153
  return result;
161
154
  }
162
155
 
163
-
164
- static VALUE method_point_hash(VALUE self)
156
+ static VALUE
157
+ method_point_hash(VALUE self)
165
158
  {
166
159
  st_index_t hash;
167
160
  RGeo_GeometryData* self_data;
@@ -171,19 +164,24 @@ static VALUE method_point_hash(VALUE self)
171
164
  factory = self_data->factory;
172
165
  hash = rb_hash_start(0);
173
166
  hash = rgeo_geos_objbase_hash(factory, rgeo_feature_point_module, hash);
174
- hash = rgeo_geos_coordseq_hash(self_data->geos_context, self_data->geom, hash);
167
+ hash = rgeo_geos_coordseq_hash(self_data->geom, hash);
175
168
  return LONG2FIX(rb_hash_end(hash));
176
169
  }
177
170
 
178
-
179
- static VALUE cmethod_create(VALUE module, VALUE factory, VALUE x, VALUE y, VALUE z)
171
+ static VALUE
172
+ cmethod_create(VALUE module, VALUE factory, VALUE x, VALUE y, VALUE z)
180
173
  {
181
- return rgeo_create_geos_point(factory, rb_num2dbl(x), rb_num2dbl(y),
182
- RGEO_FACTORY_DATA_PTR(factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M ? rb_num2dbl(z) : 0);
174
+ return rgeo_create_geos_point(factory,
175
+ rb_num2dbl(x),
176
+ rb_num2dbl(y),
177
+ RGEO_FACTORY_DATA_PTR(factory)->flags &
178
+ RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M
179
+ ? rb_num2dbl(z)
180
+ : 0);
183
181
  }
184
182
 
185
-
186
- void rgeo_init_geos_point()
183
+ void
184
+ rgeo_init_geos_point()
187
185
  {
188
186
  VALUE geos_point_methods;
189
187
 
@@ -191,38 +189,39 @@ void rgeo_init_geos_point()
191
189
  rb_define_module_function(rgeo_geos_point_class, "create", cmethod_create, 4);
192
190
 
193
191
  // CAPIPointMethods module
194
- geos_point_methods = rb_define_module_under(rgeo_geos_module, "CAPIPointMethods");
192
+ geos_point_methods =
193
+ rb_define_module_under(rgeo_geos_module, "CAPIPointMethods");
195
194
  rb_define_method(geos_point_methods, "rep_equals?", method_point_eql, 1);
196
195
  rb_define_method(geos_point_methods, "eql?", method_point_eql, 1);
197
196
  rb_define_method(geos_point_methods, "hash", method_point_hash, 0);
198
- rb_define_method(geos_point_methods, "geometry_type", method_point_geometry_type, 0);
197
+ rb_define_method(
198
+ geos_point_methods, "geometry_type", method_point_geometry_type, 0);
199
199
  rb_define_method(geos_point_methods, "x", method_point_x, 0);
200
200
  rb_define_method(geos_point_methods, "y", method_point_y, 0);
201
201
  rb_define_method(geos_point_methods, "z", method_point_z, 0);
202
202
  rb_define_method(geos_point_methods, "m", method_point_m, 0);
203
- rb_define_method(geos_point_methods, "coordinates", method_point_coordinates, 0);
203
+ rb_define_method(
204
+ geos_point_methods, "coordinates", method_point_coordinates, 0);
204
205
  }
205
206
 
206
-
207
- VALUE rgeo_create_geos_point(VALUE factory, double x, double y, double z)
207
+ VALUE
208
+ rgeo_create_geos_point(VALUE factory, double x, double y, double z)
208
209
  {
209
210
  VALUE result;
210
- RGeo_FactoryData* factory_data;
211
- GEOSContextHandle_t context;
212
211
  GEOSCoordSequence* coord_seq;
213
212
  GEOSGeometry* geom;
214
213
 
215
214
  result = Qnil;
216
- factory_data = RGEO_FACTORY_DATA_PTR(factory);
217
- context = factory_data->geos_context;
218
- coord_seq = GEOSCoordSeq_create_r(context, 1, 3);
215
+ coord_seq = GEOSCoordSeq_create(
216
+ 1, 3); // Never cleaned if failure setting one of the coord
219
217
  if (coord_seq) {
220
- if (GEOSCoordSeq_setX_r(context, coord_seq, 0, x)) {
221
- if (GEOSCoordSeq_setY_r(context, coord_seq, 0, y)) {
222
- if (GEOSCoordSeq_setZ_r(context, coord_seq, 0, z)) {
223
- geom = GEOSGeom_createPoint_r(context, coord_seq);
218
+ if (GEOSCoordSeq_setX(coord_seq, 0, x)) {
219
+ if (GEOSCoordSeq_setY(coord_seq, 0, y)) {
220
+ if (GEOSCoordSeq_setZ(coord_seq, 0, z)) {
221
+ geom = GEOSGeom_createPoint(coord_seq);
224
222
  if (geom) {
225
- result = rgeo_wrap_geos_geometry(factory, geom, rgeo_geos_point_class);
223
+ result =
224
+ rgeo_wrap_geos_geometry(factory, geom, rgeo_geos_point_class);
226
225
  }
227
226
  }
228
227
  }
@@ -231,7 +230,6 @@ VALUE rgeo_create_geos_point(VALUE factory, double x, double y, double z)
231
230
  return result;
232
231
  }
233
232
 
234
-
235
233
  RGEO_END_C
236
234
 
237
235
  #endif
@@ -2,7 +2,6 @@
2
2
  Point methods for GEOS wrapper
3
3
  */
4
4
 
5
-
6
5
  #ifndef RGEO_GEOS_POINT_INCLUDED
7
6
  #define RGEO_GEOS_POINT_INCLUDED
8
7
 
@@ -10,18 +9,18 @@
10
9
 
11
10
  RGEO_BEGIN_C
12
11
 
13
-
14
12
  /*
15
13
  Initializes the point module. This should be called after
16
14
  the geometry module is initialized.
17
15
  */
18
- void rgeo_init_geos_point();
16
+ void
17
+ rgeo_init_geos_point();
19
18
 
20
19
  /*
21
20
  Creates a 3d point and returns the ruby object.
22
21
  */
23
- VALUE rgeo_create_geos_point(VALUE factory, double x, double y, double z);
24
-
22
+ VALUE
23
+ rgeo_create_geos_point(VALUE factory, double x, double y, double z);
25
24
 
26
25
  RGEO_END_C
27
26