rgeo 2.3.1 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +6 -0
- data/README.md +23 -14
- data/ext/geos_c_impl/analysis.c +30 -25
- data/ext/geos_c_impl/analysis.h +8 -7
- 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 +19 -10
- data/ext/geos_c_impl/errors.h +11 -4
- data/ext/geos_c_impl/extconf.rb +42 -28
- data/ext/geos_c_impl/factory.c +540 -451
- data/ext/geos_c_impl/factory.h +105 -95
- data/ext/geos_c_impl/geometry.c +593 -387
- data/ext/geos_c_impl/geometry.h +10 -5
- data/ext/geos_c_impl/geometry_collection.c +306 -339
- data/ext/geos_c_impl/geometry_collection.h +6 -20
- data/ext/geos_c_impl/globals.c +169 -0
- data/ext/geos_c_impl/globals.h +46 -0
- data/ext/geos_c_impl/line_string.c +271 -231
- data/ext/geos_c_impl/line_string.h +5 -8
- data/ext/geos_c_impl/main.c +16 -16
- data/ext/geos_c_impl/point.c +65 -67
- data/ext/geos_c_impl/point.h +4 -7
- data/ext/geos_c_impl/polygon.c +137 -135
- data/ext/geos_c_impl/polygon.h +11 -11
- data/ext/geos_c_impl/preface.h +16 -10
- data/ext/geos_c_impl/ruby_more.c +67 -0
- data/ext/geos_c_impl/ruby_more.h +25 -0
- data/lib/rgeo/cartesian/analysis.rb +5 -3
- data/lib/rgeo/cartesian/bounding_box.rb +74 -79
- data/lib/rgeo/cartesian/calculations.rb +64 -33
- data/lib/rgeo/cartesian/factory.rb +57 -102
- data/lib/rgeo/cartesian/feature_classes.rb +68 -46
- data/lib/rgeo/cartesian/feature_methods.rb +67 -25
- data/lib/rgeo/cartesian/interface.rb +6 -41
- data/lib/rgeo/cartesian/planar_graph.rb +373 -0
- data/lib/rgeo/cartesian/sweepline_intersector.rb +147 -0
- data/lib/rgeo/cartesian/valid_op.rb +69 -0
- data/lib/rgeo/cartesian.rb +3 -0
- data/lib/rgeo/coord_sys/cs/entities.rb +303 -99
- data/lib/rgeo/coord_sys/cs/factories.rb +0 -2
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +90 -42
- data/lib/rgeo/coord_sys.rb +1 -20
- data/lib/rgeo/error.rb +15 -0
- data/lib/rgeo/feature/curve.rb +0 -11
- data/lib/rgeo/feature/factory.rb +26 -36
- data/lib/rgeo/feature/factory_generator.rb +6 -14
- data/lib/rgeo/feature/geometry.rb +146 -66
- data/lib/rgeo/feature/geometry_collection.rb +16 -9
- data/lib/rgeo/feature/line_string.rb +4 -5
- 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 +3 -4
- data/lib/rgeo/feature/point.rb +4 -5
- data/lib/rgeo/feature/polygon.rb +1 -2
- data/lib/rgeo/feature/surface.rb +3 -4
- data/lib/rgeo/feature/types.rb +69 -85
- data/lib/rgeo/geographic/factory.rb +98 -125
- data/lib/rgeo/geographic/interface.rb +69 -166
- data/lib/rgeo/geographic/projected_feature_classes.rb +21 -9
- data/lib/rgeo/geographic/projected_feature_methods.rb +67 -42
- data/lib/rgeo/geographic/projected_window.rb +36 -22
- data/lib/rgeo/geographic/{proj4_projector.rb → projector.rb} +3 -5
- data/lib/rgeo/geographic/simple_mercator_projector.rb +26 -25
- data/lib/rgeo/geographic/spherical_feature_classes.rb +29 -9
- data/lib/rgeo/geographic/spherical_feature_methods.rb +86 -9
- data/lib/rgeo/geographic/spherical_math.rb +17 -20
- data/lib/rgeo/geographic.rb +1 -1
- data/lib/rgeo/geos/capi_factory.rb +87 -158
- data/lib/rgeo/geos/capi_feature_classes.rb +50 -36
- data/lib/rgeo/geos/ffi_factory.rb +105 -173
- data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
- data/lib/rgeo/geos/ffi_feature_methods.rb +105 -127
- data/lib/rgeo/geos/interface.rb +20 -59
- data/lib/rgeo/geos/utils.rb +5 -5
- data/lib/rgeo/geos/zm_factory.rb +53 -95
- data/lib/rgeo/geos/zm_feature_methods.rb +30 -33
- data/lib/rgeo/geos.rb +8 -8
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +9 -22
- data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -2
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +28 -56
- data/lib/rgeo/impl_helper/basic_point_methods.rb +2 -14
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +17 -26
- data/lib/rgeo/impl_helper/utils.rb +21 -0
- data/lib/rgeo/impl_helper/valid_op.rb +350 -0
- data/lib/rgeo/impl_helper/validity_check.rb +139 -0
- data/lib/rgeo/impl_helper.rb +1 -0
- data/lib/rgeo/version.rb +1 -1
- 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 +50 -13
- data/lib/rgeo/coord_sys/srs_database/entry.rb +0 -107
- data/lib/rgeo/coord_sys/srs_database/sr_org.rb +0 -64
- data/lib/rgeo/coord_sys/srs_database/url_reader.rb +0 -65
data/ext/geos_c_impl/factory.h
CHANGED
@@ -5,64 +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
|
-
/*
|
14
|
-
Per-interpreter globals.
|
15
|
-
Most of these are cached references to commonly used classes, modules,
|
16
|
-
and symbols so we don't have to do a lot of constant lookups and calls
|
17
|
-
to rb_intern.
|
18
|
-
*/
|
19
|
-
typedef struct {
|
20
|
-
VALUE feature_module;
|
21
|
-
VALUE feature_geometry;
|
22
|
-
VALUE feature_point;
|
23
|
-
VALUE feature_line_string;
|
24
|
-
VALUE feature_linear_ring;
|
25
|
-
VALUE feature_line;
|
26
|
-
VALUE feature_polygon;
|
27
|
-
VALUE feature_geometry_collection;
|
28
|
-
VALUE feature_multi_point;
|
29
|
-
VALUE feature_multi_line_string;
|
30
|
-
VALUE feature_multi_polygon;
|
31
|
-
VALUE geos_module;
|
32
|
-
VALUE geos_geometry;
|
33
|
-
VALUE geos_point;
|
34
|
-
VALUE geos_line_string;
|
35
|
-
VALUE geos_linear_ring;
|
36
|
-
VALUE geos_line;
|
37
|
-
VALUE geos_polygon;
|
38
|
-
VALUE geos_geometry_collection;
|
39
|
-
VALUE geos_multi_point;
|
40
|
-
VALUE geos_multi_line_string;
|
41
|
-
VALUE geos_multi_polygon;
|
42
|
-
ID id_cast;
|
43
|
-
ID id_eql;
|
44
|
-
ID id_generate;
|
45
|
-
ID id_enum_for;
|
46
|
-
ID id_hash;
|
47
|
-
VALUE sym_force_new;
|
48
|
-
VALUE sym_keep_subtype;
|
49
|
-
#ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
|
50
|
-
VALUE psych_wkt_generator;
|
51
|
-
VALUE marshal_wkb_generator;
|
52
|
-
#endif
|
53
|
-
} RGeo_Globals;
|
54
|
-
|
55
|
-
|
56
13
|
/*
|
57
14
|
Wrapped structure for Factory objects.
|
58
|
-
A factory encapsulates
|
15
|
+
A factory encapsulates GEOS serializer settings.
|
59
16
|
It also stores the SRID for all geometries created by this factory,
|
60
17
|
and the resolution for buffers created for this factory's geometries.
|
61
|
-
Finally, it provides easy access to the globals.
|
62
18
|
*/
|
63
|
-
typedef struct
|
64
|
-
|
65
|
-
GEOSContextHandle_t geos_context;
|
19
|
+
typedef struct
|
20
|
+
{
|
66
21
|
GEOSWKTReader* wkt_reader;
|
67
22
|
GEOSWKBReader* wkb_reader;
|
68
23
|
GEOSWKTWriter* wkt_writer;
|
@@ -75,19 +30,46 @@ typedef struct {
|
|
75
30
|
GEOSWKBReader* marshal_wkb_reader;
|
76
31
|
GEOSWKTWriter* psych_wkt_writer;
|
77
32
|
GEOSWKBWriter* marshal_wkb_writer;
|
78
|
-
VALUE proj4_obj;
|
79
33
|
VALUE coord_sys_obj;
|
80
34
|
int flags;
|
81
35
|
int srid;
|
82
36
|
int buffer_resolution;
|
83
37
|
} RGeo_FactoryData;
|
84
38
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
39
|
+
/*
|
40
|
+
Flags that are used to pass options when creating a factory.
|
41
|
+
They are available in ruby under RGeo::Geos::CAPIFactory::FLAG_name
|
42
|
+
where name is the name below without the RGEO_FACTORYFLAGS_ prefix.
|
43
|
+
*/
|
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
|
+
|
50
|
+
/* call-seq:
|
51
|
+
* RGeo::Geos::CAPIFactory.supports_z? -> true or false
|
52
|
+
*/
|
53
|
+
VALUE
|
54
|
+
method_factory_supports_z_p(VALUE self);
|
55
|
+
|
56
|
+
/* call-seq:
|
57
|
+
* RGeo::Geos::CAPIFactory.supports_m? -> true or false
|
58
|
+
*/
|
59
|
+
VALUE
|
60
|
+
method_factory_supports_m_p(VALUE self);
|
61
|
+
|
62
|
+
/* call-seq:
|
63
|
+
* RGeo::Geos::CAPIFactory.supports_z_or_m? -> true or false
|
64
|
+
*/
|
65
|
+
VALUE
|
66
|
+
method_factory_supports_z_or_m_p(VALUE self);
|
67
|
+
|
68
|
+
/* call-seq:
|
69
|
+
* RGeo::Geos::CAPIFactory.prepare_heuristic? -> true or false
|
70
|
+
*/
|
71
|
+
VALUE
|
72
|
+
method_factory_prepare_heuristic_p(VALUE self);
|
91
73
|
|
92
74
|
/*
|
93
75
|
Wrapped structure for Geometry objects.
|
@@ -102,35 +84,44 @@ typedef struct {
|
|
102
84
|
in Line objects, which have no GEOS type). Any array element, or the
|
103
85
|
array itself, could be Qnil, indicating fall back to the default
|
104
86
|
inferred from the GEOS type.
|
105
|
-
|
106
|
-
The GEOS context handle is also included here. Ideally, it would be
|
107
|
-
available by following the factory reference and getting it from the
|
108
|
-
factory data. However, one use case is in the destroy_geometry_func
|
109
|
-
in factory.c, and Rubinius 1.1.1 seems to crash when you try to
|
110
|
-
evaluate a DATA_PTR from that function, so we copy the context handle
|
111
|
-
here so the destroy_geometry_func can get to it.
|
112
87
|
*/
|
113
|
-
typedef struct
|
114
|
-
|
88
|
+
typedef struct
|
89
|
+
{
|
115
90
|
GEOSGeometry* geom;
|
116
91
|
const GEOSPreparedGeometry* prep;
|
117
92
|
VALUE factory;
|
118
93
|
VALUE klasses;
|
119
94
|
} RGeo_GeometryData;
|
120
95
|
|
96
|
+
// Data types which indicate how RGeo types should be managed by Ruby.
|
97
|
+
extern const rb_data_type_t rgeo_factory_type;
|
98
|
+
|
99
|
+
extern const rb_data_type_t rgeo_geometry_type;
|
100
|
+
|
101
|
+
// Convenient macros for checking the type of data from Ruby
|
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))
|
106
|
+
|
107
|
+
#define _RGEO_TYPEDDATA_P(object, data_type) \
|
108
|
+
(TYPE(object) == T_DATA && RTYPEDDATA(object)->typed_flag == 1 && \
|
109
|
+
RTYPEDDATA(object)->type == data_type)
|
121
110
|
|
122
111
|
// Returns the RGeo_FactoryData* given a ruby Factory object
|
123
|
-
#define RGEO_FACTORY_DATA_PTR(factory)
|
112
|
+
#define RGEO_FACTORY_DATA_PTR(factory) \
|
113
|
+
((RGeo_FactoryData*)RTYPEDDATA_DATA(factory))
|
124
114
|
|
125
115
|
// Returns the RGeo_GeometryData* given a ruby Geometry object
|
126
|
-
#define RGEO_GEOMETRY_DATA_PTR(geometry)
|
127
|
-
|
116
|
+
#define RGEO_GEOMETRY_DATA_PTR(geometry) \
|
117
|
+
((RGeo_GeometryData*)RTYPEDDATA_DATA(geometry))
|
128
118
|
|
129
119
|
/*
|
130
120
|
Initializes the factory module. This should be called first in the
|
131
121
|
initialization process.
|
132
122
|
*/
|
133
|
-
|
123
|
+
void
|
124
|
+
rgeo_init_geos_factory();
|
134
125
|
|
135
126
|
/*
|
136
127
|
Given a GEOS geometry handle, wraps it in a ruby Geometry object of the
|
@@ -144,13 +135,17 @@ RGeo_Globals* rgeo_init_geos_factory();
|
|
144
135
|
classes for the elements of the collection.
|
145
136
|
Returns Qnil if the wrapping failed for any reason.
|
146
137
|
*/
|
147
|
-
VALUE
|
138
|
+
VALUE
|
139
|
+
rgeo_wrap_geos_geometry(VALUE factory, GEOSGeometry* geom, VALUE klass);
|
148
140
|
|
149
141
|
/*
|
150
142
|
Same as rgeo_wrap_geos_geometry except that it wraps a clone of the
|
151
143
|
given geom, so the original geom doesn't change ownership.
|
152
144
|
*/
|
153
|
-
VALUE
|
145
|
+
VALUE
|
146
|
+
rgeo_wrap_geos_geometry_clone(VALUE factory,
|
147
|
+
const GEOSGeometry* geom,
|
148
|
+
VALUE klass);
|
154
149
|
|
155
150
|
/*
|
156
151
|
Gets the GEOS geometry for a given ruby Geometry object. If the given
|
@@ -159,8 +154,18 @@ VALUE rgeo_wrap_geos_geometry_clone(VALUE factory, const GEOSGeometry* geom, VAL
|
|
159
154
|
specified by an appropriate feature module. Passing Qnil for the type
|
160
155
|
disables this auto-cast. The returned GEOS geometry is owned by rgeo,
|
161
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.
|
162
166
|
*/
|
163
|
-
const GEOSGeometry*
|
167
|
+
const GEOSGeometry*
|
168
|
+
rgeo_convert_to_geos_geometry(VALUE factory, VALUE obj, VALUE type, int* state);
|
164
169
|
|
165
170
|
/*
|
166
171
|
Gets a GEOS geometry for a given ruby Geometry object. You must provide
|
@@ -177,50 +182,60 @@ const GEOSGeometry* rgeo_convert_to_geos_geometry(VALUE factory, VALUE obj, VALU
|
|
177
182
|
result of this function to build a GEOS-backed clone of the original
|
178
183
|
geometry, or to include the given geometry in a collection while keeping
|
179
184
|
the klasses intact.
|
185
|
+
|
186
|
+
The state parameter is given to follow `rb_protect*` ruby methods: this
|
187
|
+
method calls `#cast`, and this call may raise. if it does raise, state
|
188
|
+
will be set to a non-zero value, and you'll have access to the error
|
189
|
+
in `rb_errinfo()`. IT IS THE CALLER'S RESPONSIBILITY TO PROPAGATE THE
|
190
|
+
ERROR. You could also discard the error with `rb_set_errinfo(Qnil)`,
|
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.
|
180
194
|
*/
|
181
|
-
GEOSGeometry*
|
195
|
+
GEOSGeometry*
|
196
|
+
rgeo_convert_to_detached_geos_geometry(VALUE obj,
|
197
|
+
VALUE factory,
|
198
|
+
VALUE type,
|
199
|
+
VALUE* klasses,
|
200
|
+
int* state);
|
182
201
|
|
183
202
|
/*
|
184
203
|
Returns 1 if the given ruby object is a GEOS Geometry implementation,
|
185
204
|
or 0 if not.
|
186
205
|
*/
|
187
|
-
char
|
206
|
+
char
|
207
|
+
rgeo_is_geos_object(VALUE obj);
|
188
208
|
|
189
209
|
/*
|
190
210
|
Raises a rgeo error if the object is not a GEOS Geometry implementation.
|
191
211
|
*/
|
192
|
-
void
|
212
|
+
void
|
213
|
+
rgeo_check_geos_object(VALUE obj);
|
193
214
|
|
194
215
|
/*
|
195
216
|
Gets the underlying GEOS geometry for a given ruby object. Returns NULL
|
196
217
|
if the given ruby object is not a GEOS geometry wrapper.
|
197
218
|
*/
|
198
|
-
const GEOSGeometry*
|
199
|
-
|
200
|
-
/*
|
201
|
-
Compares the coordinate sequences for two given GEOS geometries.
|
202
|
-
The two given geometries MUST be of types backed directly by
|
203
|
-
coordinate sequences-- i.e. points or line strings.
|
204
|
-
Returns Qtrue if the two coordinate sequences are equal, Qfalse
|
205
|
-
if they are inequal, or Qnil if an error occurs.
|
206
|
-
*/
|
207
|
-
VALUE rgeo_geos_coordseqs_eql(GEOSContextHandle_t context, const GEOSGeometry* geom1, const GEOSGeometry* geom2, char check_z);
|
219
|
+
const GEOSGeometry*
|
220
|
+
rgeo_get_geos_geometry_safe(VALUE obj);
|
208
221
|
|
209
222
|
/*
|
210
223
|
Compares the ruby classes and geometry factories of the two given ruby
|
211
224
|
objects. Returns Qtrue if everything is equal (that is, the two objects
|
212
225
|
are of the same type and factory), or Qfalse otherwise.
|
213
226
|
*/
|
214
|
-
VALUE
|
227
|
+
VALUE
|
228
|
+
rgeo_geos_klasses_and_factories_eql(VALUE obj1, VALUE obj2);
|
215
229
|
|
216
230
|
/*
|
217
231
|
A tool for building up hash values.
|
218
|
-
You must pass
|
232
|
+
You must pass a geos geometry and a seed hash.
|
219
233
|
Returns an updated hash.
|
220
234
|
This call is useful in sequence, and should be bracketed by calls to
|
221
235
|
rb_hash_start and rb_hash_end.
|
222
236
|
*/
|
223
|
-
st_index_t
|
237
|
+
st_index_t
|
238
|
+
rgeo_geos_coordseq_hash(const GEOSGeometry* geom, st_index_t hash);
|
224
239
|
|
225
240
|
/*
|
226
241
|
A tool for building up hash values.
|
@@ -229,13 +244,8 @@ st_index_t rgeo_geos_coordseq_hash(GEOSContextHandle_t context, const GEOSGeomet
|
|
229
244
|
This call is useful in sequence, and should be bracketed by calls to
|
230
245
|
rb_hash_start and rb_hash_end.
|
231
246
|
*/
|
232
|
-
st_index_t
|
233
|
-
|
234
|
-
/*
|
235
|
-
Internal tool for creating simple (FNV-1A 32 bit) hashes.
|
236
|
-
*/
|
237
|
-
st_index_t rgeo_internal_memhash(const void* ptr, long len);
|
238
|
-
|
247
|
+
st_index_t
|
248
|
+
rgeo_geos_objbase_hash(VALUE factory, VALUE type_module, st_index_t hash);
|
239
249
|
|
240
250
|
RGEO_END_C
|
241
251
|
|