rgeo 3.0.0.pre.rc.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -1
- data/ext/geos_c_impl/analysis.c +26 -23
- data/ext/geos_c_impl/analysis.h +8 -5
- data/ext/geos_c_impl/coordinates.c +27 -21
- data/ext/geos_c_impl/coordinates.h +5 -2
- data/ext/geos_c_impl/errors.c +15 -8
- data/ext/geos_c_impl/errors.h +4 -1
- data/ext/geos_c_impl/extconf.rb +40 -30
- data/ext/geos_c_impl/factory.c +405 -389
- data/ext/geos_c_impl/factory.h +71 -49
- data/ext/geos_c_impl/geometry.c +485 -408
- data/ext/geos_c_impl/geometry.h +5 -5
- data/ext/geos_c_impl/geometry_collection.c +269 -198
- data/ext/geos_c_impl/geometry_collection.h +6 -7
- data/ext/geos_c_impl/globals.c +99 -21
- data/ext/geos_c_impl/globals.h +3 -2
- data/ext/geos_c_impl/line_string.c +261 -220
- data/ext/geos_c_impl/line_string.h +5 -6
- data/ext/geos_c_impl/main.c +8 -9
- data/ext/geos_c_impl/point.c +62 -65
- data/ext/geos_c_impl/point.h +4 -5
- data/ext/geos_c_impl/polygon.c +121 -90
- data/ext/geos_c_impl/polygon.h +11 -9
- data/ext/geos_c_impl/preface.h +4 -13
- data/ext/geos_c_impl/ruby_more.c +39 -37
- data/ext/geos_c_impl/ruby_more.h +11 -2
- data/lib/rgeo/cartesian/analysis.rb +5 -3
- data/lib/rgeo/cartesian/bounding_box.rb +74 -79
- data/lib/rgeo/cartesian/calculations.rb +20 -26
- data/lib/rgeo/cartesian/factory.rb +52 -89
- data/lib/rgeo/cartesian/feature_methods.rb +0 -5
- data/lib/rgeo/cartesian/interface.rb +6 -5
- data/lib/rgeo/cartesian/planar_graph.rb +10 -16
- data/lib/rgeo/cartesian/sweepline_intersector.rb +1 -3
- data/lib/rgeo/cartesian/valid_op.rb +1 -3
- data/lib/rgeo/coord_sys/cs/entities.rb +299 -99
- data/lib/rgeo/coord_sys/cs/factories.rb +0 -2
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +85 -37
- data/lib/rgeo/coord_sys.rb +1 -9
- data/lib/rgeo/feature/curve.rb +0 -11
- data/lib/rgeo/feature/factory.rb +26 -36
- data/lib/rgeo/feature/factory_generator.rb +6 -11
- data/lib/rgeo/feature/geometry.rb +41 -40
- data/lib/rgeo/feature/geometry_collection.rb +3 -4
- data/lib/rgeo/feature/line_string.rb +1 -2
- data/lib/rgeo/feature/linear_ring.rb +0 -1
- data/lib/rgeo/feature/multi_curve.rb +0 -6
- data/lib/rgeo/feature/multi_surface.rb +0 -1
- data/lib/rgeo/feature/point.rb +0 -1
- data/lib/rgeo/feature/polygon.rb +1 -2
- data/lib/rgeo/feature/surface.rb +0 -1
- data/lib/rgeo/feature/types.rb +73 -83
- data/lib/rgeo/geographic/factory.rb +93 -119
- data/lib/rgeo/geographic/interface.rb +62 -116
- data/lib/rgeo/geographic/projected_feature_methods.rb +2 -16
- data/lib/rgeo/geographic/projected_window.rb +36 -22
- data/lib/rgeo/geographic/{proj4_projector.rb → projector.rb} +3 -3
- data/lib/rgeo/geographic/simple_mercator_projector.rb +24 -21
- data/lib/rgeo/geographic/spherical_feature_methods.rb +8 -8
- data/lib/rgeo/geographic/spherical_math.rb +17 -20
- data/lib/rgeo/geographic.rb +1 -1
- data/lib/rgeo/geos/capi_factory.rb +70 -124
- data/lib/rgeo/geos/capi_feature_classes.rb +0 -29
- data/lib/rgeo/geos/ffi_factory.rb +90 -131
- data/lib/rgeo/geos/ffi_feature_methods.rb +73 -128
- data/lib/rgeo/geos/interface.rb +21 -36
- data/lib/rgeo/geos/utils.rb +3 -3
- data/lib/rgeo/geos/zm_factory.rb +53 -76
- data/lib/rgeo/geos/zm_feature_methods.rb +16 -34
- data/lib/rgeo/geos.rb +2 -5
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +5 -18
- data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -2
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +18 -42
- data/lib/rgeo/impl_helper/basic_point_methods.rb +1 -13
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +16 -25
- data/lib/rgeo/impl_helper/utils.rb +21 -0
- data/lib/rgeo/impl_helper/valid_op.rb +12 -16
- data/lib/rgeo/impl_helper/validity_check.rb +3 -3
- data/lib/rgeo/version.rb +1 -1
- data/lib/rgeo/wkrep/wkb_generator.rb +73 -63
- data/lib/rgeo/wkrep/wkb_parser.rb +33 -31
- data/lib/rgeo/wkrep/wkt_generator.rb +52 -45
- data/lib/rgeo/wkrep/wkt_parser.rb +48 -35
- data/lib/rgeo.rb +1 -3
- metadata +10 -9
data/ext/geos_c_impl/factory.h
CHANGED
@@ -5,19 +5,19 @@
|
|
5
5
|
#ifndef RGEO_GEOS_FACTORY_INCLUDED
|
6
6
|
#define RGEO_GEOS_FACTORY_INCLUDED
|
7
7
|
|
8
|
-
#include <ruby.h>
|
9
8
|
#include <geos_c.h>
|
9
|
+
#include <ruby.h>
|
10
10
|
|
11
11
|
RGEO_BEGIN_C
|
12
12
|
|
13
13
|
/*
|
14
14
|
Wrapped structure for Factory objects.
|
15
|
-
A factory encapsulates
|
15
|
+
A factory encapsulates GEOS serializer settings.
|
16
16
|
It also stores the SRID for all geometries created by this factory,
|
17
17
|
and the resolution for buffers created for this factory's geometries.
|
18
18
|
*/
|
19
|
-
typedef struct
|
20
|
-
|
19
|
+
typedef struct
|
20
|
+
{
|
21
21
|
GEOSWKTReader* wkt_reader;
|
22
22
|
GEOSWKBReader* wkb_reader;
|
23
23
|
GEOSWKTWriter* wkt_writer;
|
@@ -30,7 +30,6 @@ typedef struct {
|
|
30
30
|
GEOSWKBReader* marshal_wkb_reader;
|
31
31
|
GEOSWKTWriter* psych_wkt_writer;
|
32
32
|
GEOSWKBWriter* marshal_wkb_writer;
|
33
|
-
VALUE proj4_obj;
|
34
33
|
VALUE coord_sys_obj;
|
35
34
|
int flags;
|
36
35
|
int srid;
|
@@ -42,30 +41,35 @@ typedef struct {
|
|
42
41
|
They are available in ruby under RGeo::Geos::CAPIFactory::FLAG_name
|
43
42
|
where name is the name below without the RGEO_FACTORYFLAGS_ prefix.
|
44
43
|
*/
|
45
|
-
#define RGEO_FACTORYFLAGS_SUPPORTS_Z
|
46
|
-
#define RGEO_FACTORYFLAGS_SUPPORTS_M
|
47
|
-
#define RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M
|
48
|
-
|
44
|
+
#define RGEO_FACTORYFLAGS_SUPPORTS_Z 0b0010
|
45
|
+
#define RGEO_FACTORYFLAGS_SUPPORTS_M 0b0100
|
46
|
+
#define RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M \
|
47
|
+
(RGEO_FACTORYFLAGS_SUPPORTS_Z | RGEO_FACTORYFLAGS_SUPPORTS_M)
|
48
|
+
#define RGEO_FACTORYFLAGS_PREPARE_HEURISTIC 0b1000
|
49
49
|
|
50
50
|
/* call-seq:
|
51
51
|
* RGeo::Geos::CAPIFactory.supports_z? -> true or false
|
52
52
|
*/
|
53
|
-
VALUE
|
53
|
+
VALUE
|
54
|
+
method_factory_supports_z_p(VALUE self);
|
54
55
|
|
55
56
|
/* call-seq:
|
56
57
|
* RGeo::Geos::CAPIFactory.supports_m? -> true or false
|
57
58
|
*/
|
58
|
-
VALUE
|
59
|
+
VALUE
|
60
|
+
method_factory_supports_m_p(VALUE self);
|
59
61
|
|
60
62
|
/* call-seq:
|
61
63
|
* RGeo::Geos::CAPIFactory.supports_z_or_m? -> true or false
|
62
64
|
*/
|
63
|
-
VALUE
|
65
|
+
VALUE
|
66
|
+
method_factory_supports_z_or_m_p(VALUE self);
|
64
67
|
|
65
68
|
/* call-seq:
|
66
69
|
* RGeo::Geos::CAPIFactory.prepare_heuristic? -> true or false
|
67
70
|
*/
|
68
|
-
VALUE
|
71
|
+
VALUE
|
72
|
+
method_factory_prepare_heuristic_p(VALUE self);
|
69
73
|
|
70
74
|
/*
|
71
75
|
Wrapped structure for Geometry objects.
|
@@ -80,47 +84,44 @@ VALUE method_factory_prepare_heuristic_p(VALUE self);
|
|
80
84
|
in Line objects, which have no GEOS type). Any array element, or the
|
81
85
|
array itself, could be Qnil, indicating fall back to the default
|
82
86
|
inferred from the GEOS type.
|
83
|
-
|
84
|
-
The GEOS context handle is also included here. Ideally, it would be
|
85
|
-
available by following the factory reference and getting it from the
|
86
|
-
factory data. However, one use case is in the destroy_geometry_func
|
87
|
-
in factory.c, and Rubinius 1.1.1 seems to crash when you try to
|
88
|
-
evaluate a DATA_PTR from that function, so we copy the context handle
|
89
|
-
here so the destroy_geometry_func can get to it.
|
90
87
|
*/
|
91
|
-
typedef struct
|
92
|
-
|
88
|
+
typedef struct
|
89
|
+
{
|
93
90
|
GEOSGeometry* geom;
|
94
91
|
const GEOSPreparedGeometry* prep;
|
95
92
|
VALUE factory;
|
96
93
|
VALUE klasses;
|
97
94
|
} RGeo_GeometryData;
|
98
95
|
|
99
|
-
|
100
96
|
// Data types which indicate how RGeo types should be managed by Ruby.
|
101
97
|
extern const rb_data_type_t rgeo_factory_type;
|
102
98
|
|
103
99
|
extern const rb_data_type_t rgeo_geometry_type;
|
104
100
|
|
105
|
-
|
106
101
|
// Convenient macros for checking the type of data from Ruby
|
107
|
-
#define RGEO_FACTORY_TYPEDDATA_P(object)
|
108
|
-
|
102
|
+
#define RGEO_FACTORY_TYPEDDATA_P(object) \
|
103
|
+
(_RGEO_TYPEDDATA_P(object, &rgeo_factory_type))
|
104
|
+
#define RGEO_GEOMETRY_TYPEDDATA_P(object) \
|
105
|
+
(_RGEO_TYPEDDATA_P(object, &rgeo_geometry_type))
|
109
106
|
|
110
|
-
#define _RGEO_TYPEDDATA_P(object, data_type)
|
107
|
+
#define _RGEO_TYPEDDATA_P(object, data_type) \
|
108
|
+
(TYPE(object) == T_DATA && RTYPEDDATA(object)->typed_flag == 1 && \
|
109
|
+
RTYPEDDATA(object)->type == data_type)
|
111
110
|
|
112
111
|
// Returns the RGeo_FactoryData* given a ruby Factory object
|
113
|
-
#define RGEO_FACTORY_DATA_PTR(factory)
|
112
|
+
#define RGEO_FACTORY_DATA_PTR(factory) \
|
113
|
+
((RGeo_FactoryData*)RTYPEDDATA_DATA(factory))
|
114
114
|
|
115
115
|
// Returns the RGeo_GeometryData* given a ruby Geometry object
|
116
|
-
#define RGEO_GEOMETRY_DATA_PTR(geometry)
|
117
|
-
|
116
|
+
#define RGEO_GEOMETRY_DATA_PTR(geometry) \
|
117
|
+
((RGeo_GeometryData*)RTYPEDDATA_DATA(geometry))
|
118
118
|
|
119
119
|
/*
|
120
120
|
Initializes the factory module. This should be called first in the
|
121
121
|
initialization process.
|
122
122
|
*/
|
123
|
-
void
|
123
|
+
void
|
124
|
+
rgeo_init_geos_factory();
|
124
125
|
|
125
126
|
/*
|
126
127
|
Given a GEOS geometry handle, wraps it in a ruby Geometry object of the
|
@@ -134,13 +135,17 @@ void rgeo_init_geos_factory();
|
|
134
135
|
classes for the elements of the collection.
|
135
136
|
Returns Qnil if the wrapping failed for any reason.
|
136
137
|
*/
|
137
|
-
VALUE
|
138
|
+
VALUE
|
139
|
+
rgeo_wrap_geos_geometry(VALUE factory, GEOSGeometry* geom, VALUE klass);
|
138
140
|
|
139
141
|
/*
|
140
142
|
Same as rgeo_wrap_geos_geometry except that it wraps a clone of the
|
141
143
|
given geom, so the original geom doesn't change ownership.
|
142
144
|
*/
|
143
|
-
VALUE
|
145
|
+
VALUE
|
146
|
+
rgeo_wrap_geos_geometry_clone(VALUE factory,
|
147
|
+
const GEOSGeometry* geom,
|
148
|
+
VALUE klass);
|
144
149
|
|
145
150
|
/*
|
146
151
|
Gets the GEOS geometry for a given ruby Geometry object. If the given
|
@@ -149,8 +154,18 @@ VALUE rgeo_wrap_geos_geometry_clone(VALUE factory, const GEOSGeometry* geom, VAL
|
|
149
154
|
specified by an appropriate feature module. Passing Qnil for the type
|
150
155
|
disables this auto-cast. The returned GEOS geometry is owned by rgeo,
|
151
156
|
and you should not dispose it or take ownership of it yourself.
|
157
|
+
|
158
|
+
The state parameter is given to follow `rb_protect*` ruby methods: this
|
159
|
+
method calls `#cast`, and this call may raise. if it does raise, state
|
160
|
+
will be set to a non-zero value, and you'll have access to the error
|
161
|
+
in `rb_errinfo()`. IT IS THE CALLER'S RESPONSIBILITY TO PROPAGATE THE
|
162
|
+
ERROR. You could also discard the error with `rb_set_errinfo(Qnil)`,
|
163
|
+
this will just ignore the error altogether. The error can be raised
|
164
|
+
with `rb_jump_tag(state)` which is helpful if you need to free data
|
165
|
+
before you raise the error.
|
152
166
|
*/
|
153
|
-
const GEOSGeometry*
|
167
|
+
const GEOSGeometry*
|
168
|
+
rgeo_convert_to_geos_geometry(VALUE factory, VALUE obj, VALUE type, int* state);
|
154
169
|
|
155
170
|
/*
|
156
171
|
Gets a GEOS geometry for a given ruby Geometry object. You must provide
|
@@ -173,42 +188,54 @@ const GEOSGeometry* rgeo_convert_to_geos_geometry(VALUE factory, VALUE obj, VALU
|
|
173
188
|
will be set to a non-zero value, and you'll have access to the error
|
174
189
|
in `rb_errinfo()`. IT IS THE CALLER'S RESPONSIBILITY TO PROPAGATE THE
|
175
190
|
ERROR. You could also discard the error with `rb_set_errinfo(Qnil)`,
|
176
|
-
this will just ignore the error altogether.
|
191
|
+
this will just ignore the error altogether. The error can be raised
|
192
|
+
with `rb_jump_tag(state)` which is helpful if you need to free data
|
193
|
+
before you raise the error.
|
177
194
|
*/
|
178
|
-
GEOSGeometry*
|
195
|
+
GEOSGeometry*
|
196
|
+
rgeo_convert_to_detached_geos_geometry(VALUE obj,
|
197
|
+
VALUE factory,
|
198
|
+
VALUE type,
|
199
|
+
VALUE* klasses,
|
200
|
+
int* state);
|
179
201
|
|
180
202
|
/*
|
181
203
|
Returns 1 if the given ruby object is a GEOS Geometry implementation,
|
182
204
|
or 0 if not.
|
183
205
|
*/
|
184
|
-
char
|
206
|
+
char
|
207
|
+
rgeo_is_geos_object(VALUE obj);
|
185
208
|
|
186
209
|
/*
|
187
210
|
Raises a rgeo error if the object is not a GEOS Geometry implementation.
|
188
211
|
*/
|
189
|
-
void
|
212
|
+
void
|
213
|
+
rgeo_check_geos_object(VALUE obj);
|
190
214
|
|
191
215
|
/*
|
192
216
|
Gets the underlying GEOS geometry for a given ruby object. Returns NULL
|
193
217
|
if the given ruby object is not a GEOS geometry wrapper.
|
194
218
|
*/
|
195
|
-
const GEOSGeometry*
|
219
|
+
const GEOSGeometry*
|
220
|
+
rgeo_get_geos_geometry_safe(VALUE obj);
|
196
221
|
|
197
222
|
/*
|
198
223
|
Compares the ruby classes and geometry factories of the two given ruby
|
199
224
|
objects. Returns Qtrue if everything is equal (that is, the two objects
|
200
225
|
are of the same type and factory), or Qfalse otherwise.
|
201
226
|
*/
|
202
|
-
VALUE
|
227
|
+
VALUE
|
228
|
+
rgeo_geos_klasses_and_factories_eql(VALUE obj1, VALUE obj2);
|
203
229
|
|
204
230
|
/*
|
205
231
|
A tool for building up hash values.
|
206
|
-
You must pass
|
232
|
+
You must pass a geos geometry and a seed hash.
|
207
233
|
Returns an updated hash.
|
208
234
|
This call is useful in sequence, and should be bracketed by calls to
|
209
235
|
rb_hash_start and rb_hash_end.
|
210
236
|
*/
|
211
|
-
st_index_t
|
237
|
+
st_index_t
|
238
|
+
rgeo_geos_coordseq_hash(const GEOSGeometry* geom, st_index_t hash);
|
212
239
|
|
213
240
|
/*
|
214
241
|
A tool for building up hash values.
|
@@ -217,13 +244,8 @@ st_index_t rgeo_geos_coordseq_hash(GEOSContextHandle_t context, const GEOSGeomet
|
|
217
244
|
This call is useful in sequence, and should be bracketed by calls to
|
218
245
|
rb_hash_start and rb_hash_end.
|
219
246
|
*/
|
220
|
-
st_index_t
|
221
|
-
|
222
|
-
/*
|
223
|
-
Internal tool for creating simple (FNV-1A 32 bit) hashes.
|
224
|
-
*/
|
225
|
-
st_index_t rgeo_internal_memhash(const void* ptr, long len);
|
226
|
-
|
247
|
+
st_index_t
|
248
|
+
rgeo_geos_objbase_hash(VALUE factory, VALUE type_module, st_index_t hash);
|
227
249
|
|
228
250
|
RGEO_END_C
|
229
251
|
|