rgeo 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +9 -0
- data/README.rdoc +19 -7
- data/Version +1 -1
- data/ext/geos_c_impl/extconf.rb +4 -0
- data/ext/geos_c_impl/factory.c +15 -2
- data/ext/geos_c_impl/factory.h +3 -1
- data/ext/geos_c_impl/geometry.c +129 -13
- data/ext/geos_c_impl/preface.h +7 -0
- data/ext/proj4_c_impl/extconf.rb +2 -0
- data/ext/proj4_c_impl/main.c +33 -1
- data/lib/rgeo.rb +1 -0
- data/lib/rgeo/cartesian/bounding_box.rb +5 -3
- data/lib/rgeo/cartesian/factory.rb +89 -0
- data/lib/rgeo/coord_sys/cs/entities.rb +37 -0
- data/lib/rgeo/coord_sys/proj4.rb +40 -0
- data/lib/rgeo/geos/factory.rb +3 -0
- data/lib/rgeo/geos/interface.rb +11 -2
- data/lib/rgeo/wkrep/wkb_generator.rb +10 -0
- data/lib/rgeo/wkrep/wkb_parser.rb +8 -4
- data/lib/rgeo/wkrep/wkt_generator.rb +12 -1
- data/lib/rgeo/wkrep/wkt_parser.rb +11 -0
- data/lib/rgeo/yaml.rb +59 -0
- data/test/coord_sys/tc_ogc_cs.rb +28 -0
- data/test/coord_sys/tc_proj4.rb +78 -23
- data/test/geos_capi/tc_misc.rb +33 -0
- metadata +25 -26
data/History.rdoc
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
=== 0.3.2 / 2011-08-11
|
2
|
+
|
3
|
+
* Some objects can now be serialized and deserialized via Marshal or YAML. Supported objects include OGC coordinate systems, Proj4 coordinate systems, and WKRep parsers/generators. Factories and geometries will be supported shortly.
|
4
|
+
* The GEOS CAPI implementation can now use prepared geometries to speed up certain operations. The GEOS FFI implementation will do the same shortly.
|
5
|
+
* Calling dup on a Proj4 object caused a segfault. Fixed.
|
6
|
+
* Fixed an exception in RGeo::Cartesian::BoundingBox#to_geometry. (Thanks to Travis Dempsey.)
|
7
|
+
* WKTGenerator generated incorrect tag names for subtypes of LineString. Fixed.
|
8
|
+
* Installation automatically finds the KyngChaos GEOS and Proj4 frameworks for Mac OS X. (Thanks to benchi.)
|
9
|
+
|
1
10
|
=== 0.3.1 / 2011-05-24
|
2
11
|
|
3
12
|
* Running a == operator comparison between a geometry and a non-geometry caused an exception for some implementations. Fixed. (Reported by Daniel Hackney.)
|
data/README.rdoc
CHANGED
@@ -39,15 +39,18 @@ Several optional modules are currently available:
|
|
39
39
|
* <b>activerecord-postgis-adapter</b>
|
40
40
|
* and more to come...
|
41
41
|
|
42
|
+
Need help? Join the rgeo-users google group at:
|
43
|
+
http://groups.google.com/group/rgeo-users
|
44
|
+
|
42
45
|
=== Dependencies
|
43
46
|
|
44
47
|
RGeo is known to work with the following Ruby implementations:
|
45
48
|
|
46
49
|
* Standard "MRI" Ruby 1.8.7 or later. (1.9.2 or later preferred.)
|
47
50
|
* Rubinius 1.1 or later.
|
48
|
-
* Partial support for JRuby 1.
|
49
|
-
|
50
|
-
|
51
|
+
* Partial support for JRuby 1.6.3 or later. The FFI implementation of
|
52
|
+
GEOS is available (ffi-geos gem is required) but CAPI is not.
|
53
|
+
Proj4 support is expected in the future.
|
51
54
|
|
52
55
|
Some features also require the following:
|
53
56
|
|
@@ -71,7 +74,10 @@ Install RGeo as a gem:
|
|
71
74
|
|
72
75
|
Note: By default, the gem installation looks for the GEOS library in the
|
73
76
|
following locations: <tt>/usr/local</tt>, <tt>/usr/local/geos</tt>,
|
74
|
-
<tt>/opt/local</tt>, <tt>/opt/geos</tt>, <tt>/opt</tt>, <tt>/usr</tt
|
77
|
+
<tt>/opt/local</tt>, <tt>/opt/geos</tt>, <tt>/opt</tt>, <tt>/usr</tt>,
|
78
|
+
and <tt>/Library/Frameworks/GEOS.framework/unix</tt>. In other words,
|
79
|
+
MacPorts, Homebrew, the Kyngchaos port, and building from source to
|
80
|
+
/usr/local are supported out of the box.
|
75
81
|
|
76
82
|
If GEOS has been installed in a different location, you must provide its
|
77
83
|
installation prefix directory using the "--with-geos-dir" option. This
|
@@ -83,7 +89,8 @@ switch, from the switches interpreted by the gem command. For example:
|
|
83
89
|
Similarly, the gem installation looks for the Proj4 library in the
|
84
90
|
following locations by default: <tt>/usr/local</tt>,
|
85
91
|
<tt>/usr/local/proj</tt>, <tt>/usr/local/proj4</tt>, <tt>/opt/local</tt>,
|
86
|
-
<tt>/opt/proj</tt>, <tt>/opt/proj4</tt>, <tt>/opt</tt>, <tt>/usr</tt
|
92
|
+
<tt>/opt/proj</tt>, <tt>/opt/proj4</tt>, <tt>/opt</tt>, <tt>/usr</tt>,
|
93
|
+
and <tt>/Library/Frameworks/PROJ.framework/unix</tt>.
|
87
94
|
|
88
95
|
If Proj4 is installed in a different location, you must provide its
|
89
96
|
installation prefix directory using the "--with-proj-dir" option.
|
@@ -93,7 +100,7 @@ installation prefix directory using the "--with-proj-dir" option.
|
|
93
100
|
The RGeo suite of tools is evolving rapidly. The current to-do list for
|
94
101
|
the core library includes:
|
95
102
|
|
96
|
-
* YAML and Marshal serialization support.
|
103
|
+
* YAML and Marshal serialization support across all major entities.
|
97
104
|
* Better JRuby support.
|
98
105
|
* Ellipsoidal geography implementation, possibly utilizing geographiclib.
|
99
106
|
* Windows build support.
|
@@ -102,7 +109,7 @@ Each of the current add-on modules also has its own feature roadmap, and
|
|
102
109
|
we are planning on introducing more add-on modules, including:
|
103
110
|
|
104
111
|
* GeoRSS and KML format support.
|
105
|
-
* Integration with
|
112
|
+
* Integration with third-party APIs.
|
106
113
|
* Possible additional ActiveRecord adapters.
|
107
114
|
|
108
115
|
=== Development and support
|
@@ -115,6 +122,8 @@ Contributions are welcome. Fork the project on Github.
|
|
115
122
|
|
116
123
|
Report bugs on Github issues at http://github.org/dazuma/rgeo/issues
|
117
124
|
|
125
|
+
Support available on the rgeo-users google group at http://groups.google.com/group/rgeo-users
|
126
|
+
|
118
127
|
Contact the author at dazuma at gmail dot com.
|
119
128
|
|
120
129
|
=== Acknowledgments
|
@@ -129,6 +138,9 @@ transformations. These libraries are maintained by the Open Source
|
|
129
138
|
Geospatial Foundation; more information is available on OSGeo's web site
|
130
139
|
(http://www.osgeo.org).
|
131
140
|
|
141
|
+
JRuby support is made possible by the ffi-geos (and upcoming ffi-proj4)
|
142
|
+
gems, by J Smith (http://github.com/dark-panda).
|
143
|
+
|
132
144
|
=== License
|
133
145
|
|
134
146
|
Copyright 2010-2011 Daniel Azuma
|
data/Version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/ext/geos_c_impl/extconf.rb
CHANGED
@@ -49,6 +49,7 @@ else
|
|
49
49
|
'/opt/local/include',
|
50
50
|
'/opt/geos/include',
|
51
51
|
'/opt/include',
|
52
|
+
'/Library/Frameworks/GEOS.framework/unix/include',
|
52
53
|
::Config::CONFIG['includedir'],
|
53
54
|
'/usr/include',
|
54
55
|
]
|
@@ -59,6 +60,7 @@ else
|
|
59
60
|
'/opt/local/lib',
|
60
61
|
'/opt/geos/lib',
|
61
62
|
'/opt/lib',
|
63
|
+
'/Library/Frameworks/GEOS.framework/unix/lib',
|
62
64
|
::Config::CONFIG['libdir'],
|
63
65
|
'/usr/lib',
|
64
66
|
]
|
@@ -74,6 +76,8 @@ else
|
|
74
76
|
else
|
75
77
|
$libs.gsub!(' -lgeos -lgeos_c', '')
|
76
78
|
end
|
79
|
+
have_func('GEOSPreparedContains_r', 'geos_c.h')
|
80
|
+
have_func('GEOSPreparedDisjoint_r', 'geos_c.h')
|
77
81
|
end
|
78
82
|
unless found_geos_
|
79
83
|
puts "**** WARNING: Unable to find GEOS headers or GEOS version is too old."
|
data/ext/geos_c_impl/factory.c
CHANGED
@@ -95,6 +95,12 @@ static void destroy_geometry_func(RGeo_GeometryData* data)
|
|
95
95
|
if (data->geom) {
|
96
96
|
GEOSGeom_destroy_r(data->geos_context, data->geom);
|
97
97
|
}
|
98
|
+
const GEOSPreparedGeometry* prep = data->prep;
|
99
|
+
if (prep && prep != (const GEOSPreparedGeometry*)1 && prep != (const GEOSPreparedGeometry*)2 &&
|
100
|
+
prep != (const GEOSPreparedGeometry*)3)
|
101
|
+
{
|
102
|
+
GEOSPreparedGeom_destroy_r(data->geos_context, prep);
|
103
|
+
}
|
98
104
|
free(data);
|
99
105
|
}
|
100
106
|
|
@@ -323,8 +329,10 @@ VALUE rgeo_wrap_geos_geometry(VALUE factory, GEOSGeometry* geom, VALUE klass)
|
|
323
329
|
if (geom) {
|
324
330
|
GEOSSetSRID_r(factory_context, geom, factory_data->srid);
|
325
331
|
}
|
326
|
-
data->geom = geom;
|
327
332
|
data->geos_context = factory_context;
|
333
|
+
data->geom = geom;
|
334
|
+
data->prep = factory_data && ((factory_data->flags & RGEO_FACTORYFLAGS_PREPARE_HEURISTIC) != 0) ?
|
335
|
+
(GEOSPreparedGeometry*)1 : NULL;
|
328
336
|
data->factory = factory;
|
329
337
|
data->klasses = klasses;
|
330
338
|
result = Data_Wrap_Struct(klass, mark_geometry_func, destroy_geometry_func, data);
|
@@ -380,8 +388,13 @@ GEOSGeometry* rgeo_convert_to_detached_geos_geometry(VALUE obj, VALUE factory, V
|
|
380
388
|
*klasses = CLASS_OF(object);
|
381
389
|
}
|
382
390
|
}
|
383
|
-
|
391
|
+
const GEOSPreparedGeometry* prep = object_data->prep;
|
392
|
+
if (prep && prep != (GEOSPreparedGeometry*)1 && prep != (GEOSPreparedGeometry*)2) {
|
393
|
+
GEOSPreparedGeom_destroy_r(object_data->geos_context, prep);
|
394
|
+
}
|
384
395
|
object_data->geos_context = NULL;
|
396
|
+
object_data->geom = NULL;
|
397
|
+
object_data->prep = NULL;
|
385
398
|
object_data->factory = Qnil;
|
386
399
|
object_data->klasses = Qnil;
|
387
400
|
}
|
data/ext/geos_c_impl/factory.h
CHANGED
@@ -101,6 +101,7 @@ typedef struct {
|
|
101
101
|
#define RGEO_FACTORYFLAGS_SUPPORTS_Z 2
|
102
102
|
#define RGEO_FACTORYFLAGS_SUPPORTS_M 4
|
103
103
|
#define RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M 6
|
104
|
+
#define RGEO_FACTORYFLAGS_PREPARE_HEURISTIC 8
|
104
105
|
|
105
106
|
|
106
107
|
/*
|
@@ -125,8 +126,9 @@ typedef struct {
|
|
125
126
|
here so the destroy_geometry_func can get to it.
|
126
127
|
*/
|
127
128
|
typedef struct {
|
128
|
-
GEOSGeometry* geom;
|
129
129
|
GEOSContextHandle_t geos_context;
|
130
|
+
GEOSGeometry* geom;
|
131
|
+
const GEOSPreparedGeometry* prep;
|
130
132
|
VALUE factory;
|
131
133
|
VALUE klasses;
|
132
134
|
} RGeo_GeometryData;
|
data/ext/geos_c_impl/geometry.c
CHANGED
@@ -101,6 +101,36 @@ static int compute_dimension(GEOSContextHandle_t context, const GEOSGeometry* ge
|
|
101
101
|
}
|
102
102
|
|
103
103
|
|
104
|
+
// Returns a prepared geometry, honoring the preparation policy.
|
105
|
+
|
106
|
+
static const GEOSPreparedGeometry* rgeo_request_prepared_geometry(RGeo_GeometryData* object_data)
|
107
|
+
{
|
108
|
+
const GEOSPreparedGeometry* prep = object_data->prep;
|
109
|
+
if (prep == (const GEOSPreparedGeometry*)1) {
|
110
|
+
object_data->prep = (GEOSPreparedGeometry*)2;
|
111
|
+
prep = NULL;
|
112
|
+
}
|
113
|
+
else if (prep == (const GEOSPreparedGeometry*)2) {
|
114
|
+
if (object_data->geom) {
|
115
|
+
prep = GEOSPrepare_r(object_data->geos_context, object_data->geom);
|
116
|
+
}
|
117
|
+
else {
|
118
|
+
prep = NULL;
|
119
|
+
}
|
120
|
+
if (prep) {
|
121
|
+
object_data->prep = prep;
|
122
|
+
}
|
123
|
+
else {
|
124
|
+
object_data->prep = (const GEOSPreparedGeometry*)3;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
else if (prep == (const GEOSPreparedGeometry*)3) {
|
128
|
+
prep = NULL;
|
129
|
+
}
|
130
|
+
return prep;
|
131
|
+
}
|
132
|
+
|
133
|
+
|
104
134
|
/**** RUBY METHOD DEFINITIONS ****/
|
105
135
|
|
106
136
|
|
@@ -123,6 +153,34 @@ static VALUE method_geometry_set_factory(VALUE self, VALUE factory)
|
|
123
153
|
}
|
124
154
|
|
125
155
|
|
156
|
+
static VALUE method_geometry_prepared_p(VALUE self)
|
157
|
+
{
|
158
|
+
const GEOSPreparedGeometry* prep = RGEO_GEOMETRY_DATA_PTR(self)->prep;
|
159
|
+
return (prep && prep != (const GEOSPreparedGeometry*)1 &&
|
160
|
+
prep != (const GEOSPreparedGeometry*)2 &&
|
161
|
+
prep != (GEOSPreparedGeometry*)3) ? Qtrue : Qfalse;
|
162
|
+
}
|
163
|
+
|
164
|
+
|
165
|
+
static VALUE method_geometry_prepare(VALUE self)
|
166
|
+
{
|
167
|
+
RGeo_GeometryData* self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
168
|
+
if (self_data->geom) {
|
169
|
+
const GEOSPreparedGeometry* prep = self_data->prep;
|
170
|
+
if (!prep || prep == (const GEOSPreparedGeometry*)1 || prep == (const GEOSPreparedGeometry*)2) {
|
171
|
+
const GEOSPreparedGeometry* prep = GEOSPrepare_r(self_data->geos_context, self_data->geom);
|
172
|
+
if (prep) {
|
173
|
+
self_data->prep = prep;
|
174
|
+
}
|
175
|
+
else {
|
176
|
+
self_data->prep = (const GEOSPreparedGeometry*)3;
|
177
|
+
}
|
178
|
+
}
|
179
|
+
}
|
180
|
+
return self;
|
181
|
+
}
|
182
|
+
|
183
|
+
|
126
184
|
static VALUE method_geometry_dimension(VALUE self)
|
127
185
|
{
|
128
186
|
VALUE result = Qnil;
|
@@ -339,7 +397,14 @@ static VALUE method_geometry_disjoint(VALUE self, VALUE rhs)
|
|
339
397
|
if (self_geom) {
|
340
398
|
const GEOSGeometry* rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
|
341
399
|
if (rhs_geom) {
|
342
|
-
char val
|
400
|
+
char val;
|
401
|
+
#ifdef RGEO_GEOS_SUPPORTS_PREPARED2
|
402
|
+
const GEOSPreparedGeometry* prep = rgeo_request_prepared_geometry(self_data);
|
403
|
+
if (prep)
|
404
|
+
val = GEOSPreparedDisjoint_r(self_data->geos_context, prep, rhs_geom);
|
405
|
+
else
|
406
|
+
#endif
|
407
|
+
val = GEOSDisjoint_r(self_data->geos_context, self_geom, rhs_geom);
|
343
408
|
if (val == 0) {
|
344
409
|
result = Qfalse;
|
345
410
|
}
|
@@ -360,7 +425,14 @@ static VALUE method_geometry_intersects(VALUE self, VALUE rhs)
|
|
360
425
|
if (self_geom) {
|
361
426
|
const GEOSGeometry* rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
|
362
427
|
if (rhs_geom) {
|
363
|
-
char val
|
428
|
+
char val;
|
429
|
+
#ifdef RGEO_GEOS_SUPPORTS_PREPARED1
|
430
|
+
const GEOSPreparedGeometry* prep = rgeo_request_prepared_geometry(self_data);
|
431
|
+
if (prep)
|
432
|
+
val = GEOSPreparedIntersects_r(self_data->geos_context, prep, rhs_geom);
|
433
|
+
else
|
434
|
+
#endif
|
435
|
+
val = GEOSIntersects_r(self_data->geos_context, self_geom, rhs_geom);
|
364
436
|
if (val == 0) {
|
365
437
|
result = Qfalse;
|
366
438
|
}
|
@@ -381,7 +453,14 @@ static VALUE method_geometry_touches(VALUE self, VALUE rhs)
|
|
381
453
|
if (self_geom) {
|
382
454
|
const GEOSGeometry* rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
|
383
455
|
if (rhs_geom) {
|
384
|
-
char val
|
456
|
+
char val;
|
457
|
+
#ifdef RGEO_GEOS_SUPPORTS_PREPARED2
|
458
|
+
const GEOSPreparedGeometry* prep = rgeo_request_prepared_geometry(self_data);
|
459
|
+
if (prep)
|
460
|
+
val = GEOSPreparedTouches_r(self_data->geos_context, prep, rhs_geom);
|
461
|
+
else
|
462
|
+
#endif
|
463
|
+
val = GEOSTouches_r(self_data->geos_context, self_geom, rhs_geom);
|
385
464
|
if (val == 0) {
|
386
465
|
result = Qfalse;
|
387
466
|
}
|
@@ -402,7 +481,14 @@ static VALUE method_geometry_crosses(VALUE self, VALUE rhs)
|
|
402
481
|
if (self_geom) {
|
403
482
|
const GEOSGeometry* rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
|
404
483
|
if (rhs_geom) {
|
405
|
-
char val
|
484
|
+
char val;
|
485
|
+
#ifdef RGEO_GEOS_SUPPORTS_PREPARED2
|
486
|
+
const GEOSPreparedGeometry* prep = rgeo_request_prepared_geometry(self_data);
|
487
|
+
if (prep)
|
488
|
+
val = GEOSPreparedCrosses_r(self_data->geos_context, prep, rhs_geom);
|
489
|
+
else
|
490
|
+
#endif
|
491
|
+
val = GEOSCrosses_r(self_data->geos_context, self_geom, rhs_geom);
|
406
492
|
if (val == 0) {
|
407
493
|
result = Qfalse;
|
408
494
|
}
|
@@ -423,7 +509,14 @@ static VALUE method_geometry_within(VALUE self, VALUE rhs)
|
|
423
509
|
if (self_geom) {
|
424
510
|
const GEOSGeometry* rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
|
425
511
|
if (rhs_geom) {
|
426
|
-
char val
|
512
|
+
char val;
|
513
|
+
#ifdef RGEO_GEOS_SUPPORTS_PREPARED2
|
514
|
+
const GEOSPreparedGeometry* prep = rgeo_request_prepared_geometry(self_data);
|
515
|
+
if (prep)
|
516
|
+
val = GEOSPreparedWithin_r(self_data->geos_context, prep, rhs_geom);
|
517
|
+
else
|
518
|
+
#endif
|
519
|
+
val = GEOSWithin_r(self_data->geos_context, self_geom, rhs_geom);
|
427
520
|
if (val == 0) {
|
428
521
|
result = Qfalse;
|
429
522
|
}
|
@@ -444,7 +537,14 @@ static VALUE method_geometry_contains(VALUE self, VALUE rhs)
|
|
444
537
|
if (self_geom) {
|
445
538
|
const GEOSGeometry* rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
|
446
539
|
if (rhs_geom) {
|
447
|
-
char val
|
540
|
+
char val;
|
541
|
+
#ifdef RGEO_GEOS_SUPPORTS_PREPARED1
|
542
|
+
const GEOSPreparedGeometry* prep = rgeo_request_prepared_geometry(self_data);
|
543
|
+
if (prep)
|
544
|
+
val = GEOSPreparedContains_r(self_data->geos_context, prep, rhs_geom);
|
545
|
+
else
|
546
|
+
#endif
|
547
|
+
val = GEOSContains_r(self_data->geos_context, self_geom, rhs_geom);
|
448
548
|
if (val == 0) {
|
449
549
|
result = Qfalse;
|
450
550
|
}
|
@@ -465,7 +565,14 @@ static VALUE method_geometry_overlaps(VALUE self, VALUE rhs)
|
|
465
565
|
if (self_geom) {
|
466
566
|
const GEOSGeometry* rhs_geom = rgeo_convert_to_geos_geometry(self_data->factory, rhs, Qnil);
|
467
567
|
if (rhs_geom) {
|
468
|
-
char val
|
568
|
+
char val;
|
569
|
+
#ifdef RGEO_GEOS_SUPPORTS_PREPARED2
|
570
|
+
const GEOSPreparedGeometry* prep = rgeo_request_prepared_geometry(self_data);
|
571
|
+
if (prep)
|
572
|
+
val = GEOSPreparedOverlaps_r(self_data->geos_context, prep, rhs_geom);
|
573
|
+
else
|
574
|
+
#endif
|
575
|
+
val = GEOSOverlaps_r(self_data->geos_context, self_geom, rhs_geom);
|
469
576
|
if (val == 0) {
|
470
577
|
result = Qfalse;
|
471
578
|
}
|
@@ -617,14 +724,18 @@ static VALUE method_geometry_initialize_copy(VALUE self, VALUE orig)
|
|
617
724
|
{
|
618
725
|
// Clear out any existing value
|
619
726
|
RGeo_GeometryData* self_data = RGEO_GEOMETRY_DATA_PTR(self);
|
620
|
-
|
621
|
-
|
622
|
-
GEOSGeom_destroy_r(self_data->geos_context, self_geom);
|
727
|
+
if (self_data->geom) {
|
728
|
+
GEOSGeom_destroy_r(self_data->geos_context, self_data->geom);
|
623
729
|
self_data->geom = NULL;
|
624
|
-
self_data->geos_context = NULL;
|
625
|
-
self_data->factory = Qnil;
|
626
|
-
self_data->klasses = Qnil;
|
627
730
|
}
|
731
|
+
const GEOSPreparedGeometry* prep = self_data->prep;
|
732
|
+
if (prep && prep != (GEOSPreparedGeometry*)1 && prep != (GEOSPreparedGeometry*)2) {
|
733
|
+
GEOSPreparedGeom_destroy_r(self_data->geos_context, prep);
|
734
|
+
}
|
735
|
+
self_data->prep = NULL;
|
736
|
+
self_data->geos_context = NULL;
|
737
|
+
self_data->factory = Qnil;
|
738
|
+
self_data->klasses = Qnil;
|
628
739
|
|
629
740
|
// Copy value from orig
|
630
741
|
const GEOSGeometry* geom = rgeo_get_geos_geometry_safe(orig);
|
@@ -633,9 +744,12 @@ static VALUE method_geometry_initialize_copy(VALUE self, VALUE orig)
|
|
633
744
|
GEOSContextHandle_t orig_context = orig_data->geos_context;
|
634
745
|
GEOSGeometry* clone_geom = GEOSGeom_clone_r(orig_context, geom);
|
635
746
|
if (clone_geom) {
|
747
|
+
RGeo_FactoryData* factory_data = RGEO_FACTORY_DATA_PTR(orig_data->factory);
|
636
748
|
GEOSSetSRID_r(orig_context, clone_geom, GEOSGetSRID_r(orig_context, geom));
|
637
749
|
self_data->geom = clone_geom;
|
638
750
|
self_data->geos_context = orig_context;
|
751
|
+
self_data->prep = factory_data && (factory_data->flags & RGEO_FACTORYFLAGS_PREPARE_HEURISTIC != 0) ?
|
752
|
+
(GEOSPreparedGeometry*)1 : NULL;
|
639
753
|
self_data->factory = orig_data->factory;
|
640
754
|
self_data->klasses = orig_data->klasses;
|
641
755
|
}
|
@@ -660,6 +774,8 @@ void rgeo_init_geos_geometry(RGeo_Globals* globals)
|
|
660
774
|
rb_define_method(geos_geometry_class, "initialize_copy", method_geometry_initialize_copy, 1);
|
661
775
|
rb_define_method(geos_geometry_class, "initialized?", method_geometry_initialized_p, 0);
|
662
776
|
rb_define_method(geos_geometry_class, "factory", method_geometry_factory, 0);
|
777
|
+
rb_define_method(geos_geometry_class, "prepared?", method_geometry_prepared_p, 0);
|
778
|
+
rb_define_method(geos_geometry_class, "prepare!", method_geometry_prepare, 0);
|
663
779
|
rb_define_method(geos_geometry_class, "dimension", method_geometry_dimension, 0);
|
664
780
|
rb_define_method(geos_geometry_class, "geometry_type", method_geometry_geometry_type, 0);
|
665
781
|
rb_define_method(geos_geometry_class, "srid", method_geometry_srid, 0);
|
data/ext/geos_c_impl/preface.h
CHANGED
@@ -41,6 +41,13 @@
|
|
41
41
|
#endif
|
42
42
|
#endif
|
43
43
|
|
44
|
+
#ifdef HAVE_GEOSPREPAREDCONTAINS_R
|
45
|
+
#define RGEO_GEOS_SUPPORTS_PREPARED1
|
46
|
+
#endif
|
47
|
+
#ifdef HAVE_GEOSPREPAREDDISJOINT_R
|
48
|
+
#define RGEO_GEOS_SUPPORTS_PREPARED2
|
49
|
+
#endif
|
50
|
+
|
44
51
|
#ifdef __cplusplus
|
45
52
|
#define RGEO_BEGIN_C extern "C" {
|
46
53
|
#define RGEO_END_C }
|
data/ext/proj4_c_impl/extconf.rb
CHANGED
@@ -51,6 +51,7 @@ else
|
|
51
51
|
'/opt/proj/include',
|
52
52
|
'/opt/proj4/include',
|
53
53
|
'/opt/include',
|
54
|
+
'/Library/Frameworks/PROJ.framework/unix/include',
|
54
55
|
::Config::CONFIG['includedir'],
|
55
56
|
'/usr/include',
|
56
57
|
]
|
@@ -63,6 +64,7 @@ else
|
|
63
64
|
'/opt/proj/lib',
|
64
65
|
'/opt/proj4/lib',
|
65
66
|
'/opt/lib',
|
67
|
+
'/Library/Frameworks/PROJ.framework/unix/lib',
|
66
68
|
::Config::CONFIG['libdir'],
|
67
69
|
'/usr/lib',
|
68
70
|
]
|
data/ext/proj4_c_impl/main.c
CHANGED
@@ -120,7 +120,14 @@ static VALUE method_proj4_initialize_copy(VALUE self, VALUE orig)
|
|
120
120
|
|
121
121
|
// Copy value from orig
|
122
122
|
RGeo_Proj4Data* orig_data = RGEO_PROJ4_DATA_PTR(orig);
|
123
|
-
|
123
|
+
if (!NIL_P(orig_data->original_str)) {
|
124
|
+
self_data->pj = pj_init_plus(RSTRING_PTR(orig_data->original_str));
|
125
|
+
}
|
126
|
+
else {
|
127
|
+
char* str = pj_get_def(orig_data->pj, 0);
|
128
|
+
self_data->pj = pj_init_plus(str);
|
129
|
+
pj_dalloc(str);
|
130
|
+
}
|
124
131
|
self_data->original_str = orig_data->original_str;
|
125
132
|
self_data->uses_radians = orig_data->uses_radians;
|
126
133
|
|
@@ -128,6 +135,28 @@ static VALUE method_proj4_initialize_copy(VALUE self, VALUE orig)
|
|
128
135
|
}
|
129
136
|
|
130
137
|
|
138
|
+
static VALUE method_proj4_set_value(VALUE self, VALUE str, VALUE uses_radians)
|
139
|
+
{
|
140
|
+
Check_Type(str, T_STRING);
|
141
|
+
|
142
|
+
// Clear out any existing value
|
143
|
+
RGeo_Proj4Data* self_data = RGEO_PROJ4_DATA_PTR(self);
|
144
|
+
projPJ pj = self_data->pj;
|
145
|
+
if (pj) {
|
146
|
+
pj_free(pj);
|
147
|
+
self_data->pj = NULL;
|
148
|
+
self_data->original_str = Qnil;
|
149
|
+
}
|
150
|
+
|
151
|
+
// Set new data
|
152
|
+
self_data->pj = pj_init_plus(RSTRING_PTR(str));
|
153
|
+
self_data->original_str = str;
|
154
|
+
self_data->uses_radians = RTEST(uses_radians) ? 1 : 0;
|
155
|
+
|
156
|
+
return self;
|
157
|
+
}
|
158
|
+
|
159
|
+
|
131
160
|
static VALUE method_proj4_get_geographic(VALUE self)
|
132
161
|
{
|
133
162
|
VALUE result = Qnil;
|
@@ -244,8 +273,11 @@ static void rgeo_init_proj4()
|
|
244
273
|
VALUE rgeo_module = rb_define_module("RGeo");
|
245
274
|
VALUE coordsys_module = rb_define_module_under(rgeo_module, "CoordSys");
|
246
275
|
VALUE proj4_class = rb_define_class_under(coordsys_module, "Proj4", rb_cObject);
|
276
|
+
|
277
|
+
rb_define_alloc_func(proj4_class, alloc_proj4);
|
247
278
|
rb_define_module_function(proj4_class, "_create", cmethod_proj4_create, 2);
|
248
279
|
rb_define_method(proj4_class, "initialize_copy", method_proj4_initialize_copy, 1);
|
280
|
+
rb_define_method(proj4_class, "_set_value", method_proj4_set_value, 2);
|
249
281
|
rb_define_method(proj4_class, "_original_str", method_proj4_original_str, 0);
|
250
282
|
rb_define_method(proj4_class, "_canonical_str", method_proj4_canonical_str, 0);
|
251
283
|
rb_define_method(proj4_class, "_valid?", method_proj4_is_valid, 0);
|
data/lib/rgeo.rb
CHANGED
@@ -242,7 +242,9 @@ module RGeo
|
|
242
242
|
if @min_x == @max_x || @min_y == @max_y
|
243
243
|
@factory.line(point_min_, point_max_)
|
244
244
|
else
|
245
|
-
@factory.polygon(@factory.linear_ring(point_min_,
|
245
|
+
@factory.polygon(@factory.linear_ring([point_min_,
|
246
|
+
@factory.point(@max_x, @min_y, *extras_), point_max_,
|
247
|
+
@factory.point(@min_x, @max_y, *extras_), point_min_]))
|
246
248
|
end
|
247
249
|
end
|
248
250
|
else
|
@@ -256,10 +258,10 @@ module RGeo
|
|
256
258
|
#
|
257
259
|
# Supports these options:
|
258
260
|
#
|
259
|
-
# <tt>:ignore_z</tt>
|
261
|
+
# [<tt>:ignore_z</tt>]
|
260
262
|
# Ignore the Z coordinate when testing, even if both objects
|
261
263
|
# have Z. Default is false.
|
262
|
-
# <tt>:ignore_m</tt>
|
264
|
+
# [<tt>:ignore_m</tt>]
|
263
265
|
# Ignore the M coordinate when testing, even if both objects
|
264
266
|
# have M. Default is false.
|
265
267
|
|
@@ -116,6 +116,95 @@ module RGeo
|
|
116
116
|
alias_method :==, :eql?
|
117
117
|
|
118
118
|
|
119
|
+
# Marshal support
|
120
|
+
|
121
|
+
def marshal_dump # :nodoc:
|
122
|
+
hash_ = {
|
123
|
+
'hasz' => @has_z,
|
124
|
+
'hasm' => @has_m,
|
125
|
+
'srid' => @srid,
|
126
|
+
'wktg' => @wkt_generator._properties,
|
127
|
+
'wkbg' => @wkb_generator._properties,
|
128
|
+
'wktp' => @wkt_parser._properties,
|
129
|
+
'wkbp' => @wkb_parser._properties,
|
130
|
+
}
|
131
|
+
hash_['proj4'] = @proj4.marshal_dump if @proj4
|
132
|
+
hash_['cs'] = @coord_sys.to_wkt if @coord_sys
|
133
|
+
hash_
|
134
|
+
end
|
135
|
+
|
136
|
+
def marshal_load(data_) # :nodoc:
|
137
|
+
if CoordSys::Proj4.supported? && (proj4_data_ = data_['proj4'])
|
138
|
+
proj4_ = CoordSys::Proj4.allocate
|
139
|
+
proj4_.marshal_load(proj4_data_)
|
140
|
+
else
|
141
|
+
proj4_ = nil
|
142
|
+
end
|
143
|
+
if (coord_sys_data_ = data_['cs'])
|
144
|
+
coord_sys_ = CoordSys::CS.create_from_wkt(coord_sys_data_)
|
145
|
+
else
|
146
|
+
coord_sys_ = nil
|
147
|
+
end
|
148
|
+
initialize({
|
149
|
+
:has_z_coordinate => data_['hasz'],
|
150
|
+
:has_m_coordinate => data_['hasm'],
|
151
|
+
:srid => data_['srid'],
|
152
|
+
:wkt_generator => data_['wktg'],
|
153
|
+
:wkb_generator => data_['wkbg'],
|
154
|
+
:wkt_parser => data_['wktp'],
|
155
|
+
:wkb_parser => data_['wkbp'],
|
156
|
+
:proj4 => proj4_,
|
157
|
+
:coord_sys => coord_sys_,
|
158
|
+
})
|
159
|
+
end
|
160
|
+
|
161
|
+
|
162
|
+
# Psych support
|
163
|
+
|
164
|
+
def init_with(coder_) # :nodoc:
|
165
|
+
if (proj4_data_ = coder_['proj4'])
|
166
|
+
if proj4_data_.is_a?(::Hash)
|
167
|
+
proj4_ = CoordSys::Proj4.create(proj4_data_['proj4'], :radians => proj4_data_['radians'])
|
168
|
+
else
|
169
|
+
proj4_ = CoordSys::Proj4.create(proj4_data_.to_s)
|
170
|
+
end
|
171
|
+
else
|
172
|
+
proj4_ = nil
|
173
|
+
end
|
174
|
+
if (coord_sys_data_ = data_['cs'])
|
175
|
+
coord_sys_ = CoordSys::CS.create_from_wkt(coord_sys_data_.to_s)
|
176
|
+
else
|
177
|
+
coord_sys_ = nil
|
178
|
+
end
|
179
|
+
initialize({
|
180
|
+
:has_z_coordinate => data_['has_z_coordinate'],
|
181
|
+
:has_m_coordinate => data_['has_m_coordinate'],
|
182
|
+
:srid => data_['srid'],
|
183
|
+
:wkt_generator => data_['wkt_generator'],
|
184
|
+
:wkb_generator => data_['wkb_generator'],
|
185
|
+
:wkt_parser => data_['wkt_parser'],
|
186
|
+
:wkb_parser => data_['wkb_parser'],
|
187
|
+
:proj4 => proj4_,
|
188
|
+
:coord_sys => coord_sys_,
|
189
|
+
})
|
190
|
+
end
|
191
|
+
|
192
|
+
def encode_with(coder_) # :nodoc:
|
193
|
+
coder_['has_z_coordinate'] = @has_z
|
194
|
+
coder_['has_m_coordinate'] = @has_m
|
195
|
+
coder_['srid'] = @srid
|
196
|
+
coder_['wkt_generator'] = @wkt_generator._properties
|
197
|
+
coder_['wkb_generator'] = @wkb_generator._properties
|
198
|
+
coder_['wkt_parser'] = @wkt_parser._properties
|
199
|
+
coder_['wkb_parser'] = @wkb_parser._properties
|
200
|
+
if @proj4
|
201
|
+
str_ = @proj4.original_str || @proj4.canonical_str
|
202
|
+
coder_['proj4'] = @proj4.radians? ? {'proj4' => str_, 'radians' => true} : str_
|
203
|
+
end
|
204
|
+
coder_['coord_sys'] = @coord_sys.to_wkt if @coord_sys
|
205
|
+
end
|
206
|
+
|
207
|
+
|
119
208
|
# Returns the SRID.
|
120
209
|
|
121
210
|
def srid
|
@@ -222,6 +222,43 @@ module RGeo
|
|
222
222
|
end
|
223
223
|
|
224
224
|
|
225
|
+
# Marshal support
|
226
|
+
|
227
|
+
def marshal_dump # :nodoc:
|
228
|
+
to_wkt
|
229
|
+
end
|
230
|
+
|
231
|
+
def marshal_load(data_) # :nodoc:
|
232
|
+
data_ = data_['wkt'] if data_.is_a?(::Hash)
|
233
|
+
temp_ = CS.create_from_wkt(data_)
|
234
|
+
if temp_.class == self.class
|
235
|
+
temp_.instance_variables.each do |iv_|
|
236
|
+
instance_variable_set(iv_, temp_.instance_variable_get(iv_))
|
237
|
+
end
|
238
|
+
else
|
239
|
+
raise ::TypeError, 'Bad Marshal data'
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
|
244
|
+
# Psych support
|
245
|
+
|
246
|
+
def init_with(coder_) # :nodoc:
|
247
|
+
temp_ = CS.create_from_wkt(coder_.type == :scalar ? coder_.scalar : coder_['wkt'] )
|
248
|
+
if temp_.class == self.class
|
249
|
+
temp_.instance_variables.each do |iv_|
|
250
|
+
instance_variable_set(iv_, temp_.instance_variable_get(iv_))
|
251
|
+
end
|
252
|
+
else
|
253
|
+
raise ::TypeError, 'Bad YAML data'
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
def encode_with(coder_) # :nodoc:
|
258
|
+
coder_['wkt'] = to_wkt
|
259
|
+
end
|
260
|
+
|
261
|
+
|
225
262
|
class << self
|
226
263
|
|
227
264
|
private :new
|
data/lib/rgeo/coord_sys/proj4.rb
CHANGED
@@ -83,6 +83,33 @@ module RGeo
|
|
83
83
|
alias_method :==, :eql?
|
84
84
|
|
85
85
|
|
86
|
+
# Marshal support
|
87
|
+
|
88
|
+
def marshal_dump # :nodoc:
|
89
|
+
{'rad' => radians?, 'str' => original_str || canonical_str}
|
90
|
+
end
|
91
|
+
|
92
|
+
def marshal_load(data_) # :nodoc:
|
93
|
+
_set_value(data_['str'], data_['rad'])
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
# Psych support
|
98
|
+
|
99
|
+
def init_with(coder_) # :nodoc:
|
100
|
+
if coder_.type == :scalar
|
101
|
+
_set_value(coder_.scalar, false)
|
102
|
+
else
|
103
|
+
_set_value(coder_['proj4'], coder_['radians'])
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def encode_with(coder_) # :nodoc:
|
108
|
+
coder_['proj4'] = original_str || canonical_str
|
109
|
+
coder_['radians'] = radians?
|
110
|
+
end
|
111
|
+
|
112
|
+
|
86
113
|
# Returns the "canonical" string definition for this coordinate
|
87
114
|
# system, as reported by Proj4. This may be slightly different
|
88
115
|
# from the definition used to construct this object.
|
@@ -202,6 +229,19 @@ module RGeo
|
|
202
229
|
# Create a new Proj4 object, given a definition, which may be
|
203
230
|
# either a string or a hash. Raises Error::UnsupportedOperation
|
204
231
|
# if the given definition is invalid or Proj4 is not supported.
|
232
|
+
#
|
233
|
+
# Recognized options include:
|
234
|
+
#
|
235
|
+
# [<tt>:radians</tt>]
|
236
|
+
# If set to true, then this proj4 will represent geographic
|
237
|
+
# (latitude/longitude) coordinates in radians rather than
|
238
|
+
# degrees. If this is a geographic coordinate system, then its
|
239
|
+
# units will be in radians. If this is a projected coordinate
|
240
|
+
# system, then its units will be unchanged, but any geographic
|
241
|
+
# coordinate system obtained using get_geographic will use
|
242
|
+
# radians as its units. If this is a geocentric or other type of
|
243
|
+
# coordinate system, this has no effect. Default is false.
|
244
|
+
# (That is all coordinates are in degrees by default.)
|
205
245
|
|
206
246
|
def new(defn_, opts_={})
|
207
247
|
result_ = create(defn_, opts_)
|
data/lib/rgeo/geos/factory.rb
CHANGED
@@ -67,6 +67,7 @@ module RGeo
|
|
67
67
|
if flags_ & 6 == 6
|
68
68
|
raise Error::UnsupportedOperation, "GEOS cannot support both Z and M coordinates at the same time."
|
69
69
|
end
|
70
|
+
flags_ |= 8 unless opts_[:auto_prepare] == :disabled
|
70
71
|
|
71
72
|
# Buffer resolution
|
72
73
|
buffer_resolution_ = opts_[:buffer_resolution].to_i
|
@@ -206,6 +207,8 @@ module RGeo
|
|
206
207
|
_flags & 0x1 != 0
|
207
208
|
when :buffer_resolution
|
208
209
|
_buffer_resolution
|
210
|
+
when :auto_prepare
|
211
|
+
_flags & 0x8 != 0 ? :simple : :disabled
|
209
212
|
else
|
210
213
|
nil
|
211
214
|
end
|
data/lib/rgeo/geos/interface.rb
CHANGED
@@ -64,7 +64,7 @@ module RGeo
|
|
64
64
|
|
65
65
|
|
66
66
|
# Returns true if the given feature is a CAPI GEOS feature, or if
|
67
|
-
# the given factory is a
|
67
|
+
# the given factory is a CAPI GEOS factory.
|
68
68
|
|
69
69
|
def is_capi_geos?(object_)
|
70
70
|
Factory === object_ || GeometryImpl === object_ ||
|
@@ -84,7 +84,7 @@ module RGeo
|
|
84
84
|
|
85
85
|
|
86
86
|
# Returns true if the given feature is a GEOS feature, or if the given
|
87
|
-
# factory is a GEOS factory.
|
87
|
+
# factory is a GEOS factory. Does not distinguish between CAPI and FFI.
|
88
88
|
|
89
89
|
def is_geos?(object_)
|
90
90
|
Factory === object_ || GeometryImpl === object_ ||
|
@@ -188,6 +188,15 @@ module RGeo
|
|
188
188
|
# default configuration for WKRep::WKBGenerator.
|
189
189
|
# Note that the special <tt>:geos</tt> value is not supported for
|
190
190
|
# ZM factories, since GEOS currently can't handle ZM natively.
|
191
|
+
# [<tt>:auto_prepare</tt>]
|
192
|
+
# Request an auto-prepare strategy. Supported values are
|
193
|
+
# <tt>:simple</tt> and <tt>:disabled</tt>. The former (which is
|
194
|
+
# the default) generates a prepared geometry the second time an
|
195
|
+
# operation that would benefit from it is called. The latter
|
196
|
+
# never automatically generates a prepared geometry (unless you
|
197
|
+
# generate on explicitly using the <tt>prepare!</tt> method).
|
198
|
+
# Currently, prepared geometries are supported under CAPI but
|
199
|
+
# not FFI.
|
191
200
|
|
192
201
|
def factory(opts_={})
|
193
202
|
if supported?
|
@@ -123,6 +123,16 @@ module RGeo
|
|
123
123
|
end
|
124
124
|
|
125
125
|
|
126
|
+
def _properties # :nodoc:
|
127
|
+
{
|
128
|
+
:type_format => @type_format,
|
129
|
+
:emit_ewkb_srid => @emit_ewkb_srid,
|
130
|
+
:hex_format => @hex_format,
|
131
|
+
:little_endian => @little_endian,
|
132
|
+
}
|
133
|
+
end
|
134
|
+
|
135
|
+
|
126
136
|
# Generate and return the WKB format for the given geometry object,
|
127
137
|
# according to the current settings.
|
128
138
|
|
@@ -127,10 +127,14 @@ module RGeo
|
|
127
127
|
@ignore_extra_bytes
|
128
128
|
end
|
129
129
|
|
130
|
-
|
131
|
-
#
|
132
|
-
|
133
|
-
|
130
|
+
|
131
|
+
def _properties # :nodoc:
|
132
|
+
{
|
133
|
+
:support_ewkb => @support_ewkb,
|
134
|
+
:support_wkb12 => @support_wkb12,
|
135
|
+
:ignore_extra_bytes => @ignore_extra_bytes,
|
136
|
+
:default_srid => @default_srid,
|
137
|
+
}
|
134
138
|
end
|
135
139
|
|
136
140
|
|
@@ -114,6 +114,16 @@ module RGeo
|
|
114
114
|
end
|
115
115
|
|
116
116
|
|
117
|
+
def _properties # :nodoc:
|
118
|
+
{
|
119
|
+
:tag_format => @tag_format,
|
120
|
+
:emit_ewkt_srid => @emit_ewkt_srid,
|
121
|
+
:square_brackets => @square_brackets,
|
122
|
+
:convert_case => @convert_case,
|
123
|
+
}
|
124
|
+
end
|
125
|
+
|
126
|
+
|
117
127
|
# Generate and return the WKT format for the given geometry object,
|
118
128
|
# according to the current settings.
|
119
129
|
|
@@ -141,6 +151,7 @@ module RGeo
|
|
141
151
|
|
142
152
|
def _generate_feature(obj_, toplevel_=false) # :nodoc:
|
143
153
|
type_ = obj_.geometry_type
|
154
|
+
type_ = Feature::LineString if type_.subtype_of?(Feature::LineString)
|
144
155
|
tag_ = type_.type_name
|
145
156
|
if @tag_format == :ewkt
|
146
157
|
if @cur_support_m && !@cur_support_z
|
@@ -162,7 +173,7 @@ module RGeo
|
|
162
173
|
end
|
163
174
|
if type_ == Feature::Point
|
164
175
|
"#{tag_} #{_generate_point(obj_)}"
|
165
|
-
elsif type_
|
176
|
+
elsif type_ == Feature::LineString
|
166
177
|
"#{tag_} #{_generate_line_string(obj_)}"
|
167
178
|
elsif type_ == Feature::Polygon
|
168
179
|
"#{tag_} #{_generate_polygon(obj_)}"
|
@@ -142,6 +142,17 @@ module RGeo
|
|
142
142
|
end
|
143
143
|
|
144
144
|
|
145
|
+
def _properties # :nodoc:
|
146
|
+
{
|
147
|
+
:support_ewkt => @support_ewkt,
|
148
|
+
:support_wkt12 => @support_wkt12,
|
149
|
+
:strict_wkt11 => @strict_wkt11,
|
150
|
+
:ignore_extra_tokens => @ignore_extra_tokens,
|
151
|
+
:default_srid => @default_srid,
|
152
|
+
}
|
153
|
+
end
|
154
|
+
|
155
|
+
|
145
156
|
# Parse the given string, and return a geometry object.
|
146
157
|
|
147
158
|
def parse(str_)
|
data/lib/rgeo/yaml.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# -----------------------------------------------------------------------------
|
2
|
+
#
|
3
|
+
# RGeo yaml support
|
4
|
+
#
|
5
|
+
# -----------------------------------------------------------------------------
|
6
|
+
# Copyright 2010 Daniel Azuma
|
7
|
+
#
|
8
|
+
# All rights reserved.
|
9
|
+
#
|
10
|
+
# Redistribution and use in source and binary forms, with or without
|
11
|
+
# modification, are permitted provided that the following conditions are met:
|
12
|
+
#
|
13
|
+
# * Redistributions of source code must retain the above copyright notice,
|
14
|
+
# this list of conditions and the following disclaimer.
|
15
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
16
|
+
# this list of conditions and the following disclaimer in the documentation
|
17
|
+
# and/or other materials provided with the distribution.
|
18
|
+
# * Neither the name of the copyright holder, nor the names of any other
|
19
|
+
# contributors to this software, may be used to endorse or promote products
|
20
|
+
# derived from this software without specific prior written permission.
|
21
|
+
#
|
22
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
25
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
26
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
27
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
28
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
29
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
30
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
31
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
32
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
33
|
+
# -----------------------------------------------------------------------------
|
34
|
+
;
|
35
|
+
|
36
|
+
|
37
|
+
begin
|
38
|
+
require 'psych'
|
39
|
+
rescue ::LoadError
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
module RGeo
|
44
|
+
|
45
|
+
|
46
|
+
# :stopdoc:
|
47
|
+
PSYCH_AVAILABLE = defined?(::Psych)
|
48
|
+
# :startdoc:
|
49
|
+
|
50
|
+
|
51
|
+
# Returns true if YAML serialization and deserialization is supported.
|
52
|
+
# YAML support requires the Psych library/gem.
|
53
|
+
|
54
|
+
def self.yaml_supported?
|
55
|
+
PSYCH_AVAILABLE
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
end
|
data/test/coord_sys/tc_ogc_cs.rb
CHANGED
@@ -360,6 +360,34 @@ module RGeo
|
|
360
360
|
end
|
361
361
|
|
362
362
|
|
363
|
+
def test_marshal_roundtrip
|
364
|
+
input_ = 'COMPD_CS["OSGB36 / British National Grid + ODN",PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB 1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-4.2261596151967575],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943295],AXIS["Geodetic latitude",NORTH],AXIS["Geodetic longitude",EAST],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse Mercator",AUTHORITY["EPSG","9807"]],PARAMETER["central_meridian",-2.0],PARAMETER["latitude_of_origin",49.0],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000.0],PARAMETER["false_northing",-100000.0],UNIT["m",1.0],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","27700"]],VERT_CS["Newlyn",VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],UNIT["m",1.0],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5701"]],AUTHORITY["EPSG","7405"]]'
|
365
|
+
obj1_ = ::RGeo::CoordSys::CS.create_from_wkt(input_)
|
366
|
+
dump_ = ::Marshal.dump(obj1_)
|
367
|
+
obj2_ = ::Marshal.load(dump_)
|
368
|
+
assert_equal(obj1_, obj2_)
|
369
|
+
end
|
370
|
+
|
371
|
+
|
372
|
+
if ::RGeo.yaml_supported?
|
373
|
+
|
374
|
+
|
375
|
+
def test_yaml_roundtrip
|
376
|
+
input_ = 'COMPD_CS["OSGB36 / British National Grid + ODN",PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB 1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-4.2261596151967575],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943295],AXIS["Geodetic latitude",NORTH],AXIS["Geodetic longitude",EAST],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse Mercator",AUTHORITY["EPSG","9807"]],PARAMETER["central_meridian",-2.0],PARAMETER["latitude_of_origin",49.0],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000.0],PARAMETER["false_northing",-100000.0],UNIT["m",1.0],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","27700"]],VERT_CS["Newlyn",VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],UNIT["m",1.0],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5701"]],AUTHORITY["EPSG","7405"]]'
|
377
|
+
obj1_ = ::RGeo::CoordSys::CS.create_from_wkt(input_)
|
378
|
+
dump_ = ::Psych.dump(obj1_)
|
379
|
+
obj2_ = ::Psych.load(dump_)
|
380
|
+
assert_equal(obj1_, obj2_)
|
381
|
+
end
|
382
|
+
|
383
|
+
|
384
|
+
else
|
385
|
+
|
386
|
+
puts "WARNING: Psych not installed. Skipping YAML tests."
|
387
|
+
|
388
|
+
end
|
389
|
+
|
390
|
+
|
363
391
|
end
|
364
392
|
|
365
393
|
end
|
data/test/coord_sys/tc_proj4.rb
CHANGED
@@ -46,7 +46,7 @@ module RGeo
|
|
46
46
|
|
47
47
|
|
48
48
|
def test_create_wgs84
|
49
|
-
proj_ = RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
49
|
+
proj_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
50
50
|
assert_equal(true, proj_.geographic?)
|
51
51
|
assert_equal('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', proj_.original_str)
|
52
52
|
assert_equal(' +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0', proj_.canonical_str)
|
@@ -54,19 +54,19 @@ module RGeo
|
|
54
54
|
|
55
55
|
|
56
56
|
def test_get_wgs84_geographic
|
57
|
-
proj_ = RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
57
|
+
proj_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
58
58
|
proj2_ = proj_.get_geographic
|
59
59
|
assert_nil(proj2_.original_str)
|
60
60
|
assert_equal(true, proj2_.geographic?)
|
61
|
-
coords_ = RGeo::CoordSys::Proj4.transform_coords(proj_, proj2_, 1, 2, 0)
|
61
|
+
coords_ = ::RGeo::CoordSys::Proj4.transform_coords(proj_, proj2_, 1, 2, 0)
|
62
62
|
assert_equal([1, 2, 0], coords_)
|
63
63
|
end
|
64
64
|
|
65
65
|
|
66
66
|
def test_identity_transform
|
67
|
-
proj_ = RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
68
|
-
assert_equal([1, 2, 0], RGeo::CoordSys::Proj4.transform_coords(proj_, proj_, 1, 2, 0))
|
69
|
-
assert_equal([1, 2], RGeo::CoordSys::Proj4.transform_coords(proj_, proj_, 1, 2, nil))
|
67
|
+
proj_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
68
|
+
assert_equal([1, 2, 0], ::RGeo::CoordSys::Proj4.transform_coords(proj_, proj_, 1, 2, 0))
|
69
|
+
assert_equal([1, 2], ::RGeo::CoordSys::Proj4.transform_coords(proj_, proj_, 1, 2, nil))
|
70
70
|
end
|
71
71
|
|
72
72
|
|
@@ -92,45 +92,100 @@ module RGeo
|
|
92
92
|
|
93
93
|
|
94
94
|
def test_simple_mercator_transform
|
95
|
-
geography_ = RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', :radians => true)
|
96
|
-
projection_ = RGeo::CoordSys::Proj4.create('+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs')
|
97
|
-
_assert_xy_close(_project_merc(0, 0), RGeo::CoordSys::Proj4.transform_coords(geography_, projection_, 0, 0, nil))
|
98
|
-
_assert_xy_close(_project_merc(0.01, 0.01), RGeo::CoordSys::Proj4.transform_coords(geography_, projection_, 0.01, 0.01, nil))
|
99
|
-
_assert_xy_close(_project_merc(1, 1), RGeo::CoordSys::Proj4.transform_coords(geography_, projection_, 1, 1, nil))
|
100
|
-
_assert_xy_close(_project_merc(-1, -1), RGeo::CoordSys::Proj4.transform_coords(geography_, projection_, -1, -1, nil))
|
101
|
-
_assert_xy_close(_unproject_merc(0, 0), RGeo::CoordSys::Proj4.transform_coords(projection_, geography_, 0, 0, nil))
|
102
|
-
_assert_xy_close(_unproject_merc(10000, 10000), RGeo::CoordSys::Proj4.transform_coords(projection_, geography_, 10000, 10000, nil))
|
103
|
-
_assert_xy_close(_unproject_merc(-20000000, -20000000), RGeo::CoordSys::Proj4.transform_coords(projection_, geography_, -20000000, -20000000, nil))
|
95
|
+
geography_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', :radians => true)
|
96
|
+
projection_ = ::RGeo::CoordSys::Proj4.create('+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs')
|
97
|
+
_assert_xy_close(_project_merc(0, 0), ::RGeo::CoordSys::Proj4.transform_coords(geography_, projection_, 0, 0, nil))
|
98
|
+
_assert_xy_close(_project_merc(0.01, 0.01), ::RGeo::CoordSys::Proj4.transform_coords(geography_, projection_, 0.01, 0.01, nil))
|
99
|
+
_assert_xy_close(_project_merc(1, 1), ::RGeo::CoordSys::Proj4.transform_coords(geography_, projection_, 1, 1, nil))
|
100
|
+
_assert_xy_close(_project_merc(-1, -1), ::RGeo::CoordSys::Proj4.transform_coords(geography_, projection_, -1, -1, nil))
|
101
|
+
_assert_xy_close(_unproject_merc(0, 0), ::RGeo::CoordSys::Proj4.transform_coords(projection_, geography_, 0, 0, nil))
|
102
|
+
_assert_xy_close(_unproject_merc(10000, 10000), ::RGeo::CoordSys::Proj4.transform_coords(projection_, geography_, 10000, 10000, nil))
|
103
|
+
_assert_xy_close(_unproject_merc(-20000000, -20000000), ::RGeo::CoordSys::Proj4.transform_coords(projection_, geography_, -20000000, -20000000, nil))
|
104
104
|
end
|
105
105
|
|
106
106
|
|
107
107
|
def test_equivalence
|
108
|
-
proj1_ = RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
109
|
-
proj2_ = RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
108
|
+
proj1_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
109
|
+
proj2_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
110
110
|
assert_equal(proj1_, proj2_)
|
111
111
|
end
|
112
112
|
|
113
113
|
|
114
114
|
def test_point_projection_cast
|
115
|
-
geography_ = RGeo::Geos.factory(:proj4 => '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', :srid =>4326)
|
116
|
-
projection_ = RGeo::Geos.factory(:proj4 => '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs', :srid => 27700)
|
115
|
+
geography_ = ::RGeo::Geos.factory(:proj4 => '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', :srid =>4326)
|
116
|
+
projection_ = ::RGeo::Geos.factory(:proj4 => '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs', :srid => 27700)
|
117
117
|
proj_point_ = projection_.parse_wkt('POINT(473600.5000000000000000 186659.7999999999883585)')
|
118
|
-
geo_point_ = RGeo::Feature.cast(proj_point_, :project => true, :factory => geography_)
|
118
|
+
geo_point_ = ::RGeo::Feature.cast(proj_point_, :project => true, :factory => geography_)
|
119
119
|
_assert_close_enough(-0.9393598527244420, geo_point_.x)
|
120
120
|
_assert_close_enough(51.5740106527552697, geo_point_.y)
|
121
121
|
end
|
122
122
|
|
123
123
|
|
124
124
|
def test_point_transform_lowlevel
|
125
|
-
geography_ = RGeo::Geos.factory(:proj4 => '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', :srid =>4326)
|
126
|
-
projection_ = RGeo::Geos.factory(:proj4 => '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs', :srid => 27700)
|
125
|
+
geography_ = ::RGeo::Geos.factory(:proj4 => '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', :srid =>4326)
|
126
|
+
projection_ = ::RGeo::Geos.factory(:proj4 => '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs', :srid => 27700)
|
127
127
|
proj_point_ = projection_.parse_wkt('POINT(473600.5000000000000000 186659.7999999999883585)')
|
128
|
-
geo_point_ = RGeo::CoordSys::Proj4.transform(projection_.proj4, proj_point_, geography_.proj4, geography_)
|
128
|
+
geo_point_ = ::RGeo::CoordSys::Proj4.transform(projection_.proj4, proj_point_, geography_.proj4, geography_)
|
129
129
|
_assert_close_enough(-0.9393598527244420, geo_point_.x)
|
130
130
|
_assert_close_enough(51.5740106527552697, geo_point_.y)
|
131
131
|
end
|
132
132
|
|
133
133
|
|
134
|
+
def test_geocentric
|
135
|
+
obj1_ = ::RGeo::CoordSys::Proj4.create('+proj=geocent +ellps=WGS84')
|
136
|
+
assert_equal(true, obj1_.geocentric?)
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
def test_get_geographic
|
141
|
+
projection_ = ::RGeo::CoordSys::Proj4.create('+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs')
|
142
|
+
geographic_ = projection_.get_geographic
|
143
|
+
expected_ = ::RGeo::CoordSys::Proj4.create('+proj=latlong +a=6378137 +b=6378137 +nadgrids=@null')
|
144
|
+
assert_equal(expected_, geographic_)
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
def test_marshal_roundtrip
|
149
|
+
obj1_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
150
|
+
dump_ = ::Marshal.dump(obj1_)
|
151
|
+
obj2_ = ::Marshal.load(dump_)
|
152
|
+
assert_equal(obj1_, obj2_)
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
def test_dup
|
157
|
+
obj1_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
158
|
+
obj2_ = obj1_.dup
|
159
|
+
assert_equal(obj1_, obj2_)
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
def test_dup_of_get_geographic
|
164
|
+
obj1_ = ::RGeo::CoordSys::Proj4.create('+proj=latlong +datum=WGS84 +ellps=WGS84')
|
165
|
+
obj2_ = obj1_.get_geographic
|
166
|
+
obj3_ = obj2_.dup
|
167
|
+
assert_equal(obj1_, obj3_)
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
if ::RGeo.yaml_supported?
|
172
|
+
|
173
|
+
|
174
|
+
def test_yaml_roundtrip
|
175
|
+
obj1_ = ::RGeo::CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
|
176
|
+
dump_ = ::Psych.dump(obj1_)
|
177
|
+
obj2_ = ::Psych.load(dump_)
|
178
|
+
assert_equal(obj1_, obj2_)
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
else
|
183
|
+
|
184
|
+
puts "WARNING: Psych not installed. Skipping YAML tests."
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
|
134
189
|
end
|
135
190
|
|
136
191
|
end
|
data/test/geos_capi/tc_misc.rb
CHANGED
@@ -65,6 +65,39 @@ module RGeo
|
|
65
65
|
end
|
66
66
|
|
67
67
|
|
68
|
+
def test_prepare
|
69
|
+
p1_ = @factory.point(1, 2)
|
70
|
+
p2_ = @factory.point(3, 4)
|
71
|
+
p3_ = @factory.point(5, 2)
|
72
|
+
polygon_ = @factory.polygon(@factory.linear_ring([p1_, p2_, p3_, p1_]))
|
73
|
+
assert_equal(false, polygon_.prepared?)
|
74
|
+
polygon_.prepare!
|
75
|
+
assert_equal(true, polygon_.prepared?)
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def test_auto_prepare
|
80
|
+
p1_ = @factory.point(1, 2)
|
81
|
+
p2_ = @factory.point(3, 4)
|
82
|
+
p3_ = @factory.point(5, 2)
|
83
|
+
polygon_ = @factory.polygon(@factory.linear_ring([p1_, p2_, p3_, p1_]))
|
84
|
+
assert_equal(false, polygon_.prepared?)
|
85
|
+
polygon_.intersects?(p1_)
|
86
|
+
assert_equal(false, polygon_.prepared?)
|
87
|
+
polygon_.intersects?(p2_)
|
88
|
+
assert_equal(true, polygon_.prepared?)
|
89
|
+
|
90
|
+
factory_no_auto_prepare_ = ::RGeo::Geos.factory(:srid => 4326, :auto_prepare => :disabled)
|
91
|
+
polygon2_ = factory_no_auto_prepare_.polygon(
|
92
|
+
factory_no_auto_prepare_.linear_ring([p1_, p2_, p3_, p1_]))
|
93
|
+
assert_equal(false, polygon2_.prepared?)
|
94
|
+
polygon2_.intersects?(p1_)
|
95
|
+
assert_equal(false, polygon2_.prepared?)
|
96
|
+
polygon2_.intersects?(p2_)
|
97
|
+
assert_equal(false, polygon2_.prepared?)
|
98
|
+
end
|
99
|
+
|
100
|
+
|
68
101
|
end
|
69
102
|
|
70
103
|
end
|
metadata
CHANGED
@@ -1,30 +1,31 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgeo
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.2
|
4
5
|
prerelease:
|
5
|
-
version: 0.3.1
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Daniel Azuma
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-05-24 00:00:00 Z
|
12
|
+
date: 2011-08-12 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
|
16
|
-
|
14
|
+
description: RGeo is a geospatial data library for Ruby. It provides an implementation
|
15
|
+
of the Open Geospatial Consortium's Simple Features Specification, used by most
|
16
|
+
standard spatial/geographic data storage systems such as PostGIS. A number of add-on
|
17
|
+
modules are also available to help with writing location-based applications using
|
18
|
+
Ruby-based frameworks such as Ruby On Rails.
|
17
19
|
email: dazuma@gmail.com
|
18
20
|
executables: []
|
19
|
-
|
20
|
-
extensions:
|
21
|
+
extensions:
|
21
22
|
- ext/geos_c_impl/extconf.rb
|
22
23
|
- ext/proj4_c_impl/extconf.rb
|
23
|
-
extra_rdoc_files:
|
24
|
+
extra_rdoc_files:
|
24
25
|
- History.rdoc
|
25
26
|
- README.rdoc
|
26
27
|
- Spatial_Programming_With_RGeo.rdoc
|
27
|
-
files:
|
28
|
+
files:
|
28
29
|
- lib/rgeo/cartesian/analysis.rb
|
29
30
|
- lib/rgeo/cartesian/bounding_box.rb
|
30
31
|
- lib/rgeo/cartesian/calculations.rb
|
@@ -95,6 +96,7 @@ files:
|
|
95
96
|
- lib/rgeo/wkrep/wkt_generator.rb
|
96
97
|
- lib/rgeo/wkrep/wkt_parser.rb
|
97
98
|
- lib/rgeo/wkrep.rb
|
99
|
+
- lib/rgeo/yaml.rb
|
98
100
|
- lib/rgeo.rb
|
99
101
|
- ext/geos_c_impl/extconf.rb
|
100
102
|
- ext/proj4_c_impl/extconf.rb
|
@@ -193,32 +195,29 @@ files:
|
|
193
195
|
- Version
|
194
196
|
homepage: http://virtuoso.rubyforge.org/rgeo
|
195
197
|
licenses: []
|
196
|
-
|
197
198
|
post_install_message:
|
198
199
|
rdoc_options: []
|
199
|
-
|
200
|
-
require_paths:
|
200
|
+
require_paths:
|
201
201
|
- lib
|
202
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
202
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
203
203
|
none: false
|
204
|
-
requirements:
|
205
|
-
- -
|
206
|
-
- !ruby/object:Gem::Version
|
204
|
+
requirements:
|
205
|
+
- - ! '>='
|
206
|
+
- !ruby/object:Gem::Version
|
207
207
|
version: 1.8.7
|
208
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
208
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
209
209
|
none: false
|
210
|
-
requirements:
|
211
|
-
- -
|
212
|
-
- !ruby/object:Gem::Version
|
210
|
+
requirements:
|
211
|
+
- - ! '>'
|
212
|
+
- !ruby/object:Gem::Version
|
213
213
|
version: 1.3.1
|
214
214
|
requirements: []
|
215
|
-
|
216
215
|
rubyforge_project: virtuoso
|
217
|
-
rubygems_version: 1.8.
|
216
|
+
rubygems_version: 1.8.7
|
218
217
|
signing_key:
|
219
218
|
specification_version: 3
|
220
219
|
summary: RGeo is a geospatial data library for Ruby.
|
221
|
-
test_files:
|
220
|
+
test_files:
|
222
221
|
- test/coord_sys/tc_active_record_table.rb
|
223
222
|
- test/coord_sys/tc_ogc_cs.rb
|
224
223
|
- test/coord_sys/tc_proj4.rb
|