rgeo 0.3.8 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.rdoc +8 -0
- data/README.rdoc +5 -1
- data/Version +1 -1
- data/ext/geos_c_impl/extconf.rb +1 -0
- data/ext/geos_c_impl/factory.c +45 -2
- data/ext/geos_c_impl/factory.h +4 -0
- data/ext/geos_c_impl/preface.h +3 -0
- data/lib/rgeo/cartesian/bounding_box.rb +15 -1
- data/lib/rgeo/cartesian/feature_classes.rb +1 -0
- data/lib/rgeo/cartesian/feature_methods.rb +13 -1
- data/lib/rgeo/geographic/spherical_feature_classes.rb +1 -0
- data/lib/rgeo/geographic/spherical_feature_methods.rb +16 -0
- data/lib/rgeo/geographic/spherical_math.rb +5 -0
- data/lib/rgeo/geos.rb +4 -1
- data/lib/rgeo/geos/ffi_classes.rb +12 -72
- data/lib/rgeo/geos/ffi_factory.rb +18 -10
- data/lib/rgeo/geos/utils.rb +112 -0
- data/test/common/multi_line_string_tests.rb +12 -4
- data/test/coord_sys/tc_proj4.rb +3 -1
- data/test/projected_geographic/tc_multi_line_string.rb +3 -0
- data/test/simple_mercator/tc_multi_line_string.rb +3 -0
- data/test/spherical_geographic/tc_multi_line_string.rb +1 -0
- data/test/tc_cartesian_bbox.rb +121 -0
- metadata +5 -2
data/History.rdoc
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
=== 0.3.9 / 2012-04-10
|
2
|
+
|
3
|
+
* Implemented LineString#length and MultiLineString#length for simple cartesian and simple spherical factories.
|
4
|
+
* Added Cartesian::BoundingBox.create_from_points.
|
5
|
+
* Serialization was broken for some 3d geometries when running libgeos 3.2.x (3.3.x was unaffected). Fixed.
|
6
|
+
* Fixed an exception when creating adding a geometry to a Cartesian::BoundingBox when a cast is necessary.
|
7
|
+
* Added configuration for Travis CI.
|
8
|
+
|
1
9
|
=== 0.3.8 / 2012-03-23
|
2
10
|
|
3
11
|
* When using the spherical factory, some negative longitudes might get perturbed slightly due to floating point errors. Fixed. (Reported by Pete Deffendol)
|
data/README.rdoc
CHANGED
@@ -122,6 +122,8 @@ Source code is hosted on Github at http://github.com/dazuma/rgeo
|
|
122
122
|
|
123
123
|
Contributions are welcome. Fork the project on Github.
|
124
124
|
|
125
|
+
Build status: {<img src="https://secure.travis-ci.org/dazuma/rgeo.png" />}[http://travis-ci.org/dazuma/rgeo]
|
126
|
+
|
125
127
|
Report bugs on Github issues at http://github.org/dazuma/rgeo/issues
|
126
128
|
|
127
129
|
Support available on the rgeo-users google group at http://groups.google.com/group/rgeo-users
|
@@ -132,7 +134,9 @@ Contact the author at dazuma at gmail dot com.
|
|
132
134
|
|
133
135
|
RGeo is written by Daniel Azuma (http://www.daniel-azuma.com).
|
134
136
|
|
135
|
-
Development is supported by Pirq
|
137
|
+
Development is supported by Pirq (http://www.pirq.com).
|
138
|
+
|
139
|
+
Continuous integration service provided by Travis-CI (http://travis-ci.org).
|
136
140
|
|
137
141
|
RGeo calls the GEOS library to handle most Cartesian geometric
|
138
142
|
calculations, and the Proj4 library to handle projections and coordinate
|
data/Version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.9
|
data/ext/geos_c_impl/extconf.rb
CHANGED
@@ -78,6 +78,7 @@ else
|
|
78
78
|
end
|
79
79
|
have_func('GEOSPreparedContains_r', 'geos_c.h')
|
80
80
|
have_func('GEOSPreparedDisjoint_r', 'geos_c.h')
|
81
|
+
have_func('GEOSWKTWriter_setOutputDimension_r', 'geos_c.h')
|
81
82
|
end
|
82
83
|
unless found_geos_
|
83
84
|
puts "**** WARNING: Unable to find GEOS headers or GEOS version is too old."
|
data/ext/geos_c_impl/factory.c
CHANGED
@@ -316,13 +316,32 @@ static VALUE method_factory_write_for_marshal(VALUE self, VALUE obj)
|
|
316
316
|
VALUE result;
|
317
317
|
char* str;
|
318
318
|
size_t size;
|
319
|
+
char has_3d;
|
320
|
+
#ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
|
321
|
+
RGeo_Globals* globals;
|
322
|
+
VALUE wkb_generator;
|
323
|
+
#endif
|
319
324
|
|
320
325
|
self_data = RGEO_FACTORY_DATA_PTR(self);
|
321
326
|
self_context = self_data->geos_context;
|
327
|
+
has_3d = self_data->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
|
328
|
+
#ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
|
329
|
+
if (has_3d) {
|
330
|
+
globals = self_data->globals;
|
331
|
+
wkb_generator = globals->marshal_wkb_generator;
|
332
|
+
if (NIL_P(wkb_generator)) {
|
333
|
+
wkb_generator = rb_funcall(
|
334
|
+
rb_const_get_at(globals->geos_module, rb_intern("Utils")),
|
335
|
+
rb_intern("marshal_wkb_generator"), 0);
|
336
|
+
globals->marshal_wkb_generator = wkb_generator;
|
337
|
+
}
|
338
|
+
return rb_funcall(wkb_generator, globals->id_generate, 1, obj);
|
339
|
+
}
|
340
|
+
#endif
|
322
341
|
wkb_writer = self_data->marshal_wkb_writer;
|
323
342
|
if (!wkb_writer) {
|
324
343
|
wkb_writer = GEOSWKBWriter_create_r(self_context);
|
325
|
-
if (
|
344
|
+
if (has_3d) {
|
326
345
|
GEOSWKBWriter_setOutputDimension_r(self_context, wkb_writer, 3);
|
327
346
|
}
|
328
347
|
self_data->marshal_wkb_writer = wkb_writer;
|
@@ -351,13 +370,32 @@ static VALUE method_factory_write_for_psych(VALUE self, VALUE obj)
|
|
351
370
|
VALUE result;
|
352
371
|
char* str;
|
353
372
|
size_t size;
|
373
|
+
char has_3d;
|
374
|
+
#ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
|
375
|
+
RGeo_Globals* globals;
|
376
|
+
VALUE wkt_generator;
|
377
|
+
#endif
|
354
378
|
|
355
379
|
self_data = RGEO_FACTORY_DATA_PTR(self);
|
356
380
|
self_context = self_data->geos_context;
|
381
|
+
has_3d = self_data->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
|
382
|
+
#ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
|
383
|
+
if (has_3d) {
|
384
|
+
globals = self_data->globals;
|
385
|
+
wkt_generator = globals->psych_wkt_generator;
|
386
|
+
if (NIL_P(wkt_generator)) {
|
387
|
+
wkt_generator = rb_funcall(
|
388
|
+
rb_const_get_at(globals->geos_module, rb_intern("Utils")),
|
389
|
+
rb_intern("psych_wkt_generator"), 0);
|
390
|
+
globals->psych_wkt_generator = wkt_generator;
|
391
|
+
}
|
392
|
+
return rb_funcall(wkt_generator, globals->id_generate, 1, obj);
|
393
|
+
}
|
394
|
+
#endif
|
357
395
|
wkt_writer = self_data->psych_wkt_writer;
|
358
396
|
if (!wkt_writer) {
|
359
397
|
wkt_writer = GEOSWKTWriter_create_r(self_context);
|
360
|
-
if (
|
398
|
+
if (has_3d) {
|
361
399
|
GEOSWKTWriter_setOutputDimension_r(self_context, wkt_writer, 3);
|
362
400
|
}
|
363
401
|
self_data->psych_wkt_writer = wkt_writer;
|
@@ -561,6 +599,11 @@ RGeo_Globals* rgeo_init_geos_factory()
|
|
561
599
|
globals->id_enum_for = rb_intern("enum_for");
|
562
600
|
globals->sym_force_new = ID2SYM(rb_intern("force_new"));
|
563
601
|
globals->sym_keep_subtype = ID2SYM(rb_intern("keep_subtype"));
|
602
|
+
#ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
|
603
|
+
globals->psych_wkt_generator = Qnil;
|
604
|
+
globals->marshal_wkb_generator = Qnil;
|
605
|
+
#endif
|
606
|
+
|
564
607
|
|
565
608
|
// Add C methods to the factory.
|
566
609
|
geos_factory_class = rb_const_get_at(globals->geos_module, rb_intern("Factory"));
|
data/ext/geos_c_impl/factory.h
CHANGED
data/ext/geos_c_impl/preface.h
CHANGED
@@ -47,6 +47,9 @@
|
|
47
47
|
#ifdef HAVE_GEOSPREPAREDDISJOINT_R
|
48
48
|
#define RGEO_GEOS_SUPPORTS_PREPARED2
|
49
49
|
#endif
|
50
|
+
#ifdef HAVE_GEOSWKTWWRITER_SETOUTPUTDIMENSION_R
|
51
|
+
#define RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
|
52
|
+
#endif
|
50
53
|
|
51
54
|
#ifdef __cplusplus
|
52
55
|
#define RGEO_BEGIN_C extern "C" {
|
@@ -54,6 +54,20 @@ module RGeo
|
|
54
54
|
class BoundingBox
|
55
55
|
|
56
56
|
|
57
|
+
# Create a bounding box given two corner points.
|
58
|
+
# The bounding box will be given the factory of the first point.
|
59
|
+
# You may also provide the same options available to
|
60
|
+
# BoundingBox.new.
|
61
|
+
|
62
|
+
def self.create_from_points(point1_, point2_, opts_={})
|
63
|
+
factory_ = point1_.factory
|
64
|
+
box_ = new(factory_, opts_)
|
65
|
+
box_._add_geometry(point1_)
|
66
|
+
box_.add(point2_)
|
67
|
+
box_
|
68
|
+
end
|
69
|
+
|
70
|
+
|
57
71
|
# Create a new empty bounding box with the given factory.
|
58
72
|
#
|
59
73
|
# The factory defines the coordinate system for the bounding box,
|
@@ -216,7 +230,7 @@ module RGeo
|
|
216
230
|
if geometry_.factory == @factory
|
217
231
|
_add_geometry(geometry_)
|
218
232
|
else
|
219
|
-
_add_geometry(
|
233
|
+
_add_geometry(Feature.cast(geometry_, @factory))
|
220
234
|
end
|
221
235
|
end
|
222
236
|
self
|
@@ -152,6 +152,7 @@ module RGeo
|
|
152
152
|
include ::RGeo::ImplHelper::BasicGeometryCollectionMethods
|
153
153
|
include ::RGeo::ImplHelper::BasicMultiLineStringMethods
|
154
154
|
include ::RGeo::Cartesian::GeometryMethods
|
155
|
+
include ::RGeo::Cartesian::MultiLineStringMethods
|
155
156
|
|
156
157
|
Feature::MixinCollection::GLOBAL.for_type(Feature::MultiLineString).include_in_class(self, true)
|
157
158
|
|
@@ -114,12 +114,24 @@ module RGeo
|
|
114
114
|
|
115
115
|
|
116
116
|
def length
|
117
|
-
|
117
|
+
_segments.inject(0.0){ |sum_, seg_| sum_ + seg_.length }
|
118
118
|
end
|
119
119
|
|
120
120
|
|
121
121
|
end
|
122
122
|
|
123
|
+
|
124
|
+
module MultiLineStringMethods # :nodoc:
|
125
|
+
|
126
|
+
|
127
|
+
def length
|
128
|
+
inject(0.0){ |sum_, geom_| sum_ + geom_.length }
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
|
123
135
|
end
|
124
136
|
|
125
137
|
end
|
@@ -212,6 +212,7 @@ module RGeo
|
|
212
212
|
include ImplHelper::BasicGeometryCollectionMethods
|
213
213
|
include ImplHelper::BasicMultiLineStringMethods
|
214
214
|
include SphericalGeometryMethods
|
215
|
+
include SphericalMultiLineStringMethods
|
215
216
|
|
216
217
|
|
217
218
|
Feature::MixinCollection::GLOBAL.for_type(Feature::MultiLineString).include_in_class(self, true)
|
@@ -89,6 +89,22 @@ module RGeo
|
|
89
89
|
end
|
90
90
|
|
91
91
|
|
92
|
+
def length
|
93
|
+
_arcs.inject(0.0){ |sum_, arc_| sum_ + arc_.length } * SphericalMath::RADIUS
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
module SphericalMultiLineStringMethods
|
101
|
+
|
102
|
+
|
103
|
+
def length
|
104
|
+
inject(0.0){ |sum_, geom_| sum_ + geom_.length }
|
105
|
+
end
|
106
|
+
|
107
|
+
|
92
108
|
end
|
93
109
|
|
94
110
|
|
data/lib/rgeo/geos.rb
CHANGED
@@ -64,6 +64,7 @@ end
|
|
64
64
|
# :stopdoc:
|
65
65
|
|
66
66
|
# Implementation files
|
67
|
+
require 'rgeo/geos/utils'
|
67
68
|
require 'rgeo/geos/factory'
|
68
69
|
require 'rgeo/geos/interface'
|
69
70
|
begin
|
@@ -79,7 +80,6 @@ require 'rgeo/geos/zm_impl'
|
|
79
80
|
begin
|
80
81
|
require 'ffi-geos'
|
81
82
|
::RGeo::Geos::FFI_SUPPORTED = true
|
82
|
-
::RGeo::Geos::FFIUtils._init
|
83
83
|
rescue ::LoadError
|
84
84
|
::RGeo::Geos::FFI_SUPPORTED = false
|
85
85
|
rescue
|
@@ -96,4 +96,7 @@ elsif ::RGeo::Geos::FFI_SUPPORTED
|
|
96
96
|
::RGeo::Geos.preferred_native_interface = :ffi
|
97
97
|
end
|
98
98
|
|
99
|
+
# Init internal utilities
|
100
|
+
::RGeo::Geos::Utils._init
|
101
|
+
|
99
102
|
# :startdoc:
|
@@ -39,66 +39,6 @@ module RGeo
|
|
39
39
|
module Geos
|
40
40
|
|
41
41
|
|
42
|
-
module FFIUtils # :nodoc:
|
43
|
-
|
44
|
-
class << self
|
45
|
-
|
46
|
-
|
47
|
-
def coord_seqs_equal?(cs1_, cs2_, check_z_)
|
48
|
-
len1_ = cs1_.length
|
49
|
-
len2_ = cs2_.length
|
50
|
-
if len1_ == len2_
|
51
|
-
(0...len1_).each do |i_|
|
52
|
-
return false unless cs1_.get_x(i_) == cs2_.get_x(i_) &&
|
53
|
-
cs1_.get_y(i_) == cs2_.get_y(i_) &&
|
54
|
-
(!check_z_ || cs1_.get_z(i_) == cs2_.get_z(i_))
|
55
|
-
end
|
56
|
-
true
|
57
|
-
else
|
58
|
-
false
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
|
63
|
-
def compute_dimension(geom_)
|
64
|
-
result_ = -1
|
65
|
-
case geom_.type_id
|
66
|
-
when ::Geos::GeomTypes::GEOS_POINT
|
67
|
-
result_ = 0
|
68
|
-
when ::Geos::GeomTypes::GEOS_MULTIPOINT
|
69
|
-
result_ = 0 unless geom_.empty?
|
70
|
-
when ::Geos::GeomTypes::GEOS_LINESTRING, ::Geos::GeomTypes::GEOS_LINEARRING
|
71
|
-
result_ = 1
|
72
|
-
when ::Geos::GeomTypes::GEOS_MULTILINESTRING
|
73
|
-
result_ = 1 unless geom_.empty?
|
74
|
-
when ::Geos::GeomTypes::GEOS_POLYGON
|
75
|
-
result_ = 2
|
76
|
-
when ::Geos::GeomTypes::GEOS_MULTIPOLYGON
|
77
|
-
result_ = 2 unless geom_.empty?
|
78
|
-
when ::Geos::GeomTypes::GEOS_GEOMETRYCOLLECTION
|
79
|
-
geom_.each do |g_|
|
80
|
-
dim_ = compute_dimension(g_)
|
81
|
-
result_ = dim_ if result_ < dim_
|
82
|
-
end
|
83
|
-
end
|
84
|
-
result_
|
85
|
-
end
|
86
|
-
|
87
|
-
|
88
|
-
def _init
|
89
|
-
@supports_prepared_level_1 = ::Geos::FFIGeos.respond_to?(:GEOSPreparedContains_r)
|
90
|
-
@supports_prepared_level_2 = ::Geos::FFIGeos.respond_to?(:GEOSPreparedDisjoint_r)
|
91
|
-
end
|
92
|
-
|
93
|
-
attr_reader :supports_prepared_level_1
|
94
|
-
attr_reader :supports_prepared_level_2
|
95
|
-
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
|
101
|
-
|
102
42
|
class FFIGeometryImpl # :nodoc:
|
103
43
|
|
104
44
|
include Feature::Instance
|
@@ -123,7 +63,7 @@ module RGeo
|
|
123
63
|
# Marshal support
|
124
64
|
|
125
65
|
def marshal_dump # :nodoc:
|
126
|
-
[@factory, @factory._write_for_marshal(
|
66
|
+
[@factory, @factory._write_for_marshal(self)]
|
127
67
|
end
|
128
68
|
|
129
69
|
def marshal_load(data_) # :nodoc:
|
@@ -139,7 +79,7 @@ module RGeo
|
|
139
79
|
|
140
80
|
def encode_with(coder_) # :nodoc:
|
141
81
|
coder_['factory'] = @factory
|
142
|
-
str_ = @factory._write_for_psych(
|
82
|
+
str_ = @factory._write_for_psych(self)
|
143
83
|
str_ = str_.encode('US-ASCII') if str_.respond_to?(:encode)
|
144
84
|
coder_['wkt'] = str_
|
145
85
|
end
|
@@ -174,7 +114,7 @@ module RGeo
|
|
174
114
|
|
175
115
|
|
176
116
|
def dimension
|
177
|
-
|
117
|
+
Utils.ffi_compute_dimension(@fg_geom)
|
178
118
|
end
|
179
119
|
|
180
120
|
|
@@ -258,7 +198,7 @@ module RGeo
|
|
258
198
|
def disjoint?(rhs_)
|
259
199
|
fg_ = factory._convert_to_fg_geometry(rhs_)
|
260
200
|
if fg_
|
261
|
-
prep_ = _request_prepared if
|
201
|
+
prep_ = _request_prepared if Utils.ffi_supports_prepared_level_2
|
262
202
|
prep_ ? prep_.disjoint?(fg_) : @fg_geom.disjoint?(fg_)
|
263
203
|
else
|
264
204
|
false
|
@@ -269,7 +209,7 @@ module RGeo
|
|
269
209
|
def intersects?(rhs_)
|
270
210
|
fg_ = factory._convert_to_fg_geometry(rhs_)
|
271
211
|
if fg_
|
272
|
-
prep_ = _request_prepared if
|
212
|
+
prep_ = _request_prepared if Utils.ffi_supports_prepared_level_1
|
273
213
|
prep_ ? prep_.intersects?(fg_) : @fg_geom.intersects?(fg_)
|
274
214
|
else
|
275
215
|
false
|
@@ -280,7 +220,7 @@ module RGeo
|
|
280
220
|
def touches?(rhs_)
|
281
221
|
fg_ = factory._convert_to_fg_geometry(rhs_)
|
282
222
|
if fg_
|
283
|
-
prep_ = _request_prepared if
|
223
|
+
prep_ = _request_prepared if Utils.ffi_supports_prepared_level_2
|
284
224
|
prep_ ? prep_.touches?(fg_) : @fg_geom.touches?(fg_)
|
285
225
|
else
|
286
226
|
false
|
@@ -291,7 +231,7 @@ module RGeo
|
|
291
231
|
def crosses?(rhs_)
|
292
232
|
fg_ = factory._convert_to_fg_geometry(rhs_)
|
293
233
|
if fg_
|
294
|
-
prep_ = _request_prepared if
|
234
|
+
prep_ = _request_prepared if Utils.ffi_supports_prepared_level_2
|
295
235
|
prep_ ? prep_.crosses?(fg_) : @fg_geom.crosses?(fg_)
|
296
236
|
else
|
297
237
|
false
|
@@ -302,7 +242,7 @@ module RGeo
|
|
302
242
|
def within?(rhs_)
|
303
243
|
fg_ = factory._convert_to_fg_geometry(rhs_)
|
304
244
|
if fg_
|
305
|
-
prep_ = _request_prepared if
|
245
|
+
prep_ = _request_prepared if Utils.ffi_supports_prepared_level_2
|
306
246
|
prep_ ? prep_.within?(fg_) : @fg_geom.within?(fg_)
|
307
247
|
else
|
308
248
|
false
|
@@ -313,7 +253,7 @@ module RGeo
|
|
313
253
|
def contains?(rhs_)
|
314
254
|
fg_ = factory._convert_to_fg_geometry(rhs_)
|
315
255
|
if fg_
|
316
|
-
prep_ = _request_prepared if
|
256
|
+
prep_ = _request_prepared if Utils.ffi_supports_prepared_level_1
|
317
257
|
prep_ ? prep_.contains?(fg_) : @fg_geom.contains?(fg_)
|
318
258
|
else
|
319
259
|
false
|
@@ -324,7 +264,7 @@ module RGeo
|
|
324
264
|
def overlaps?(rhs_)
|
325
265
|
fg_ = factory._convert_to_fg_geometry(rhs_)
|
326
266
|
if fg_
|
327
|
-
prep_ = _request_prepared if
|
267
|
+
prep_ = _request_prepared if Utils.ffi_supports_prepared_level_2
|
328
268
|
prep_ ? prep_.overlaps?(fg_) : @fg_geom.overlaps?(fg_)
|
329
269
|
else
|
330
270
|
false
|
@@ -449,7 +389,7 @@ module RGeo
|
|
449
389
|
|
450
390
|
def rep_equals?(rhs_)
|
451
391
|
rhs_.class == self.class && rhs_.factory.eql?(@factory) &&
|
452
|
-
|
392
|
+
Utils.ffi_coord_seqs_equal?(rhs_.fg_geom.coord_seq, @fg_geom.coord_seq, @factory._has_3d)
|
453
393
|
end
|
454
394
|
|
455
395
|
|
@@ -525,7 +465,7 @@ module RGeo
|
|
525
465
|
|
526
466
|
def rep_equals?(rhs_)
|
527
467
|
rhs_.class == self.class && rhs_.factory.eql?(@factory) &&
|
528
|
-
|
468
|
+
Utils.ffi_coord_seqs_equal?(rhs_.fg_geom.coord_seq, @fg_geom.coord_seq, @factory._has_3d)
|
529
469
|
end
|
530
470
|
|
531
471
|
|
@@ -599,12 +599,16 @@ module RGeo
|
|
599
599
|
end
|
600
600
|
|
601
601
|
|
602
|
-
def _write_for_marshal(
|
603
|
-
|
604
|
-
@marshal_wkb_writer
|
605
|
-
|
602
|
+
def _write_for_marshal(geom_) # :nodoc:
|
603
|
+
if Utils.ffi_supports_set_output_dimension || !@_has_3d
|
604
|
+
unless defined?(@marshal_wkb_writer)
|
605
|
+
@marshal_wkb_writer = ::Geos::WkbWriter.new
|
606
|
+
@marshal_wkb_writer.output_dimensions = 3 if @_has_3d
|
607
|
+
end
|
608
|
+
@marshal_wkb_writer.write(geom_.fg_geom)
|
609
|
+
else
|
610
|
+
Utils.marshal_wkb_generator.generate(geom_)
|
606
611
|
end
|
607
|
-
@marshal_wkb_writer.write(obj_)
|
608
612
|
end
|
609
613
|
|
610
614
|
|
@@ -616,12 +620,16 @@ module RGeo
|
|
616
620
|
end
|
617
621
|
|
618
622
|
|
619
|
-
def _write_for_psych(
|
620
|
-
|
621
|
-
@psych_wkt_writer
|
622
|
-
|
623
|
+
def _write_for_psych(geom_) # :nodoc:
|
624
|
+
if Utils.ffi_supports_set_output_dimension || !@_has_3d
|
625
|
+
unless defined?(@psych_wkt_writer)
|
626
|
+
@psych_wkt_writer = ::Geos::WktWriter.new
|
627
|
+
@psych_wkt_writer.output_dimensions = 3 if @_has_3d
|
628
|
+
end
|
629
|
+
@psych_wkt_writer.write(geom_.fg_geom)
|
630
|
+
else
|
631
|
+
Utils.psych_wkt_generator.generate(geom_)
|
623
632
|
end
|
624
|
-
@psych_wkt_writer.write(obj_)
|
625
633
|
end
|
626
634
|
|
627
635
|
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# -----------------------------------------------------------------------------
|
2
|
+
#
|
3
|
+
# Various Geos-related internal utilities
|
4
|
+
#
|
5
|
+
# -----------------------------------------------------------------------------
|
6
|
+
# Copyright 2010-2012 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
|
+
module RGeo
|
38
|
+
|
39
|
+
module Geos
|
40
|
+
|
41
|
+
|
42
|
+
module Utils # :nodoc:
|
43
|
+
|
44
|
+
class << self
|
45
|
+
|
46
|
+
|
47
|
+
def ffi_coord_seqs_equal?(cs1_, cs2_, check_z_)
|
48
|
+
len1_ = cs1_.length
|
49
|
+
len2_ = cs2_.length
|
50
|
+
if len1_ == len2_
|
51
|
+
(0...len1_).each do |i_|
|
52
|
+
return false unless cs1_.get_x(i_) == cs2_.get_x(i_) &&
|
53
|
+
cs1_.get_y(i_) == cs2_.get_y(i_) &&
|
54
|
+
(!check_z_ || cs1_.get_z(i_) == cs2_.get_z(i_))
|
55
|
+
end
|
56
|
+
true
|
57
|
+
else
|
58
|
+
false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def ffi_compute_dimension(geom_)
|
64
|
+
result_ = -1
|
65
|
+
case geom_.type_id
|
66
|
+
when ::Geos::GeomTypes::GEOS_POINT
|
67
|
+
result_ = 0
|
68
|
+
when ::Geos::GeomTypes::GEOS_MULTIPOINT
|
69
|
+
result_ = 0 unless geom_.empty?
|
70
|
+
when ::Geos::GeomTypes::GEOS_LINESTRING, ::Geos::GeomTypes::GEOS_LINEARRING
|
71
|
+
result_ = 1
|
72
|
+
when ::Geos::GeomTypes::GEOS_MULTILINESTRING
|
73
|
+
result_ = 1 unless geom_.empty?
|
74
|
+
when ::Geos::GeomTypes::GEOS_POLYGON
|
75
|
+
result_ = 2
|
76
|
+
when ::Geos::GeomTypes::GEOS_MULTIPOLYGON
|
77
|
+
result_ = 2 unless geom_.empty?
|
78
|
+
when ::Geos::GeomTypes::GEOS_GEOMETRYCOLLECTION
|
79
|
+
geom_.each do |g_|
|
80
|
+
dim_ = ffi_compute_dimension(g_)
|
81
|
+
result_ = dim_ if result_ < dim_
|
82
|
+
end
|
83
|
+
end
|
84
|
+
result_
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
def _init
|
89
|
+
if FFI_SUPPORTED
|
90
|
+
@ffi_supports_prepared_level_1 = ::Geos::FFIGeos.respond_to?(:GEOSPreparedContains_r)
|
91
|
+
@ffi_supports_prepared_level_2 = ::Geos::FFIGeos.respond_to?(:GEOSPreparedDisjoint_r)
|
92
|
+
@ffi_supports_set_output_dimension = ::Geos::FFIGeos.respond_to?(:GEOSWKTWriter_setOutputDimension_r)
|
93
|
+
end
|
94
|
+
@psych_wkt_generator = WKRep::WKTGenerator.new(:convert_case => :upper)
|
95
|
+
@marshal_wkb_generator = WKRep::WKBGenerator.new
|
96
|
+
end
|
97
|
+
|
98
|
+
attr_reader :ffi_supports_prepared_level_1
|
99
|
+
attr_reader :ffi_supports_prepared_level_2
|
100
|
+
attr_reader :ffi_supports_set_output_dimension
|
101
|
+
attr_reader :psych_wkt_generator
|
102
|
+
attr_reader :marshal_wkb_generator
|
103
|
+
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
@@ -48,9 +48,9 @@ module RGeo
|
|
48
48
|
@factory = create_factory
|
49
49
|
point1_ = @factory.point(0, 0)
|
50
50
|
point2_ = @factory.point(1, 0)
|
51
|
-
point3_ = @factory.point(-4, 2)
|
52
|
-
point4_ = @factory.point(-5, 3)
|
53
|
-
point5_ = @factory.point(-3, 5)
|
51
|
+
point3_ = @factory.point(-4, 2) # (-4, 2)
|
52
|
+
point4_ = @factory.point(-7, 6) # (-5, 3)
|
53
|
+
point5_ = @factory.point(5, 11) # (-3, 5)
|
54
54
|
@linestring1 = @factory.line_string([point1_, point2_])
|
55
55
|
@linestring2 = @factory.line_string([point3_, point4_, point5_])
|
56
56
|
@linearring1 = @factory.linear_ring([point5_, point3_, point4_, point5_])
|
@@ -137,7 +137,7 @@ module RGeo
|
|
137
137
|
|
138
138
|
|
139
139
|
def test_wkt_creation_simple
|
140
|
-
parsed_geom_ = @factory.parse_wkt('MULTILINESTRING((0 0, 1 0), (-4 2, -
|
140
|
+
parsed_geom_ = @factory.parse_wkt('MULTILINESTRING((0 0, 1 0), (-4 2, -7 6, 5 11))')
|
141
141
|
built_geom_ = @factory.multi_line_string([@linestring1, @linestring2])
|
142
142
|
assert(built_geom_.eql?(parsed_geom_))
|
143
143
|
end
|
@@ -210,6 +210,14 @@ module RGeo
|
|
210
210
|
end
|
211
211
|
|
212
212
|
|
213
|
+
def test_length
|
214
|
+
geom1_ = @factory.multi_line_string([@linestring1, @linestring2])
|
215
|
+
assert_equal(19, geom1_.length)
|
216
|
+
geom2_ = @factory.multi_line_string([])
|
217
|
+
assert_equal(0, geom2_.length)
|
218
|
+
end
|
219
|
+
|
220
|
+
|
213
221
|
end
|
214
222
|
|
215
223
|
end
|
data/test/coord_sys/tc_proj4.rb
CHANGED
@@ -81,7 +81,9 @@ module RGeo
|
|
81
81
|
|
82
82
|
|
83
83
|
def _assert_close_enough(a_, b_)
|
84
|
-
|
84
|
+
delta_ = ::Math.sqrt(a_*a_+b_*b_)*0.00000001
|
85
|
+
delta_ = 0.000000000001 if delta_ < 0.000000000001
|
86
|
+
assert_in_delta(a_, b_, delta_)
|
85
87
|
end
|
86
88
|
|
87
89
|
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# -----------------------------------------------------------------------------
|
2
|
+
#
|
3
|
+
# Tests for basic GeoJSON usage
|
4
|
+
#
|
5
|
+
# -----------------------------------------------------------------------------
|
6
|
+
# Copyright 2010-2012 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
|
+
require 'test/unit'
|
38
|
+
require 'rgeo'
|
39
|
+
|
40
|
+
|
41
|
+
module RGeo
|
42
|
+
module Tests # :nodoc:
|
43
|
+
|
44
|
+
class TestCartesianBBox < ::Test::Unit::TestCase # :nodoc:
|
45
|
+
|
46
|
+
|
47
|
+
def setup
|
48
|
+
@factory = ::RGeo::Cartesian.factory
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def test_empty_bbox
|
53
|
+
bbox_ = ::RGeo::Cartesian::BoundingBox.new(@factory)
|
54
|
+
assert_equal(true, bbox_.empty?)
|
55
|
+
assert_equal(false, bbox_.has_z)
|
56
|
+
assert_nil(bbox_.min_x)
|
57
|
+
assert_equal(@factory, bbox_.factory)
|
58
|
+
assert_nil(bbox_.min_point)
|
59
|
+
assert_equal(true, bbox_.to_geometry.is_empty?)
|
60
|
+
assert_equal(true, bbox_.contains?(bbox_))
|
61
|
+
assert_equal(false, bbox_.contains?(@factory.point(1, 1)))
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def test_point_bbox
|
66
|
+
empty_bbox_ = ::RGeo::Cartesian::BoundingBox.new(@factory)
|
67
|
+
bbox_ = ::RGeo::Cartesian::BoundingBox.new(@factory)
|
68
|
+
bbox_.add(@factory.point(1, 1))
|
69
|
+
assert_equal(false, bbox_.empty?)
|
70
|
+
assert_equal(false, bbox_.has_z)
|
71
|
+
assert_equal(1.0, bbox_.min_x)
|
72
|
+
assert_equal(1.0, bbox_.min_y)
|
73
|
+
assert_equal(1.0, bbox_.max_x)
|
74
|
+
assert_equal(1.0, bbox_.max_y)
|
75
|
+
assert_equal(@factory, bbox_.factory)
|
76
|
+
assert_equal(@factory.point(1, 1), bbox_.min_point)
|
77
|
+
assert_equal(@factory.point(1, 1), bbox_.max_point)
|
78
|
+
assert_equal(@factory.point(1, 1), bbox_.to_geometry)
|
79
|
+
assert_equal(true, bbox_.contains?(empty_bbox_))
|
80
|
+
assert_equal(false, empty_bbox_.contains?(bbox_))
|
81
|
+
assert_equal(true, bbox_.contains?(@factory.point(1, 1)))
|
82
|
+
assert_equal(false, bbox_.contains?(@factory.point(2, 1)))
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
def test_rect_bbox
|
87
|
+
empty_bbox_ = ::RGeo::Cartesian::BoundingBox.new(@factory)
|
88
|
+
bbox_ = ::RGeo::Cartesian::BoundingBox.new(@factory)
|
89
|
+
bbox_.add(@factory.point(1, 4))
|
90
|
+
bbox_.add(@factory.point(2, 3))
|
91
|
+
assert_equal(false, bbox_.empty?)
|
92
|
+
assert_equal(false, bbox_.has_z)
|
93
|
+
assert_equal(1.0, bbox_.min_x)
|
94
|
+
assert_equal(3.0, bbox_.min_y)
|
95
|
+
assert_equal(2.0, bbox_.max_x)
|
96
|
+
assert_equal(4.0, bbox_.max_y)
|
97
|
+
assert_equal(@factory, bbox_.factory)
|
98
|
+
assert_equal(@factory.point(1, 3), bbox_.min_point)
|
99
|
+
assert_equal(@factory.point(2, 4), bbox_.max_point)
|
100
|
+
assert_equal(1.0, bbox_.to_geometry.area)
|
101
|
+
assert_equal(true, bbox_.contains?(empty_bbox_))
|
102
|
+
assert_equal(false, empty_bbox_.contains?(bbox_))
|
103
|
+
assert_equal(true, bbox_.contains?(@factory.point(1, 3)))
|
104
|
+
assert_equal(false, bbox_.contains?(@factory.point(2, 1)))
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def test_bbox_from_points
|
109
|
+
bbox_ = ::RGeo::Cartesian::BoundingBox.new(@factory)
|
110
|
+
bbox_.add(@factory.point(1, 4))
|
111
|
+
bbox_.add(@factory.point(2, 3))
|
112
|
+
bbox2_ = ::RGeo::Cartesian::BoundingBox.create_from_points(
|
113
|
+
@factory.point(2, 3), @factory.point(1, 4))
|
114
|
+
assert_equal(bbox_, bbox2_)
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgeo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-11 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: RGeo is a geospatial data library for Ruby. It provides an implementation
|
15
15
|
of the Open Geospatial Consortium's Simple Features Specification, used by most
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/rgeo/geos/ffi_factory.rb
|
81
81
|
- lib/rgeo/geos/impl_additions.rb
|
82
82
|
- lib/rgeo/geos/interface.rb
|
83
|
+
- lib/rgeo/geos/utils.rb
|
83
84
|
- lib/rgeo/geos/zm_factory.rb
|
84
85
|
- lib/rgeo/geos/zm_impl.rb
|
85
86
|
- lib/rgeo/geos.rb
|
@@ -188,6 +189,7 @@ files:
|
|
188
189
|
- test/spherical_geographic/tc_point.rb
|
189
190
|
- test/spherical_geographic/tc_polygon.rb
|
190
191
|
- test/tc_cartesian_analysis.rb
|
192
|
+
- test/tc_cartesian_bbox.rb
|
191
193
|
- test/tc_mixins.rb
|
192
194
|
- test/tc_oneoff.rb
|
193
195
|
- test/tc_types.rb
|
@@ -288,6 +290,7 @@ test_files:
|
|
288
290
|
- test/spherical_geographic/tc_point.rb
|
289
291
|
- test/spherical_geographic/tc_polygon.rb
|
290
292
|
- test/tc_cartesian_analysis.rb
|
293
|
+
- test/tc_cartesian_bbox.rb
|
291
294
|
- test/tc_mixins.rb
|
292
295
|
- test/tc_oneoff.rb
|
293
296
|
- test/tc_types.rb
|