geos-extensions 0.1.3 → 0.1.4
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/Rakefile +9 -1
- data/VERSION +1 -1
- data/geos-extensions.gemspec +19 -17
- data/lib/geos/active_record_extensions/geospatial_scopes.rb +45 -15
- data/lib/geos/google_maps/polyline_encoder.rb +42 -0
- data/lib/geos_extensions.rb +57 -29
- data/test/{adapter_test.rb → adapter_tests.rb} +0 -0
- data/test/{geometry_columns_test.rb → geometry_columns_tests.rb} +0 -0
- data/test/{geospatial_scopes_test.rb → geospatial_scopes_tests.rb} +16 -0
- data/test/{google_maps_api_2_test.rb → google_maps_api_2_tests.rb} +6 -6
- data/test/{google_maps_api_3_test.rb → google_maps_api_3_tests.rb} +2 -2
- data/test/google_maps_polyline_encoder_tests.rb +32 -0
- data/test/misc_tests.rb +105 -0
- data/test/{reader_test.rb → reader_tests.rb} +0 -0
- data/test/test_helper.rb +7 -2
- data/test/{writer_test.rb → writer_tests.rb} +4 -4
- metadata +12 -10
data/Rakefile
CHANGED
@@ -6,6 +6,14 @@ require 'rubygems/package_task'
|
|
6
6
|
require 'rake/testtask'
|
7
7
|
require 'rdoc/task'
|
8
8
|
|
9
|
+
if RUBY_VERSION >= '1.9'
|
10
|
+
begin
|
11
|
+
gem 'psych'
|
12
|
+
rescue Exception => e
|
13
|
+
# it's okay, fall back on the bundled psych
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
9
17
|
$:.push 'lib'
|
10
18
|
|
11
19
|
version = File.read('VERSION') rescue ''
|
@@ -27,7 +35,7 @@ end
|
|
27
35
|
|
28
36
|
desc 'Test GEOS interface'
|
29
37
|
Rake::TestTask.new(:test) do |t|
|
30
|
-
t.
|
38
|
+
t.test_files = FileList['test/**/*_tests.rb']
|
31
39
|
t.verbose = false
|
32
40
|
end
|
33
41
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
data/geos-extensions.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.1.
|
7
|
+
s.name = "geos-extensions"
|
8
|
+
s.version = "0.1.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
11
|
+
s.authors = ["J Smith"]
|
12
|
+
s.date = "2011-11-09"
|
13
|
+
s.description = "Extensions for the GEOS library."
|
14
|
+
s.email = "code@zoocasa.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"README.rdoc"
|
17
17
|
]
|
@@ -36,20 +36,22 @@ Gem::Specification.new do |s|
|
|
36
36
|
"lib/geos/rails/engine.rb",
|
37
37
|
"lib/geos_extensions.rb",
|
38
38
|
"lib/tasks/test.rake",
|
39
|
-
"test/
|
39
|
+
"test/adapter_tests.rb",
|
40
40
|
"test/fixtures/foos.yml",
|
41
|
-
"test/
|
42
|
-
"test/
|
43
|
-
"test/
|
44
|
-
"test/
|
45
|
-
"test/
|
41
|
+
"test/geometry_columns_tests.rb",
|
42
|
+
"test/geospatial_scopes_tests.rb",
|
43
|
+
"test/google_maps_api_2_tests.rb",
|
44
|
+
"test/google_maps_api_3_tests.rb",
|
45
|
+
"test/google_maps_polyline_encoder_tests.rb",
|
46
|
+
"test/misc_tests.rb",
|
47
|
+
"test/reader_tests.rb",
|
46
48
|
"test/test_helper.rb",
|
47
|
-
"test/
|
49
|
+
"test/writer_tests.rb"
|
48
50
|
]
|
49
|
-
s.homepage =
|
50
|
-
s.require_paths = [
|
51
|
-
s.rubygems_version =
|
52
|
-
s.summary =
|
51
|
+
s.homepage = "http://github.com/zoocasa/geos-extensions"
|
52
|
+
s.require_paths = ["lib"]
|
53
|
+
s.rubygems_version = "1.8.11"
|
54
|
+
s.summary = "Extensions for the GEOS library."
|
53
55
|
|
54
56
|
if s.respond_to? :specification_version then
|
55
57
|
s.specification_version = 3
|
@@ -22,6 +22,7 @@ module Geos
|
|
22
22
|
# * st_touches
|
23
23
|
# * st_within
|
24
24
|
# * st_dwithin
|
25
|
+
# * st_dfullywithin
|
25
26
|
#
|
26
27
|
# The first argument to each of these methods can be a Geos::Geometry-based
|
27
28
|
# object or anything readable by Geos.read along with an optional
|
@@ -81,6 +82,9 @@ module Geos
|
|
81
82
|
# * :nulls - the order_by scopes also allow you to specify whether you
|
82
83
|
# want NULL values to be sorted first or last.
|
83
84
|
#
|
85
|
+
# Because it's quite common to only want to flip the ordering to DESC,
|
86
|
+
# you can also just pass :desc on its own rather than as an options Hash.
|
87
|
+
#
|
84
88
|
# == SRID Detection
|
85
89
|
#
|
86
90
|
# * if the geometry itself has an SRID, we'll compare it to the
|
@@ -117,6 +121,7 @@ module Geos
|
|
117
121
|
}.freeze
|
118
122
|
|
119
123
|
ZERO_ARGUMENT_MEASUREMENTS = %w{
|
124
|
+
area
|
120
125
|
ndims
|
121
126
|
npoints
|
122
127
|
nrings
|
@@ -138,6 +143,11 @@ module Geos
|
|
138
143
|
maxdistance
|
139
144
|
}
|
140
145
|
|
146
|
+
ONE_GEOMETRY_ARGUMENT_AND_ONE_ARGUMENT_RELATIONSHIPS = %w{
|
147
|
+
dwithin
|
148
|
+
dfullywithin
|
149
|
+
}
|
150
|
+
|
141
151
|
ONE_ARGUMENT_MEASUREMENTS = %w{
|
142
152
|
length2d_spheroid
|
143
153
|
length3d_spheroid
|
@@ -177,10 +187,19 @@ module Geos
|
|
177
187
|
end
|
178
188
|
end
|
179
189
|
|
180
|
-
def default_options(
|
190
|
+
def default_options(*args)
|
191
|
+
options = args.extract_options!
|
192
|
+
|
193
|
+
desc = if args.first == :desc
|
194
|
+
true
|
195
|
+
else
|
196
|
+
options[:desc]
|
197
|
+
end
|
198
|
+
|
181
199
|
{
|
182
200
|
:column => 'the_geom',
|
183
|
-
:use_index => true
|
201
|
+
:use_index => true,
|
202
|
+
:desc => desc
|
184
203
|
}.merge(options || {})
|
185
204
|
end
|
186
205
|
|
@@ -221,11 +240,17 @@ module Geos
|
|
221
240
|
end
|
222
241
|
end
|
223
242
|
|
224
|
-
def additional_ordering(
|
225
|
-
options
|
243
|
+
def additional_ordering(*args)
|
244
|
+
options = args.extract_options!
|
245
|
+
|
246
|
+
desc = if args.first == :desc
|
247
|
+
true
|
248
|
+
else
|
249
|
+
options[:desc]
|
250
|
+
end
|
226
251
|
|
227
252
|
''.tap do |ret|
|
228
|
-
if
|
253
|
+
if desc
|
229
254
|
ret << ' DESC'
|
230
255
|
end
|
231
256
|
|
@@ -258,19 +283,24 @@ module Geos
|
|
258
283
|
base.class_eval(src, __FILE__, line)
|
259
284
|
end
|
260
285
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
286
|
+
ONE_GEOMETRY_ARGUMENT_AND_ONE_ARGUMENT_RELATIONSHIPS.each do |relationship|
|
287
|
+
src, line = <<-EOF, __LINE__ + 1
|
288
|
+
#{SCOPE_METHOD} :st_#{relationship}, lambda { |*args|
|
289
|
+
assert_arguments_length(args, 2, 3)
|
290
|
+
geom, distance, options = args
|
265
291
|
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
292
|
+
{
|
293
|
+
:conditions => [
|
294
|
+
build_function_call('#{relationship}', geom, options, :additional_args => 1),
|
295
|
+
distance
|
296
|
+
]
|
297
|
+
}
|
271
298
|
}
|
272
|
-
|
299
|
+
EOF
|
300
|
+
base.class_eval(src, __FILE__, line)
|
301
|
+
end
|
273
302
|
|
303
|
+
base.class_eval do
|
274
304
|
send(SCOPE_METHOD, :st_geometry_type, lambda { |*args|
|
275
305
|
assert_arguments_length(args, 1)
|
276
306
|
options = args.extract_options!
|
@@ -12,6 +12,10 @@ module Geos
|
|
12
12
|
# The level parameter is the zoom level you're encoding at. See the
|
13
13
|
# Google Maps API reference for details on that.
|
14
14
|
def encode(points, level = 3)
|
15
|
+
if points.is_a?(Geos::LineString)
|
16
|
+
points = points.coord_seq
|
17
|
+
end
|
18
|
+
|
15
19
|
encoded_points = String.new
|
16
20
|
encoded_levels = String.new
|
17
21
|
|
@@ -35,6 +39,25 @@ module Geos
|
|
35
39
|
{ :points => encoded_points, :levels => encoded_levels }
|
36
40
|
end
|
37
41
|
|
42
|
+
def decode(encoded)
|
43
|
+
retval = []
|
44
|
+
index = 0
|
45
|
+
lat = 0
|
46
|
+
lng = 0
|
47
|
+
|
48
|
+
while (index < encoded.length)
|
49
|
+
shift = 0
|
50
|
+
result = 0
|
51
|
+
|
52
|
+
index, lat = decode_number(encoded, lat, index)
|
53
|
+
index, lng = decode_number(encoded, lng, index)
|
54
|
+
|
55
|
+
retval.push([ lng * 1e-5, lat * 1e-5])
|
56
|
+
end
|
57
|
+
|
58
|
+
retval
|
59
|
+
end
|
60
|
+
|
38
61
|
protected
|
39
62
|
|
40
63
|
# Encodes a signed number into the Google Maps encoded polyline format.
|
@@ -44,6 +67,25 @@ module Geos
|
|
44
67
|
encode_number signed
|
45
68
|
end
|
46
69
|
|
70
|
+
# Decodes a lat or lng value based on the index and the previous
|
71
|
+
# value.
|
72
|
+
def decode_number(encoded, last, index) #:nodoc:
|
73
|
+
shift = 0
|
74
|
+
result = 0
|
75
|
+
|
76
|
+
begin
|
77
|
+
b = encoded[index].ord - 63
|
78
|
+
index += 1
|
79
|
+
result = result | ((b & 0x1f) << shift)
|
80
|
+
shift += 5
|
81
|
+
end while (b >= 0x20)
|
82
|
+
|
83
|
+
[
|
84
|
+
index,
|
85
|
+
last + ((result & 1) != 0 ? ~(result >> 1) : (result >> 1))
|
86
|
+
]
|
87
|
+
end
|
88
|
+
|
47
89
|
# Encodes a number into the Google Maps encoded polyline format.
|
48
90
|
def encode_number(n) #:nodoc:
|
49
91
|
str = String.new
|
data/lib/geos_extensions.rb
CHANGED
@@ -221,7 +221,7 @@ module Geos
|
|
221
221
|
|
222
222
|
# Returns a Point for the envelope's upper left coordinate.
|
223
223
|
def upper_left
|
224
|
-
if @upper_left
|
224
|
+
if defined?(@upper_left)
|
225
225
|
@upper_left
|
226
226
|
else
|
227
227
|
cs = self.envelope.exterior_ring.coord_seq
|
@@ -233,11 +233,11 @@ module Geos
|
|
233
233
|
|
234
234
|
# Returns a Point for the envelope's upper right coordinate.
|
235
235
|
def upper_right
|
236
|
-
if @upper_right
|
236
|
+
if defined?(@upper_right)
|
237
237
|
@upper_right
|
238
238
|
else
|
239
239
|
cs = self.envelope.exterior_ring.coord_seq
|
240
|
-
@upper_right
|
240
|
+
@upper_right = Geos::wkt_reader_singleton.read("POINT(#{cs.get_x(2)} #{cs.get_y(2)})")
|
241
241
|
end
|
242
242
|
end
|
243
243
|
alias :ne :upper_right
|
@@ -245,11 +245,11 @@ module Geos
|
|
245
245
|
|
246
246
|
# Returns a Point for the envelope's lower right coordinate.
|
247
247
|
def lower_right
|
248
|
-
if @lower_right
|
248
|
+
if defined?(@lower_right)
|
249
249
|
@lower_right
|
250
250
|
else
|
251
251
|
cs = self.envelope.exterior_ring.coord_seq
|
252
|
-
@lower_right
|
252
|
+
@lower_right = Geos::wkt_reader_singleton.read("POINT(#{cs.get_x(1)} #{cs.get_y(1)})")
|
253
253
|
end
|
254
254
|
end
|
255
255
|
alias :se :lower_right
|
@@ -257,11 +257,11 @@ module Geos
|
|
257
257
|
|
258
258
|
# Returns a Point for the envelope's lower left coordinate.
|
259
259
|
def lower_left
|
260
|
-
if @lower_left
|
260
|
+
if defined?(@lower_left)
|
261
261
|
@lower_left
|
262
262
|
else
|
263
263
|
cs = self.envelope.exterior_ring.coord_seq
|
264
|
-
@lower_left
|
264
|
+
@lower_left = Geos::wkt_reader_singleton.read("POINT(#{cs.get_x(0)} #{cs.get_y(0)})")
|
265
265
|
end
|
266
266
|
end
|
267
267
|
alias :sw :lower_left
|
@@ -269,28 +269,44 @@ module Geos
|
|
269
269
|
|
270
270
|
# Northern-most Y coordinate.
|
271
271
|
def top
|
272
|
-
@top
|
272
|
+
if defined?(@top)
|
273
|
+
@top
|
274
|
+
else
|
275
|
+
@top = self.upper_right.y
|
276
|
+
end
|
273
277
|
end
|
274
278
|
alias :n :top
|
275
279
|
alias :north :top
|
276
280
|
|
277
281
|
# Eastern-most X coordinate.
|
278
282
|
def right
|
279
|
-
@right
|
283
|
+
if defined?(@right)
|
284
|
+
@right
|
285
|
+
else
|
286
|
+
@right = self.upper_right.x
|
287
|
+
end
|
280
288
|
end
|
281
289
|
alias :e :right
|
282
290
|
alias :east :right
|
283
291
|
|
284
292
|
# Southern-most Y coordinate.
|
285
293
|
def bottom
|
286
|
-
@bottom
|
294
|
+
if defined?(@bottom)
|
295
|
+
@bottom
|
296
|
+
else
|
297
|
+
@bottom = self.lower_left.y
|
298
|
+
end
|
287
299
|
end
|
288
300
|
alias :s :bottom
|
289
301
|
alias :south :bottom
|
290
302
|
|
291
303
|
# Western-most X coordinate.
|
292
304
|
def left
|
293
|
-
@left
|
305
|
+
if defined?(@left)
|
306
|
+
@left
|
307
|
+
else
|
308
|
+
@left = self.lower_left.x
|
309
|
+
end
|
294
310
|
end
|
295
311
|
alias :w :left
|
296
312
|
alias :west :left
|
@@ -393,21 +409,31 @@ module Geos
|
|
393
409
|
|
394
410
|
|
395
411
|
class Point
|
396
|
-
# Returns the Y coordinate of the Point
|
397
|
-
|
398
|
-
def lat
|
412
|
+
# Returns the Y coordinate of the Point.
|
413
|
+
def y
|
399
414
|
self.to_a[1]
|
400
415
|
end
|
401
|
-
alias :latitude :lat
|
402
|
-
alias :y :lat
|
403
416
|
|
404
|
-
|
405
|
-
|
406
|
-
|
417
|
+
%w{
|
418
|
+
latitude lat north south n s
|
419
|
+
}.each do |name|
|
420
|
+
self.class_eval(<<-EOF, __FILE__, __LINE__ + 1)
|
421
|
+
alias #{name} :y
|
422
|
+
EOF
|
423
|
+
end
|
424
|
+
|
425
|
+
# Returns the X coordinate of the Point.
|
426
|
+
def x
|
407
427
|
self.to_a[0]
|
408
428
|
end
|
409
|
-
|
410
|
-
|
429
|
+
|
430
|
+
%w{
|
431
|
+
longitude lng east west e w
|
432
|
+
}.each do |name|
|
433
|
+
self.class_eval(<<-EOF, __FILE__, __LINE__ + 1)
|
434
|
+
alias #{name} :x
|
435
|
+
EOF
|
436
|
+
end
|
411
437
|
|
412
438
|
# Returns the Z coordinate of the Point.
|
413
439
|
def z
|
@@ -425,27 +451,29 @@ module Geos
|
|
425
451
|
# The Z coordinate will only be present for Points which have a Z
|
426
452
|
# dimension.
|
427
453
|
def to_a
|
428
|
-
|
429
|
-
|
430
|
-
[ cs.get_x(0), cs.get_y(0), cs.get_z(0) ]
|
454
|
+
if defined?(@to_a)
|
455
|
+
@to_a
|
431
456
|
else
|
432
|
-
|
457
|
+
cs = self.coord_seq
|
458
|
+
@to_a = if self.has_z?
|
459
|
+
[ cs.get_x(0), cs.get_y(0), cs.get_z(0) ]
|
460
|
+
else
|
461
|
+
[ cs.get_x(0), cs.get_y(0) ]
|
462
|
+
end
|
433
463
|
end
|
434
464
|
end
|
435
465
|
|
436
466
|
# Optimize some unnecessary code away:
|
437
467
|
%w{
|
438
468
|
upper_left upper_right lower_right lower_left
|
439
|
-
top bottom right left
|
440
|
-
n s e w
|
441
469
|
ne nw se sw
|
470
|
+
northwest northeast southeast southwest
|
442
471
|
}.each do |name|
|
443
|
-
|
472
|
+
self.class_eval(<<-EOF, __FILE__, __LINE__ + 1)
|
444
473
|
def #{name}
|
445
474
|
self
|
446
475
|
end
|
447
476
|
EOF
|
448
|
-
self.class_eval(src, __FILE__, line)
|
449
477
|
end
|
450
478
|
|
451
479
|
# Build some XmlMarkup for KML. You can set KML options for extrude and
|
File without changes
|
File without changes
|
@@ -67,6 +67,10 @@ if ENV['TEST_ACTIVERECORD']
|
|
67
67
|
ids_tester(:st_dwithin, [ 'POINT(5 5)', 10 ], [ 1, 2, 3 ])
|
68
68
|
end
|
69
69
|
|
70
|
+
def test_dfullywithin
|
71
|
+
ids_tester(:st_dfullywithin, [ 'POINT(5 5)', 10 ], [ 1, 2 ])
|
72
|
+
end
|
73
|
+
|
70
74
|
def test_geometry_type
|
71
75
|
ids_tester(:st_geometry_type, 'ST_Point', [ 1, 2 ])
|
72
76
|
ids_tester(:st_geometry_type, [ 'ST_Point', 'ST_Polygon' ], [ 1, 2, 3 ])
|
@@ -124,6 +128,14 @@ if ENV['TEST_ACTIVERECORD']
|
|
124
128
|
assert_equal([2, 3, 1], Foo.order_by_maxdistance('POINT(1 1)', :desc => true).all.collect(&:id))
|
125
129
|
end
|
126
130
|
|
131
|
+
def test_order_by_area
|
132
|
+
assert_equal([1, 2, 3], Foo.order_by_area.order('id').all.collect(&:id))
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_order_by_area_desc
|
136
|
+
assert_equal([3, 1, 2], Foo.order_by_area(:desc => true).order('id').all.collect(&:id))
|
137
|
+
end
|
138
|
+
|
127
139
|
def test_order_by_ndims
|
128
140
|
assert_equal([1, 2, 3], Foo.order_by_ndims.order('id').all.collect(&:id))
|
129
141
|
end
|
@@ -273,5 +285,9 @@ if ENV['TEST_ACTIVERECORD']
|
|
273
285
|
def test_order_by_distance_spheroid_desc
|
274
286
|
assert_equal([1, 3, 2], Foo.order_by_distance_spheroid('POINT(10 10)', 'SPHEROID["WGS 84", 6378137, 298.257223563]', :desc => true).order('id').all.collect(&:id))
|
275
287
|
end
|
288
|
+
|
289
|
+
def test_order_by_area_with_desc_symbol
|
290
|
+
assert_equal([3, 1, 2], Foo.order_by_area(:desc).order('id').all.collect(&:id))
|
291
|
+
end
|
276
292
|
end
|
277
293
|
end
|
@@ -115,8 +115,8 @@ class GoogleMapsApi2Tests < Test::Unit::TestCase
|
|
115
115
|
[ $1, $2, $3 ]
|
116
116
|
end
|
117
117
|
|
118
|
-
assert_in_delta(
|
119
|
-
assert_in_delta(
|
118
|
+
assert_in_delta(10.00, lng.to_f, 0.000001)
|
119
|
+
assert_in_delta(10.01, lat.to_f, 0.000001)
|
120
120
|
assert_equal(
|
121
121
|
{},
|
122
122
|
JSON.load(json)
|
@@ -138,8 +138,8 @@ class GoogleMapsApi2Tests < Test::Unit::TestCase
|
|
138
138
|
[ $1, $2, $3 ]
|
139
139
|
end
|
140
140
|
|
141
|
-
assert_in_delta(
|
142
|
-
assert_in_delta(
|
141
|
+
assert_in_delta(10.00, lng.to_f, 0.000001)
|
142
|
+
assert_in_delta(10.01, lat.to_f, 0.000001)
|
143
143
|
assert_equal(
|
144
144
|
{},
|
145
145
|
JSON.load(json)
|
@@ -165,8 +165,8 @@ class GoogleMapsApi2Tests < Test::Unit::TestCase
|
|
165
165
|
[ $1, $2, $3 ]
|
166
166
|
end
|
167
167
|
|
168
|
-
assert_in_delta(
|
169
|
-
assert_in_delta(
|
168
|
+
assert_in_delta(10.00, lng.to_f, 0.000001)
|
169
|
+
assert_in_delta(10.01, lat.to_f, 0.000001)
|
170
170
|
assert_equal(
|
171
171
|
{ "bounceGravity" => 1, "bouncy" => true },
|
172
172
|
JSON.load(json)
|
@@ -160,8 +160,8 @@ class GoogleMapsApi3Tests < Test::Unit::TestCase
|
|
160
160
|
[ $1, $2, $3 ]
|
161
161
|
end
|
162
162
|
|
163
|
-
assert_in_delta(
|
164
|
-
assert_in_delta(
|
163
|
+
assert_in_delta(10.00, lng.to_f, 0.000001)
|
164
|
+
assert_in_delta(10.01, lat.to_f, 0.000001)
|
165
165
|
end
|
166
166
|
|
167
167
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
$: << File.dirname(__FILE__)
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GoogleMapsPolylineEncoderTests < Test::Unit::TestCase
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
ENCODED = '_p~iF~ps|U_ulLnnqC_mqNvxq`@'
|
9
|
+
DECODED = [
|
10
|
+
[ -120.2, 38.5 ],
|
11
|
+
[ -120.95, 40.7 ],
|
12
|
+
[ -126.453, 43.252 ]
|
13
|
+
]
|
14
|
+
|
15
|
+
def test_encode
|
16
|
+
linestring = Geos.read("LINESTRING(#{DECODED.collect { |d| d.join(' ') }.join(', ')})")
|
17
|
+
|
18
|
+
assert_equal(ENCODED, Geos::GoogleMaps::PolylineEncoder.encode(linestring)[:points])
|
19
|
+
assert_equal(ENCODED,
|
20
|
+
Geos::GoogleMaps::PolylineEncoder.encode(DECODED)[:points]
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_decode
|
25
|
+
decoded = Geos::GoogleMaps::PolylineEncoder.decode(ENCODED)
|
26
|
+
|
27
|
+
decoded.each_with_index do |(lng, lat), i|
|
28
|
+
assert_in_delta(DECODED[i][0], lng, 0.0000001)
|
29
|
+
assert_in_delta(DECODED[i][1], lat, 0.0000001)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/test/misc_tests.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
|
2
|
+
$: << File.dirname(__FILE__)
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class GeosMiscTests < Test::Unit::TestCase
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
@polygon = Geos.read(POLYGON_WKB)
|
10
|
+
@point = Geos.read(POINT_WKB)
|
11
|
+
super(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def write(g)
|
15
|
+
g.to_wkt(:rounding_precision => 0)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_upper_left
|
19
|
+
assert_equal('POINT (0 5)', write(@polygon.upper_left))
|
20
|
+
assert_equal('POINT (10 10)', write(@point.upper_left))
|
21
|
+
|
22
|
+
assert_equal('POINT (0 5)', write(@polygon.northwest))
|
23
|
+
assert_equal('POINT (10 10)', write(@point.northwest))
|
24
|
+
|
25
|
+
assert_equal('POINT (0 5)', write(@polygon.nw))
|
26
|
+
assert_equal('POINT (10 10)', write(@point.nw))
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_upper_right
|
30
|
+
assert_equal('POINT (5 5)', write(@polygon.upper_right))
|
31
|
+
assert_equal('POINT (10 10)', write(@point.upper_right))
|
32
|
+
|
33
|
+
assert_equal('POINT (5 5)', write(@polygon.northeast))
|
34
|
+
assert_equal('POINT (10 10)', write(@point.northeast))
|
35
|
+
|
36
|
+
assert_equal('POINT (5 5)', write(@polygon.ne))
|
37
|
+
assert_equal('POINT (10 10)', write(@point.ne))
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_lower_left
|
41
|
+
assert_equal('POINT (0 0)', write(@polygon.lower_left))
|
42
|
+
assert_equal('POINT (10 10)', write(@point.lower_left))
|
43
|
+
|
44
|
+
assert_equal('POINT (0 0)', write(@polygon.southwest))
|
45
|
+
assert_equal('POINT (10 10)', write(@point.southwest))
|
46
|
+
|
47
|
+
assert_equal('POINT (0 0)', write(@polygon.sw))
|
48
|
+
assert_equal('POINT (10 10)', write(@point.sw))
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_lower_right
|
52
|
+
assert_equal('POINT (5 0)', write(@polygon.lower_right))
|
53
|
+
assert_equal('POINT (10 10)', write(@point.lower_right))
|
54
|
+
|
55
|
+
assert_equal('POINT (5 0)', write(@polygon.southeast))
|
56
|
+
assert_equal('POINT (10 10)', write(@point.southeast))
|
57
|
+
|
58
|
+
assert_equal('POINT (5 0)', write(@polygon.se))
|
59
|
+
assert_equal('POINT (10 10)', write(@point.se))
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_top
|
63
|
+
assert_equal(5.0, @polygon.top)
|
64
|
+
assert_equal(10.01, @point.top)
|
65
|
+
|
66
|
+
assert_equal(5.0, @polygon.north)
|
67
|
+
assert_equal(10.01, @point.north)
|
68
|
+
|
69
|
+
assert_equal(5.0, @polygon.n)
|
70
|
+
assert_equal(10.01, @point.n)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_bottom
|
74
|
+
assert_equal(0.0, @polygon.bottom)
|
75
|
+
assert_equal(10.01, @point.bottom)
|
76
|
+
|
77
|
+
assert_equal(0.0, @polygon.south)
|
78
|
+
assert_equal(10.01, @point.south)
|
79
|
+
|
80
|
+
assert_equal(0.0, @polygon.s)
|
81
|
+
assert_equal(10.01, @point.s)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_left
|
85
|
+
assert_equal(0.0, @polygon.left)
|
86
|
+
assert_equal(10.0, @point.left)
|
87
|
+
|
88
|
+
assert_equal(0.0, @polygon.west)
|
89
|
+
assert_equal(10.0, @point.west)
|
90
|
+
|
91
|
+
assert_equal(0.0, @polygon.w)
|
92
|
+
assert_equal(10.0, @point.w)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_right
|
96
|
+
assert_equal(5.0, @polygon.right)
|
97
|
+
assert_equal(10.0, @point.right)
|
98
|
+
|
99
|
+
assert_equal(5.0, @polygon.east)
|
100
|
+
assert_equal(10.0, @point.east)
|
101
|
+
|
102
|
+
assert_equal(5.0, @polygon.e)
|
103
|
+
assert_equal(10.0, @point.e)
|
104
|
+
end
|
105
|
+
end
|
File without changes
|
data/test/test_helper.rb
CHANGED
@@ -24,6 +24,7 @@ end
|
|
24
24
|
require File.join(File.dirname(__FILE__), %w{ .. lib geos_extensions })
|
25
25
|
|
26
26
|
puts "Ruby version #{RUBY_VERSION} - #{RbConfig::CONFIG['RUBY_INSTALL_NAME']}"
|
27
|
+
puts "ffi version #{Gem.loaded_specs['ffi'].version}" if Gem.loaded_specs['ffi']
|
27
28
|
puts "Geos library version #{Geos::VERSION}" if defined?(Geos::VERSION)
|
28
29
|
puts "GEOS version #{Geos::GEOS_VERSION}"
|
29
30
|
puts "GEOS extensions version #{Geos::GEOS_EXTENSIONS_VERSION}"
|
@@ -45,11 +46,15 @@ if ENV['TEST_ACTIVERECORD']
|
|
45
46
|
ActiveRecord::Base.establish_connection 'arunit'
|
46
47
|
ARBC = ActiveRecord::Base.connection
|
47
48
|
|
49
|
+
if postgresql_version = ARBC.query('SELECT version()').flatten.to_s
|
50
|
+
puts "PostgreSQL info from version(): #{postgresql_version}"
|
51
|
+
end
|
52
|
+
|
48
53
|
puts "Checking for PostGIS install"
|
49
54
|
2.times do
|
50
55
|
begin
|
51
|
-
if postgis_version = ARBC.query('SELECT
|
52
|
-
puts "PostGIS info from
|
56
|
+
if postgis_version = ARBC.query('SELECT postgis_full_version()').flatten.to_s
|
57
|
+
puts "PostGIS info from postgis_full_version(): #{postgis_version}"
|
53
58
|
break
|
54
59
|
end
|
55
60
|
rescue ActiveRecord::StatementInvalid
|
@@ -33,8 +33,8 @@ class GeosWriterTests < Test::Unit::TestCase
|
|
33
33
|
lng, lat = $1.to_f, $2.to_f
|
34
34
|
end
|
35
35
|
|
36
|
-
assert_in_delta(
|
37
|
-
assert_in_delta(
|
36
|
+
assert_in_delta(10.00, lng, 0.000001)
|
37
|
+
assert_in_delta(10.01, lat, 0.000001)
|
38
38
|
end
|
39
39
|
|
40
40
|
def test_to_ewkb_bin
|
@@ -52,8 +52,8 @@ class GeosWriterTests < Test::Unit::TestCase
|
|
52
52
|
lng, lat = $1.to_f, $2.to_f
|
53
53
|
end
|
54
54
|
|
55
|
-
assert_in_delta(
|
56
|
-
assert_in_delta(
|
55
|
+
assert_in_delta(10.00, lng, 0.000001)
|
56
|
+
assert_in_delta(10.01, lat, 0.000001)
|
57
57
|
end
|
58
58
|
|
59
59
|
def test_to_flickr_bbox
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geos-extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
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: 2011-
|
12
|
+
date: 2011-11-09 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Extensions for the GEOS library.
|
15
15
|
email: code@zoocasa.com
|
@@ -38,15 +38,17 @@ files:
|
|
38
38
|
- lib/geos/rails/engine.rb
|
39
39
|
- lib/geos_extensions.rb
|
40
40
|
- lib/tasks/test.rake
|
41
|
-
- test/
|
41
|
+
- test/adapter_tests.rb
|
42
42
|
- test/fixtures/foos.yml
|
43
|
-
- test/
|
44
|
-
- test/
|
45
|
-
- test/
|
46
|
-
- test/
|
47
|
-
- test/
|
43
|
+
- test/geometry_columns_tests.rb
|
44
|
+
- test/geospatial_scopes_tests.rb
|
45
|
+
- test/google_maps_api_2_tests.rb
|
46
|
+
- test/google_maps_api_3_tests.rb
|
47
|
+
- test/google_maps_polyline_encoder_tests.rb
|
48
|
+
- test/misc_tests.rb
|
49
|
+
- test/reader_tests.rb
|
48
50
|
- test/test_helper.rb
|
49
|
-
- test/
|
51
|
+
- test/writer_tests.rb
|
50
52
|
homepage: http://github.com/zoocasa/geos-extensions
|
51
53
|
licenses: []
|
52
54
|
post_install_message:
|
@@ -67,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
69
|
version: '0'
|
68
70
|
requirements: []
|
69
71
|
rubyforge_project:
|
70
|
-
rubygems_version: 1.8.
|
72
|
+
rubygems_version: 1.8.11
|
71
73
|
signing_key:
|
72
74
|
specification_version: 3
|
73
75
|
summary: Extensions for the GEOS library.
|