rgeo 2.4.0 → 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/.yardopts +6 -0
- data/README.md +21 -11
- data/ext/geos_c_impl/analysis.c +29 -26
- 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 +19 -10
- data/ext/geos_c_impl/errors.h +11 -4
- data/ext/geos_c_impl/extconf.rb +41 -29
- data/ext/geos_c_impl/factory.c +441 -351
- data/ext/geos_c_impl/factory.h +98 -55
- data/ext/geos_c_impl/geometry.c +563 -384
- data/ext/geos_c_impl/geometry.h +10 -3
- data/ext/geos_c_impl/geometry_collection.c +288 -316
- data/ext/geos_c_impl/geometry_collection.h +6 -18
- 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 +263 -222
- 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 +134 -132
- data/ext/geos_c_impl/polygon.h +11 -9
- data/ext/geos_c_impl/preface.h +10 -12
- 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 +299 -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 +73 -83
- data/lib/rgeo/geographic/factory.rb +98 -125
- data/lib/rgeo/geographic/interface.rb +66 -163
- 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 +24 -23
- 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 +95 -165
- data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
- data/lib/rgeo/geos/ffi_feature_methods.rb +105 -126
- data/lib/rgeo/geos/interface.rb +20 -59
- data/lib/rgeo/geos/utils.rb +3 -3
- data/lib/rgeo/geos/zm_factory.rb +53 -95
- data/lib/rgeo/geos/zm_feature_methods.rb +30 -32
- 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 +51 -16
- 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,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,19 +30,46 @@ 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;
|
37
36
|
int buffer_resolution;
|
38
37
|
} RGeo_FactoryData;
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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);
|
46
73
|
|
47
74
|
/*
|
48
75
|
Wrapped structure for Geometry objects.
|
@@ -57,47 +84,44 @@ typedef struct {
|
|
57
84
|
in Line objects, which have no GEOS type). Any array element, or the
|
58
85
|
array itself, could be Qnil, indicating fall back to the default
|
59
86
|
inferred from the GEOS type.
|
60
|
-
|
61
|
-
The GEOS context handle is also included here. Ideally, it would be
|
62
|
-
available by following the factory reference and getting it from the
|
63
|
-
factory data. However, one use case is in the destroy_geometry_func
|
64
|
-
in factory.c, and Rubinius 1.1.1 seems to crash when you try to
|
65
|
-
evaluate a DATA_PTR from that function, so we copy the context handle
|
66
|
-
here so the destroy_geometry_func can get to it.
|
67
87
|
*/
|
68
|
-
typedef struct
|
69
|
-
|
88
|
+
typedef struct
|
89
|
+
{
|
70
90
|
GEOSGeometry* geom;
|
71
91
|
const GEOSPreparedGeometry* prep;
|
72
92
|
VALUE factory;
|
73
93
|
VALUE klasses;
|
74
94
|
} RGeo_GeometryData;
|
75
95
|
|
76
|
-
|
77
96
|
// Data types which indicate how RGeo types should be managed by Ruby.
|
78
97
|
extern const rb_data_type_t rgeo_factory_type;
|
79
98
|
|
80
99
|
extern const rb_data_type_t rgeo_geometry_type;
|
81
100
|
|
82
|
-
|
83
101
|
// Convenient macros for checking the type of data from Ruby
|
84
|
-
#define RGEO_FACTORY_TYPEDDATA_P(object)
|
85
|
-
|
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))
|
86
106
|
|
87
|
-
#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)
|
88
110
|
|
89
111
|
// Returns the RGeo_FactoryData* given a ruby Factory object
|
90
|
-
#define RGEO_FACTORY_DATA_PTR(factory)
|
112
|
+
#define RGEO_FACTORY_DATA_PTR(factory) \
|
113
|
+
((RGeo_FactoryData*)RTYPEDDATA_DATA(factory))
|
91
114
|
|
92
115
|
// Returns the RGeo_GeometryData* given a ruby Geometry object
|
93
|
-
#define RGEO_GEOMETRY_DATA_PTR(geometry)
|
94
|
-
|
116
|
+
#define RGEO_GEOMETRY_DATA_PTR(geometry) \
|
117
|
+
((RGeo_GeometryData*)RTYPEDDATA_DATA(geometry))
|
95
118
|
|
96
119
|
/*
|
97
120
|
Initializes the factory module. This should be called first in the
|
98
121
|
initialization process.
|
99
122
|
*/
|
100
|
-
void
|
123
|
+
void
|
124
|
+
rgeo_init_geos_factory();
|
101
125
|
|
102
126
|
/*
|
103
127
|
Given a GEOS geometry handle, wraps it in a ruby Geometry object of the
|
@@ -111,13 +135,17 @@ void rgeo_init_geos_factory();
|
|
111
135
|
classes for the elements of the collection.
|
112
136
|
Returns Qnil if the wrapping failed for any reason.
|
113
137
|
*/
|
114
|
-
VALUE
|
138
|
+
VALUE
|
139
|
+
rgeo_wrap_geos_geometry(VALUE factory, GEOSGeometry* geom, VALUE klass);
|
115
140
|
|
116
141
|
/*
|
117
142
|
Same as rgeo_wrap_geos_geometry except that it wraps a clone of the
|
118
143
|
given geom, so the original geom doesn't change ownership.
|
119
144
|
*/
|
120
|
-
VALUE
|
145
|
+
VALUE
|
146
|
+
rgeo_wrap_geos_geometry_clone(VALUE factory,
|
147
|
+
const GEOSGeometry* geom,
|
148
|
+
VALUE klass);
|
121
149
|
|
122
150
|
/*
|
123
151
|
Gets the GEOS geometry for a given ruby Geometry object. If the given
|
@@ -126,8 +154,18 @@ VALUE rgeo_wrap_geos_geometry_clone(VALUE factory, const GEOSGeometry* geom, VAL
|
|
126
154
|
specified by an appropriate feature module. Passing Qnil for the type
|
127
155
|
disables this auto-cast. The returned GEOS geometry is owned by rgeo,
|
128
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.
|
129
166
|
*/
|
130
|
-
const GEOSGeometry*
|
167
|
+
const GEOSGeometry*
|
168
|
+
rgeo_convert_to_geos_geometry(VALUE factory, VALUE obj, VALUE type, int* state);
|
131
169
|
|
132
170
|
/*
|
133
171
|
Gets a GEOS geometry for a given ruby Geometry object. You must provide
|
@@ -144,50 +182,60 @@ const GEOSGeometry* rgeo_convert_to_geos_geometry(VALUE factory, VALUE obj, VALU
|
|
144
182
|
result of this function to build a GEOS-backed clone of the original
|
145
183
|
geometry, or to include the given geometry in a collection while keeping
|
146
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.
|
147
194
|
*/
|
148
|
-
GEOSGeometry*
|
195
|
+
GEOSGeometry*
|
196
|
+
rgeo_convert_to_detached_geos_geometry(VALUE obj,
|
197
|
+
VALUE factory,
|
198
|
+
VALUE type,
|
199
|
+
VALUE* klasses,
|
200
|
+
int* state);
|
149
201
|
|
150
202
|
/*
|
151
203
|
Returns 1 if the given ruby object is a GEOS Geometry implementation,
|
152
204
|
or 0 if not.
|
153
205
|
*/
|
154
|
-
char
|
206
|
+
char
|
207
|
+
rgeo_is_geos_object(VALUE obj);
|
155
208
|
|
156
209
|
/*
|
157
210
|
Raises a rgeo error if the object is not a GEOS Geometry implementation.
|
158
211
|
*/
|
159
|
-
void
|
212
|
+
void
|
213
|
+
rgeo_check_geos_object(VALUE obj);
|
160
214
|
|
161
215
|
/*
|
162
216
|
Gets the underlying GEOS geometry for a given ruby object. Returns NULL
|
163
217
|
if the given ruby object is not a GEOS geometry wrapper.
|
164
218
|
*/
|
165
|
-
const GEOSGeometry*
|
166
|
-
|
167
|
-
/*
|
168
|
-
Compares the coordinate sequences for two given GEOS geometries.
|
169
|
-
The two given geometries MUST be of types backed directly by
|
170
|
-
coordinate sequences-- i.e. points or line strings.
|
171
|
-
Returns Qtrue if the two coordinate sequences are equal, Qfalse
|
172
|
-
if they are inequal, or Qnil if an error occurs.
|
173
|
-
*/
|
174
|
-
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);
|
175
221
|
|
176
222
|
/*
|
177
223
|
Compares the ruby classes and geometry factories of the two given ruby
|
178
224
|
objects. Returns Qtrue if everything is equal (that is, the two objects
|
179
225
|
are of the same type and factory), or Qfalse otherwise.
|
180
226
|
*/
|
181
|
-
VALUE
|
227
|
+
VALUE
|
228
|
+
rgeo_geos_klasses_and_factories_eql(VALUE obj1, VALUE obj2);
|
182
229
|
|
183
230
|
/*
|
184
231
|
A tool for building up hash values.
|
185
|
-
You must pass
|
232
|
+
You must pass a geos geometry and a seed hash.
|
186
233
|
Returns an updated hash.
|
187
234
|
This call is useful in sequence, and should be bracketed by calls to
|
188
235
|
rb_hash_start and rb_hash_end.
|
189
236
|
*/
|
190
|
-
st_index_t
|
237
|
+
st_index_t
|
238
|
+
rgeo_geos_coordseq_hash(const GEOSGeometry* geom, st_index_t hash);
|
191
239
|
|
192
240
|
/*
|
193
241
|
A tool for building up hash values.
|
@@ -196,13 +244,8 @@ st_index_t rgeo_geos_coordseq_hash(GEOSContextHandle_t context, const GEOSGeomet
|
|
196
244
|
This call is useful in sequence, and should be bracketed by calls to
|
197
245
|
rb_hash_start and rb_hash_end.
|
198
246
|
*/
|
199
|
-
st_index_t
|
200
|
-
|
201
|
-
/*
|
202
|
-
Internal tool for creating simple (FNV-1A 32 bit) hashes.
|
203
|
-
*/
|
204
|
-
st_index_t rgeo_internal_memhash(const void* ptr, long len);
|
205
|
-
|
247
|
+
st_index_t
|
248
|
+
rgeo_geos_objbase_hash(VALUE factory, VALUE type_module, st_index_t hash);
|
206
249
|
|
207
250
|
RGEO_END_C
|
208
251
|
|