rgeo 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +8 -0
- data/Version +1 -1
- data/ext/geos_c_impl/extconf.rb +2 -2
- data/ext/geos_c_impl/factory.c +93 -42
- data/ext/geos_c_impl/geometry.c +327 -146
- data/ext/geos_c_impl/geometry_collection.c +157 -75
- data/ext/geos_c_impl/line_string.c +200 -93
- data/ext/geos_c_impl/main.c +3 -1
- data/ext/geos_c_impl/point.c +60 -28
- data/ext/geos_c_impl/polygon.c +108 -50
- data/ext/proj4_c_impl/extconf.rb +2 -2
- data/ext/proj4_c_impl/main.c +68 -30
- data/lib/rgeo/cartesian/bounding_box.rb +1 -1
- data/lib/rgeo/feature/factory.rb +7 -6
- data/lib/rgeo/feature/geometry.rb +4 -3
- data/lib/rgeo/geographic/projected_feature_methods.rb +1 -1
- data/lib/rgeo/geos/interface.rb +1 -1
- data/lib/rgeo/wkrep/wkt_parser.rb +7 -1
- data/test/wkrep/tc_wkt_parser.rb +13 -0
- metadata +3 -3
data/ext/geos_c_impl/main.c
CHANGED
@@ -57,7 +57,9 @@ RGEO_BEGIN_C
|
|
57
57
|
void Init_geos_c_impl()
|
58
58
|
{
|
59
59
|
#ifdef RGEO_GEOS_SUPPORTED
|
60
|
-
RGeo_Globals* globals
|
60
|
+
RGeo_Globals* globals;
|
61
|
+
|
62
|
+
globals = rgeo_init_geos_factory();
|
61
63
|
rgeo_init_geos_geometry(globals);
|
62
64
|
rgeo_init_geos_point(globals);
|
63
65
|
rgeo_init_geos_line_string(globals);
|
data/ext/geos_c_impl/point.c
CHANGED
@@ -51,8 +51,11 @@ RGEO_BEGIN_C
|
|
51
51
|
|
52
52
|
static VALUE method_point_geometry_type(VALUE self)
|
53
53
|
{
|
54
|
-
VALUE result
|
55
|
-
RGeo_GeometryData* self_data
|
54
|
+
VALUE result;
|
55
|
+
RGeo_GeometryData* self_data;
|
56
|
+
|
57
|
+
result = Qnil;
|
58
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
56
59
|
if (self_data->geom) {
|
57
60
|
result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_point;
|
58
61
|
}
|
@@ -62,14 +65,20 @@ static VALUE method_point_geometry_type(VALUE self)
|
|
62
65
|
|
63
66
|
static VALUE method_point_x(VALUE self)
|
64
67
|
{
|
65
|
-
VALUE result
|
66
|
-
RGeo_GeometryData* self_data
|
67
|
-
const GEOSGeometry* self_geom
|
68
|
+
VALUE result;
|
69
|
+
RGeo_GeometryData* self_data;
|
70
|
+
const GEOSGeometry* self_geom;
|
71
|
+
GEOSContextHandle_t self_context;
|
72
|
+
const GEOSCoordSequence* coord_seq;
|
73
|
+
double val;
|
74
|
+
|
75
|
+
result = Qnil;
|
76
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
77
|
+
self_geom = self_data->geom;
|
68
78
|
if (self_geom) {
|
69
|
-
|
70
|
-
|
79
|
+
self_context = self_data->geos_context;
|
80
|
+
coord_seq = GEOSGeom_getCoordSeq_r(self_context, self_geom);
|
71
81
|
if (coord_seq) {
|
72
|
-
double val;
|
73
82
|
if (GEOSCoordSeq_getX_r(self_context, coord_seq, 0, &val)) {
|
74
83
|
result = rb_float_new(val);
|
75
84
|
}
|
@@ -81,14 +90,20 @@ static VALUE method_point_x(VALUE self)
|
|
81
90
|
|
82
91
|
static VALUE method_point_y(VALUE self)
|
83
92
|
{
|
84
|
-
VALUE result
|
85
|
-
RGeo_GeometryData* self_data
|
86
|
-
const GEOSGeometry* self_geom
|
93
|
+
VALUE result;
|
94
|
+
RGeo_GeometryData* self_data;
|
95
|
+
const GEOSGeometry* self_geom;
|
96
|
+
GEOSContextHandle_t self_context;
|
97
|
+
const GEOSCoordSequence* coord_seq;
|
98
|
+
double val;
|
99
|
+
|
100
|
+
result = Qnil;
|
101
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
102
|
+
self_geom = self_data->geom;
|
87
103
|
if (self_geom) {
|
88
|
-
|
89
|
-
|
104
|
+
self_context = self_data->geos_context;
|
105
|
+
coord_seq = GEOSGeom_getCoordSeq_r(self_context, self_geom);
|
90
106
|
if (coord_seq) {
|
91
|
-
double val;
|
92
107
|
if (GEOSCoordSeq_getY_r(self_context, coord_seq, 0, &val)) {
|
93
108
|
result = rb_float_new(val);
|
94
109
|
}
|
@@ -100,15 +115,21 @@ static VALUE method_point_y(VALUE self)
|
|
100
115
|
|
101
116
|
static VALUE get_3d_point(VALUE self, int flag)
|
102
117
|
{
|
103
|
-
VALUE result
|
104
|
-
RGeo_GeometryData* self_data
|
105
|
-
const GEOSGeometry* self_geom
|
118
|
+
VALUE result;
|
119
|
+
RGeo_GeometryData* self_data;
|
120
|
+
const GEOSGeometry* self_geom;
|
121
|
+
GEOSContextHandle_t self_context;
|
122
|
+
const GEOSCoordSequence* coord_seq;
|
123
|
+
double val;
|
124
|
+
|
125
|
+
result = Qnil;
|
126
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
127
|
+
self_geom = self_data->geom;
|
106
128
|
if (self_geom) {
|
107
129
|
if (RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & flag) {
|
108
|
-
|
109
|
-
|
130
|
+
self_context = self_data->geos_context;
|
131
|
+
coord_seq = GEOSGeom_getCoordSeq_r(self_context, self_geom);
|
110
132
|
if (coord_seq) {
|
111
|
-
double val;
|
112
133
|
if (GEOSCoordSeq_getZ_r(self_context, coord_seq, 0, &val)) {
|
113
134
|
result = rb_float_new(val);
|
114
135
|
}
|
@@ -133,9 +154,12 @@ static VALUE method_point_m(VALUE self)
|
|
133
154
|
|
134
155
|
static VALUE method_point_eql(VALUE self, VALUE rhs)
|
135
156
|
{
|
136
|
-
VALUE result
|
157
|
+
VALUE result;
|
158
|
+
RGeo_GeometryData* self_data;
|
159
|
+
|
160
|
+
result = rgeo_geos_klasses_and_factories_eql(self, rhs);
|
137
161
|
if (RTEST(result)) {
|
138
|
-
|
162
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
139
163
|
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);
|
140
164
|
}
|
141
165
|
return result;
|
@@ -151,7 +175,9 @@ static VALUE cmethod_create(VALUE module, VALUE factory, VALUE x, VALUE y, VALUE
|
|
151
175
|
|
152
176
|
void rgeo_init_geos_point(RGeo_Globals* globals)
|
153
177
|
{
|
154
|
-
VALUE geos_point_class
|
178
|
+
VALUE geos_point_class;
|
179
|
+
|
180
|
+
geos_point_class = rb_define_class_under(globals->geos_module, "PointImpl", globals->geos_geometry);
|
155
181
|
globals->geos_point = geos_point_class;
|
156
182
|
globals->feature_point = rb_const_get_at(globals->feature_module, rb_intern("Point"));
|
157
183
|
rb_funcall(globals->global_mixins, rb_intern("include_in_class"), 2,
|
@@ -170,15 +196,21 @@ void rgeo_init_geos_point(RGeo_Globals* globals)
|
|
170
196
|
|
171
197
|
VALUE rgeo_create_geos_point(VALUE factory, double x, double y, double z)
|
172
198
|
{
|
173
|
-
VALUE result
|
174
|
-
RGeo_FactoryData* factory_data
|
175
|
-
GEOSContextHandle_t context
|
176
|
-
GEOSCoordSequence* coord_seq
|
199
|
+
VALUE result;
|
200
|
+
RGeo_FactoryData* factory_data;
|
201
|
+
GEOSContextHandle_t context;
|
202
|
+
GEOSCoordSequence* coord_seq;
|
203
|
+
GEOSGeometry* geom;
|
204
|
+
|
205
|
+
result = Qnil;
|
206
|
+
factory_data = RGEO_FACTORY_DATA_PTR(factory);
|
207
|
+
context = factory_data->geos_context;
|
208
|
+
coord_seq = GEOSCoordSeq_create_r(context, 1, 3);
|
177
209
|
if (coord_seq) {
|
178
210
|
if (GEOSCoordSeq_setX_r(context, coord_seq, 0, x)) {
|
179
211
|
if (GEOSCoordSeq_setY_r(context, coord_seq, 0, y)) {
|
180
212
|
if (GEOSCoordSeq_setZ_r(context, coord_seq, 0, z)) {
|
181
|
-
|
213
|
+
geom = GEOSGeom_createPoint_r(context, coord_seq);
|
182
214
|
if (geom) {
|
183
215
|
result = rgeo_wrap_geos_geometry(factory, geom, factory_data->globals->geos_point);
|
184
216
|
}
|
data/ext/geos_c_impl/polygon.c
CHANGED
@@ -52,9 +52,12 @@ RGEO_BEGIN_C
|
|
52
52
|
|
53
53
|
static VALUE method_polygon_eql(VALUE self, VALUE rhs)
|
54
54
|
{
|
55
|
-
VALUE result
|
55
|
+
VALUE result;
|
56
|
+
RGeo_GeometryData* self_data;
|
57
|
+
|
58
|
+
result = rgeo_geos_klasses_and_factories_eql(self, rhs);
|
56
59
|
if (RTEST(result)) {
|
57
|
-
|
60
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
58
61
|
result = rgeo_geos_polygons_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);
|
59
62
|
}
|
60
63
|
return result;
|
@@ -63,8 +66,11 @@ static VALUE method_polygon_eql(VALUE self, VALUE rhs)
|
|
63
66
|
|
64
67
|
static VALUE method_polygon_geometry_type(VALUE self)
|
65
68
|
{
|
66
|
-
VALUE result
|
67
|
-
RGeo_GeometryData* self_data
|
69
|
+
VALUE result;
|
70
|
+
RGeo_GeometryData* self_data;
|
71
|
+
|
72
|
+
result = Qnil;
|
73
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
68
74
|
if (self_data->geom) {
|
69
75
|
result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_polygon;
|
70
76
|
}
|
@@ -74,11 +80,15 @@ static VALUE method_polygon_geometry_type(VALUE self)
|
|
74
80
|
|
75
81
|
static VALUE method_polygon_area(VALUE self)
|
76
82
|
{
|
77
|
-
VALUE result
|
78
|
-
RGeo_GeometryData* self_data
|
79
|
-
const GEOSGeometry* self_geom
|
83
|
+
VALUE result;
|
84
|
+
RGeo_GeometryData* self_data;
|
85
|
+
const GEOSGeometry* self_geom;
|
86
|
+
double area;
|
87
|
+
|
88
|
+
result = Qnil;
|
89
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
90
|
+
self_geom = self_data->geom;
|
80
91
|
if (self_geom) {
|
81
|
-
double area;
|
82
92
|
if (GEOSArea_r(self_data->geos_context, self_geom, &area)) {
|
83
93
|
result = rb_float_new(area);
|
84
94
|
}
|
@@ -89,9 +99,13 @@ static VALUE method_polygon_area(VALUE self)
|
|
89
99
|
|
90
100
|
static VALUE method_polygon_centroid(VALUE self)
|
91
101
|
{
|
92
|
-
VALUE result
|
93
|
-
RGeo_GeometryData* self_data
|
94
|
-
const GEOSGeometry* self_geom
|
102
|
+
VALUE result;
|
103
|
+
RGeo_GeometryData* self_data;
|
104
|
+
const GEOSGeometry* self_geom;
|
105
|
+
|
106
|
+
result = Qnil;
|
107
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
108
|
+
self_geom = self_data->geom;
|
95
109
|
if (self_geom) {
|
96
110
|
result = rgeo_wrap_geos_geometry(self_data->factory, GEOSGetCentroid_r(self_data->geos_context, self_geom), RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->geos_point);
|
97
111
|
}
|
@@ -101,9 +115,13 @@ static VALUE method_polygon_centroid(VALUE self)
|
|
101
115
|
|
102
116
|
static VALUE method_polygon_point_on_surface(VALUE self)
|
103
117
|
{
|
104
|
-
VALUE result
|
105
|
-
RGeo_GeometryData* self_data
|
106
|
-
const GEOSGeometry* self_geom
|
118
|
+
VALUE result;
|
119
|
+
RGeo_GeometryData* self_data;
|
120
|
+
const GEOSGeometry* self_geom;
|
121
|
+
|
122
|
+
result = Qnil;
|
123
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
124
|
+
self_geom = self_data->geom;
|
107
125
|
if (self_geom) {
|
108
126
|
result = rgeo_wrap_geos_geometry(self_data->factory, GEOSPointOnSurface_r(self_data->geos_context, self_geom), RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->geos_point);
|
109
127
|
}
|
@@ -113,9 +131,13 @@ static VALUE method_polygon_point_on_surface(VALUE self)
|
|
113
131
|
|
114
132
|
static VALUE method_polygon_exterior_ring(VALUE self)
|
115
133
|
{
|
116
|
-
VALUE result
|
117
|
-
RGeo_GeometryData* self_data
|
118
|
-
const GEOSGeometry* self_geom
|
134
|
+
VALUE result;
|
135
|
+
RGeo_GeometryData* self_data;
|
136
|
+
const GEOSGeometry* self_geom;
|
137
|
+
|
138
|
+
result = Qnil;
|
139
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
140
|
+
self_geom = self_data->geom;
|
119
141
|
if (self_geom) {
|
120
142
|
result = rgeo_wrap_geos_geometry_clone(self_data->factory, GEOSGetExteriorRing_r(self_data->geos_context, self_geom), RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->geos_linear_ring);
|
121
143
|
}
|
@@ -125,11 +147,16 @@ static VALUE method_polygon_exterior_ring(VALUE self)
|
|
125
147
|
|
126
148
|
static VALUE method_polygon_num_interior_rings(VALUE self)
|
127
149
|
{
|
128
|
-
VALUE result
|
129
|
-
RGeo_GeometryData* self_data
|
130
|
-
const GEOSGeometry* self_geom
|
150
|
+
VALUE result;
|
151
|
+
RGeo_GeometryData* self_data;
|
152
|
+
const GEOSGeometry* self_geom;
|
153
|
+
int num;
|
154
|
+
|
155
|
+
result = Qnil;
|
156
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
157
|
+
self_geom = self_data->geom;
|
131
158
|
if (self_geom) {
|
132
|
-
|
159
|
+
num = GEOSGetNumInteriorRings_r(self_data->geos_context, self_geom);
|
133
160
|
if (num >= 0) {
|
134
161
|
result = INT2NUM(num);
|
135
162
|
}
|
@@ -140,14 +167,21 @@ static VALUE method_polygon_num_interior_rings(VALUE self)
|
|
140
167
|
|
141
168
|
static VALUE method_polygon_interior_ring_n(VALUE self, VALUE n)
|
142
169
|
{
|
143
|
-
VALUE result
|
144
|
-
RGeo_GeometryData* self_data
|
145
|
-
const GEOSGeometry* self_geom
|
170
|
+
VALUE result;
|
171
|
+
RGeo_GeometryData* self_data;
|
172
|
+
const GEOSGeometry* self_geom;
|
173
|
+
int i;
|
174
|
+
GEOSContextHandle_t self_context;
|
175
|
+
int num;
|
176
|
+
|
177
|
+
result = Qnil;
|
178
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
179
|
+
self_geom = self_data->geom;
|
146
180
|
if (self_geom) {
|
147
|
-
|
181
|
+
i = NUM2INT(n);
|
148
182
|
if (i >= 0) {
|
149
|
-
|
150
|
-
|
183
|
+
self_context = self_data->geos_context;
|
184
|
+
num = GEOSGetNumInteriorRings_r(self_context, self_geom);
|
151
185
|
if (i < num) {
|
152
186
|
result = rgeo_wrap_geos_geometry_clone(self_data->factory,
|
153
187
|
GEOSGetInteriorRingN_r(self_context, self_geom, i),
|
@@ -161,17 +195,25 @@ static VALUE method_polygon_interior_ring_n(VALUE self, VALUE n)
|
|
161
195
|
|
162
196
|
static VALUE method_polygon_interior_rings(VALUE self)
|
163
197
|
{
|
164
|
-
VALUE result
|
165
|
-
RGeo_GeometryData* self_data
|
166
|
-
const GEOSGeometry* self_geom
|
198
|
+
VALUE result;
|
199
|
+
RGeo_GeometryData* self_data;
|
200
|
+
const GEOSGeometry* self_geom;
|
201
|
+
GEOSContextHandle_t self_context;
|
202
|
+
int count;
|
203
|
+
VALUE factory;
|
204
|
+
VALUE linear_ring_class;
|
205
|
+
int i;
|
206
|
+
|
207
|
+
result = Qnil;
|
208
|
+
self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
209
|
+
self_geom = self_data->geom;
|
167
210
|
if (self_geom) {
|
168
|
-
|
169
|
-
|
211
|
+
self_context = self_data->geos_context;
|
212
|
+
count = GEOSGetNumInteriorRings_r(self_context, self_geom);
|
170
213
|
if (count >= 0) {
|
171
214
|
result = rb_ary_new2(count);
|
172
|
-
|
173
|
-
|
174
|
-
int i;
|
215
|
+
factory = self_data->factory;
|
216
|
+
linear_ring_class = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->geos_linear_ring;
|
175
217
|
for (i=0; i<count; ++i) {
|
176
218
|
rb_ary_store(result, i, rgeo_wrap_geos_geometry_clone(factory, GEOSGetInteriorRingN_r(self_context, self_geom, i), linear_ring_class));
|
177
219
|
}
|
@@ -183,25 +225,35 @@ static VALUE method_polygon_interior_rings(VALUE self)
|
|
183
225
|
|
184
226
|
static VALUE cmethod_create(VALUE module, VALUE factory, VALUE exterior, VALUE interior_array)
|
185
227
|
{
|
228
|
+
RGeo_FactoryData* factory_data;
|
229
|
+
VALUE linear_ring_type;
|
230
|
+
GEOSGeometry* exterior_geom;
|
231
|
+
GEOSContextHandle_t context;
|
232
|
+
unsigned int len;
|
233
|
+
GEOSGeometry** interior_geoms;
|
234
|
+
unsigned int actual_len;
|
235
|
+
unsigned int i;
|
236
|
+
GEOSGeometry* interior_geom;
|
237
|
+
GEOSGeometry* polygon;
|
238
|
+
|
186
239
|
Check_Type(interior_array, T_ARRAY);
|
187
|
-
|
188
|
-
|
189
|
-
|
240
|
+
factory_data = RGEO_FACTORY_DATA_PTR(factory);
|
241
|
+
linear_ring_type = factory_data->globals->feature_linear_ring;
|
242
|
+
exterior_geom = rgeo_convert_to_detached_geos_geometry(exterior, factory, linear_ring_type, NULL);
|
190
243
|
if (exterior_geom) {
|
191
|
-
|
192
|
-
|
193
|
-
|
244
|
+
context = factory_data->geos_context;
|
245
|
+
len = (unsigned int)RARRAY_LEN(interior_array);
|
246
|
+
interior_geoms = ALLOC_N(GEOSGeometry*, len == 0 ? 1 : len);
|
194
247
|
if (interior_geoms) {
|
195
|
-
|
196
|
-
unsigned int i;
|
248
|
+
actual_len = 0;
|
197
249
|
for (i=0; i<len; ++i) {
|
198
|
-
|
250
|
+
interior_geom = rgeo_convert_to_detached_geos_geometry(rb_ary_entry(interior_array, i), factory, linear_ring_type, NULL);
|
199
251
|
if (interior_geom) {
|
200
252
|
interior_geoms[actual_len++] = interior_geom;
|
201
253
|
}
|
202
254
|
}
|
203
255
|
if (len == actual_len) {
|
204
|
-
|
256
|
+
polygon = GEOSGeom_createPolygon_r(context, exterior_geom, interior_geoms, actual_len);
|
205
257
|
if (polygon) {
|
206
258
|
free(interior_geoms);
|
207
259
|
return rgeo_wrap_geos_geometry(factory, polygon, factory_data->globals->geos_polygon);
|
@@ -220,7 +272,9 @@ static VALUE cmethod_create(VALUE module, VALUE factory, VALUE exterior, VALUE i
|
|
220
272
|
|
221
273
|
void rgeo_init_geos_polygon(RGeo_Globals* globals)
|
222
274
|
{
|
223
|
-
VALUE geos_polygon_class
|
275
|
+
VALUE geos_polygon_class;
|
276
|
+
|
277
|
+
geos_polygon_class = rb_define_class_under(globals->geos_module, "PolygonImpl", globals->geos_geometry);
|
224
278
|
globals->geos_polygon = geos_polygon_class;
|
225
279
|
globals->feature_polygon = rb_const_get_at(globals->feature_module, rb_intern("Polygon"));
|
226
280
|
rb_funcall(globals->global_mixins, rb_intern("include_in_class"), 2,
|
@@ -244,15 +298,19 @@ void rgeo_init_geos_polygon(RGeo_Globals* globals)
|
|
244
298
|
|
245
299
|
VALUE rgeo_geos_polygons_eql(GEOSContextHandle_t context, const GEOSGeometry* geom1, const GEOSGeometry* geom2, char check_z)
|
246
300
|
{
|
247
|
-
VALUE result
|
301
|
+
VALUE result;
|
302
|
+
int len1;
|
303
|
+
int len2;
|
304
|
+
int i;
|
305
|
+
|
306
|
+
result = Qnil;
|
248
307
|
if (geom1 && geom2) {
|
249
308
|
result = rgeo_geos_coordseqs_eql(context, GEOSGetExteriorRing_r(context, geom1), GEOSGetExteriorRing_r(context, geom2), check_z);
|
250
309
|
if (RTEST(result)) {
|
251
|
-
|
252
|
-
|
310
|
+
len1 = GEOSGetNumInteriorRings_r(context, geom1);
|
311
|
+
len2 = GEOSGetNumInteriorRings_r(context, geom2);
|
253
312
|
if (len1 >= 0 && len2 >= 0) {
|
254
313
|
if (len1 == len2) {
|
255
|
-
int i;
|
256
314
|
for (i=0; i<len1; ++i) {
|
257
315
|
result = rgeo_geos_coordseqs_eql(context, GEOSGetInteriorRingN_r(context, geom1, i), GEOSGetInteriorRingN_r(context, geom2, i), check_z);
|
258
316
|
if (!RTEST(result)) {
|
data/ext/proj4_c_impl/extconf.rb
CHANGED
@@ -52,7 +52,7 @@ else
|
|
52
52
|
'/opt/proj4/include',
|
53
53
|
'/opt/include',
|
54
54
|
'/Library/Frameworks/PROJ.framework/unix/include',
|
55
|
-
::
|
55
|
+
::RbConfig::CONFIG['includedir'],
|
56
56
|
'/usr/include',
|
57
57
|
]
|
58
58
|
lib_dirs_ =
|
@@ -65,7 +65,7 @@ else
|
|
65
65
|
'/opt/proj4/lib',
|
66
66
|
'/opt/lib',
|
67
67
|
'/Library/Frameworks/PROJ.framework/unix/lib',
|
68
|
-
::
|
68
|
+
::RbConfig::CONFIG['libdir'],
|
69
69
|
'/usr/lib',
|
70
70
|
]
|
71
71
|
header_dirs_.delete_if{ |path_| !::File.directory?(path_) }
|
data/ext/proj4_c_impl/main.c
CHANGED
@@ -95,8 +95,11 @@ static void mark_proj4_func(RGeo_Proj4Data* data)
|
|
95
95
|
|
96
96
|
static VALUE alloc_proj4(VALUE klass)
|
97
97
|
{
|
98
|
-
VALUE result
|
99
|
-
RGeo_Proj4Data* data
|
98
|
+
VALUE result;
|
99
|
+
RGeo_Proj4Data* data;
|
100
|
+
|
101
|
+
result = Qnil;
|
102
|
+
data = ALLOC(RGeo_Proj4Data);
|
100
103
|
if (data) {
|
101
104
|
data->pj = NULL;
|
102
105
|
data->original_str = Qnil;
|
@@ -109,9 +112,14 @@ static VALUE alloc_proj4(VALUE klass)
|
|
109
112
|
|
110
113
|
static VALUE method_proj4_initialize_copy(VALUE self, VALUE orig)
|
111
114
|
{
|
115
|
+
RGeo_Proj4Data* self_data;
|
116
|
+
projPJ pj;
|
117
|
+
RGeo_Proj4Data* orig_data;
|
118
|
+
char* str;
|
119
|
+
|
112
120
|
// Clear out any existing value
|
113
|
-
|
114
|
-
|
121
|
+
self_data = RGEO_PROJ4_DATA_PTR(self);
|
122
|
+
pj = self_data->pj;
|
115
123
|
if (pj) {
|
116
124
|
pj_free(pj);
|
117
125
|
self_data->pj = NULL;
|
@@ -119,12 +127,12 @@ static VALUE method_proj4_initialize_copy(VALUE self, VALUE orig)
|
|
119
127
|
}
|
120
128
|
|
121
129
|
// Copy value from orig
|
122
|
-
|
130
|
+
orig_data = RGEO_PROJ4_DATA_PTR(orig);
|
123
131
|
if (!NIL_P(orig_data->original_str)) {
|
124
132
|
self_data->pj = pj_init_plus(RSTRING_PTR(orig_data->original_str));
|
125
133
|
}
|
126
134
|
else {
|
127
|
-
|
135
|
+
str = pj_get_def(orig_data->pj, 0);
|
128
136
|
self_data->pj = pj_init_plus(str);
|
129
137
|
pj_dalloc(str);
|
130
138
|
}
|
@@ -137,11 +145,14 @@ static VALUE method_proj4_initialize_copy(VALUE self, VALUE orig)
|
|
137
145
|
|
138
146
|
static VALUE method_proj4_set_value(VALUE self, VALUE str, VALUE uses_radians)
|
139
147
|
{
|
148
|
+
RGeo_Proj4Data* self_data;
|
149
|
+
projPJ pj;
|
150
|
+
|
140
151
|
Check_Type(str, T_STRING);
|
141
152
|
|
142
153
|
// Clear out any existing value
|
143
|
-
|
144
|
-
|
154
|
+
self_data = RGEO_PROJ4_DATA_PTR(self);
|
155
|
+
pj = self_data->pj;
|
145
156
|
if (pj) {
|
146
157
|
pj_free(pj);
|
147
158
|
self_data->pj = NULL;
|
@@ -159,10 +170,14 @@ static VALUE method_proj4_set_value(VALUE self, VALUE str, VALUE uses_radians)
|
|
159
170
|
|
160
171
|
static VALUE method_proj4_get_geographic(VALUE self)
|
161
172
|
{
|
162
|
-
VALUE result
|
163
|
-
RGeo_Proj4Data* new_data
|
173
|
+
VALUE result;
|
174
|
+
RGeo_Proj4Data* new_data;
|
175
|
+
RGeo_Proj4Data* self_data;
|
176
|
+
|
177
|
+
result = Qnil;
|
178
|
+
new_data = ALLOC(RGeo_Proj4Data);
|
164
179
|
if (new_data) {
|
165
|
-
|
180
|
+
self_data = RGEO_PROJ4_DATA_PTR(self);
|
166
181
|
new_data->pj = pj_latlong_from_proj(self_data->pj);
|
167
182
|
new_data->original_str = Qnil;
|
168
183
|
new_data->uses_radians = self_data->uses_radians;
|
@@ -186,10 +201,14 @@ static VALUE method_proj4_uses_radians(VALUE self)
|
|
186
201
|
|
187
202
|
static VALUE method_proj4_canonical_str(VALUE self)
|
188
203
|
{
|
189
|
-
VALUE result
|
190
|
-
projPJ pj
|
204
|
+
VALUE result;
|
205
|
+
projPJ pj;
|
206
|
+
char* str;
|
207
|
+
|
208
|
+
result = Qnil;
|
209
|
+
pj = RGEO_PROJ4_DATA_PTR(self)->pj;
|
191
210
|
if (pj) {
|
192
|
-
|
211
|
+
str = pj_get_def(pj, 0);
|
193
212
|
if (str) {
|
194
213
|
result = rb_str_new2(str);
|
195
214
|
pj_dalloc(str);
|
@@ -201,8 +220,11 @@ static VALUE method_proj4_canonical_str(VALUE self)
|
|
201
220
|
|
202
221
|
static VALUE method_proj4_is_geographic(VALUE self)
|
203
222
|
{
|
204
|
-
VALUE result
|
205
|
-
projPJ pj
|
223
|
+
VALUE result;
|
224
|
+
projPJ pj;
|
225
|
+
|
226
|
+
result = Qnil;
|
227
|
+
pj = RGEO_PROJ4_DATA_PTR(self)->pj;
|
206
228
|
if (pj) {
|
207
229
|
result = pj_is_latlong(pj) ? Qtrue : Qfalse;
|
208
230
|
}
|
@@ -212,8 +234,11 @@ static VALUE method_proj4_is_geographic(VALUE self)
|
|
212
234
|
|
213
235
|
static VALUE method_proj4_is_geocentric(VALUE self)
|
214
236
|
{
|
215
|
-
VALUE result
|
216
|
-
projPJ pj
|
237
|
+
VALUE result;
|
238
|
+
projPJ pj;
|
239
|
+
|
240
|
+
result = Qnil;
|
241
|
+
pj = RGEO_PROJ4_DATA_PTR(self)->pj;
|
217
242
|
if (pj) {
|
218
243
|
result = pj_is_geocent(pj) ? Qtrue : Qfalse;
|
219
244
|
}
|
@@ -229,17 +254,23 @@ static VALUE method_proj4_is_valid(VALUE self)
|
|
229
254
|
|
230
255
|
static VALUE cmethod_proj4_transform(VALUE method, VALUE from, VALUE to, VALUE x, VALUE y, VALUE z)
|
231
256
|
{
|
232
|
-
VALUE result
|
233
|
-
projPJ from_pj
|
234
|
-
projPJ to_pj
|
257
|
+
VALUE result;
|
258
|
+
projPJ from_pj;
|
259
|
+
projPJ to_pj;
|
260
|
+
double xval, yval, zval;
|
261
|
+
int err;
|
262
|
+
|
263
|
+
result = Qnil;
|
264
|
+
from_pj = RGEO_PROJ4_DATA_PTR(from)->pj;
|
265
|
+
to_pj = RGEO_PROJ4_DATA_PTR(to)->pj;
|
235
266
|
if (from_pj && to_pj) {
|
236
|
-
|
237
|
-
|
238
|
-
|
267
|
+
xval = rb_num2dbl(x);
|
268
|
+
yval = rb_num2dbl(y);
|
269
|
+
zval = 0.0;
|
239
270
|
if (!NIL_P(z)) {
|
240
271
|
zval = rb_num2dbl(z);
|
241
272
|
}
|
242
|
-
|
273
|
+
err = pj_transform(from_pj, to_pj, 1, 1, &xval, &yval, NIL_P(z) ? NULL : &zval);
|
243
274
|
if (!err && xval != HUGE_VAL && yval != HUGE_VAL && (NIL_P(z) || zval != HUGE_VAL)) {
|
244
275
|
result = rb_ary_new2(NIL_P(z) ? 2 : 3);
|
245
276
|
rb_ary_push(result, rb_float_new(xval));
|
@@ -255,9 +286,12 @@ static VALUE cmethod_proj4_transform(VALUE method, VALUE from, VALUE to, VALUE x
|
|
255
286
|
|
256
287
|
static VALUE cmethod_proj4_create(VALUE klass, VALUE str, VALUE uses_radians)
|
257
288
|
{
|
258
|
-
VALUE result
|
289
|
+
VALUE result;
|
290
|
+
RGeo_Proj4Data* data;
|
291
|
+
|
292
|
+
result = Qnil;
|
259
293
|
Check_Type(str, T_STRING);
|
260
|
-
|
294
|
+
data = ALLOC(RGeo_Proj4Data);
|
261
295
|
if (data) {
|
262
296
|
data->pj = pj_init_plus(RSTRING_PTR(str));
|
263
297
|
data->original_str = str;
|
@@ -270,9 +304,13 @@ static VALUE cmethod_proj4_create(VALUE klass, VALUE str, VALUE uses_radians)
|
|
270
304
|
|
271
305
|
static void rgeo_init_proj4()
|
272
306
|
{
|
273
|
-
VALUE rgeo_module
|
274
|
-
VALUE coordsys_module
|
275
|
-
VALUE proj4_class
|
307
|
+
VALUE rgeo_module;
|
308
|
+
VALUE coordsys_module;
|
309
|
+
VALUE proj4_class;
|
310
|
+
|
311
|
+
rgeo_module = rb_define_module("RGeo");
|
312
|
+
coordsys_module = rb_define_module_under(rgeo_module, "CoordSys");
|
313
|
+
proj4_class = rb_define_class_under(coordsys_module, "Proj4", rb_cObject);
|
276
314
|
|
277
315
|
rb_define_alloc_func(proj4_class, alloc_proj4);
|
278
316
|
rb_define_module_function(proj4_class, "_create", cmethod_proj4_create, 2);
|