geokit-rails 2.3.1 → 2.3.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of geokit-rails might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +4 -0
- data/README.markdown +6 -0
- data/geokit-rails.gemspec +1 -1
- data/lib/geokit-rails/acts_as_mappable.rb +33 -15
- data/lib/geokit-rails/adapters/sqlite.rb +2 -2
- data/lib/geokit-rails/version.rb +1 -1
- data/test/acts_as_mappable_test.rb +16 -0
- data/test/fixtures/companies.yml +3 -1
- data/test/schema.rb +1 -0
- metadata +7 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d8abd196ef01725dfea499611d751fe08d1f42da5473c7896d526b16044e5c7a
|
4
|
+
data.tar.gz: aef079a740792c981bb86d07d48c3686b2d939d5ce1792dd50d7d5c4bfe6bc05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7de113ad53d0ae12a3919337e70ec69d91a59f1ae9147235ee2eb42ccdd20e73438784bba5eb6122da7bb1185e28cd8d321af7a63c654b153ead266ac96d548b
|
7
|
+
data.tar.gz: ad3e5699a610b9ef8ef451bd76bef841f36272a96896a04c2610d8cb21603f869a0c670a4754366d8b3df5dc13e3f03a3807f9a96848abe63ae0e30aa45b40e9
|
data/CHANGELOG.md
CHANGED
data/README.markdown
CHANGED
@@ -264,6 +264,12 @@ If you are displaying points on a map, you probably need to query for whatever f
|
|
264
264
|
Store.in_bounds([sw_point,ne_point]).all
|
265
265
|
```
|
266
266
|
|
267
|
+
If you want the query to return things that are located on the rectangular bounds, specify the `inclusive` option set to true:
|
268
|
+
|
269
|
+
```ruby
|
270
|
+
Store.in_bounds([sw_point,ne_point], :inclusive => true).all
|
271
|
+
```
|
272
|
+
|
267
273
|
The input to `bounds` can be an array with the two points or a Bounds object. However you provide them, the order should always be the southwest corner, northeast corner of the rectangle. Typically, you will be getting the sw\_point and ne\_point from a map that is displayed on a web page.
|
268
274
|
|
269
275
|
If you need to calculate the bounding box from a point and radius, you can do that:
|
data/geokit-rails.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.add_dependency 'rails', '>= 3.0'
|
21
21
|
spec.add_dependency 'geokit', '~> 1.5'
|
22
22
|
spec.add_development_dependency "bundler", "> 1.0"
|
23
|
-
spec.add_development_dependency "simplecov"
|
23
|
+
spec.add_development_dependency "simplecov", "~> 0.16.1"
|
24
24
|
spec.add_development_dependency "simplecov-rcov"
|
25
25
|
spec.add_development_dependency 'rake'
|
26
26
|
spec.add_development_dependency 'test-unit'
|
@@ -141,11 +141,12 @@ module Geokit
|
|
141
141
|
end
|
142
142
|
|
143
143
|
def in_bounds(bounds, options = {})
|
144
|
+
inclusive = options.delete(:inclusive) || false
|
144
145
|
options[:bounds] = bounds
|
145
146
|
#geo_scope(options)
|
146
147
|
#where(distance_conditions(options))
|
147
148
|
bounds = extract_bounds_from_options(options)
|
148
|
-
where(bound_conditions(bounds))
|
149
|
+
where(bound_conditions(bounds, inclusive))
|
149
150
|
end
|
150
151
|
|
151
152
|
def by_distance(options = {})
|
@@ -153,9 +154,9 @@ module Geokit
|
|
153
154
|
units = extract_units_from_options(options)
|
154
155
|
formula = extract_formula_from_options(options)
|
155
156
|
distance_column_name = distance_sql(origin, units, formula)
|
156
|
-
with_latlng.order(
|
157
|
-
|
158
|
-
)
|
157
|
+
with_latlng.order(
|
158
|
+
Arel.sql(distance_column_name).send(options[:reverse] ? 'desc' : 'asc')
|
159
|
+
)
|
159
160
|
end
|
160
161
|
|
161
162
|
def with_latlng
|
@@ -233,7 +234,7 @@ module Geokit
|
|
233
234
|
# If it's a :within query, add a bounding box to improve performance.
|
234
235
|
# This only gets called if a :bounds argument is not otherwise supplied.
|
235
236
|
def formulate_bounds_from_distance(options, origin, units)
|
236
|
-
distance = options[:within] if options.has_key?(:within)
|
237
|
+
distance = options[:within] if options.has_key?(:within) && options[:within].is_a?(Numeric)
|
237
238
|
distance = options[:range].last-(options[:range].exclude_end?? 1 : 0) if options.has_key?(:range)
|
238
239
|
if distance
|
239
240
|
Geokit::Bounds.from_point_and_radius(origin,distance,:units=>units)
|
@@ -248,22 +249,39 @@ module Geokit
|
|
248
249
|
formula = extract_formula_from_options(options)
|
249
250
|
distance_column_name = distance_sql(origin, units, formula)
|
250
251
|
|
251
|
-
|
252
|
-
|
252
|
+
if options.has_key?(:within)
|
253
|
+
Arel.sql(distance_column_name).lteq(options[:within])
|
253
254
|
elsif options.has_key?(:beyond)
|
254
|
-
|
255
|
+
Arel.sql(distance_column_name).gt(options[:beyond])
|
255
256
|
elsif options.has_key?(:range)
|
256
|
-
|
257
|
+
min_condition = Arel.sql(distance_column_name).gteq(options[:range].begin)
|
258
|
+
max_condition = if options[:range].exclude_end?
|
259
|
+
Arel.sql(distance_column_name).lt(options[:range].end)
|
260
|
+
else
|
261
|
+
Arel.sql(distance_column_name).lteq(options[:range].end)
|
262
|
+
end
|
263
|
+
min_condition.and(max_condition)
|
257
264
|
end
|
258
|
-
Arel::Nodes::SqlLiteral.new("(#{res})") if res.present?
|
259
265
|
end
|
260
266
|
|
261
|
-
def bound_conditions(bounds)
|
267
|
+
def bound_conditions(bounds, inclusive = false)
|
268
|
+
return nil unless bounds
|
269
|
+
if inclusive
|
270
|
+
lt_operator = :lteq
|
271
|
+
gt_operator = :gteq
|
272
|
+
else
|
273
|
+
lt_operator = :lt
|
274
|
+
gt_operator = :gt
|
275
|
+
end
|
262
276
|
sw,ne = bounds.sw, bounds.ne
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
277
|
+
lat, lng = Arel.sql(qualified_lat_column_name), Arel.sql(qualified_lng_column_name)
|
278
|
+
lat.send(gt_operator, sw.lat).and(lat.send(lt_operator, ne.lat)).and(
|
279
|
+
if bounds.crosses_meridian?
|
280
|
+
lng.send(lt_operator, ne.lng).or(lng.send(gt_operator, sw.lng))
|
281
|
+
else
|
282
|
+
lng.send(gt_operator, sw.lng).and(lng.send(lt_operator, ne.lng))
|
283
|
+
end
|
284
|
+
)
|
267
285
|
end
|
268
286
|
|
269
287
|
# Extracts the origin instance out of the options if it exists and returns
|
@@ -3,7 +3,7 @@ module Geokit
|
|
3
3
|
class SQLite < Abstract
|
4
4
|
|
5
5
|
def self.add_numeric(name)
|
6
|
-
@@connection.create_function name, 1,
|
6
|
+
@@connection.create_function name, 1, SQLite3::Constants::TextRep::ANY do |func, *args|
|
7
7
|
func.result = yield(*args)
|
8
8
|
end
|
9
9
|
end
|
@@ -50,4 +50,4 @@ module Geokit
|
|
50
50
|
|
51
51
|
end
|
52
52
|
end
|
53
|
-
end
|
53
|
+
end
|
data/lib/geokit-rails/version.rb
CHANGED
@@ -108,6 +108,12 @@ class ActsAsMappableTest < GeokitTestCase
|
|
108
108
|
assert_equal 5, locations.count
|
109
109
|
end
|
110
110
|
|
111
|
+
def test_find_within_with_column_as_distance
|
112
|
+
locations = Location.joins(:company).within(Company.arel_table[:max_distance], origin: @loc_a)
|
113
|
+
assert_equal 4, locations.to_a.size
|
114
|
+
assert_equal 4, locations.count
|
115
|
+
end
|
116
|
+
|
111
117
|
def test_find_with_compound_condition
|
112
118
|
#locations = Location.geo_scope(:origin => @loc_a).where("distance < 5 and city = 'Coppell'")
|
113
119
|
locations = Location.within(5, :origin => @loc_a).where("city = 'Coppell'")
|
@@ -383,6 +389,16 @@ class ActsAsMappableTest < GeokitTestCase
|
|
383
389
|
assert_equal 2, locations.count
|
384
390
|
end
|
385
391
|
|
392
|
+
def test_find_within_bounds_with_inclusive
|
393
|
+
sw = Geokit::LatLng.new(@loc_a.lat,@loc_a.lng)
|
394
|
+
ne = sw
|
395
|
+
bounds = [sw,ne]
|
396
|
+
locations = Location.in_bounds(bounds, :inclusive => false)
|
397
|
+
assert_equal 0, locations.count
|
398
|
+
locations = Location.in_bounds(bounds, :inclusive => true)
|
399
|
+
assert_equal 1, locations.count
|
400
|
+
end
|
401
|
+
|
386
402
|
def test_find_within_bounds_ordered_by_distance
|
387
403
|
#locations = Location.in_bounds([@sw,@ne], :origin=>@bounds_center).order('distance asc')
|
388
404
|
locations = Location.in_bounds([@sw,@ne]).by_distance(:origin => @bounds_center)
|
data/test/fixtures/companies.yml
CHANGED
data/test/schema.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geokit-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Noack
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2021-01-08 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rails
|
@@ -59,16 +59,16 @@ dependencies:
|
|
59
59
|
name: simplecov
|
60
60
|
requirement: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
|
-
- - "
|
62
|
+
- - "~>"
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
64
|
+
version: 0.16.1
|
65
65
|
type: :development
|
66
66
|
prerelease: false
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
68
68
|
requirements:
|
69
|
-
- - "
|
69
|
+
- - "~>"
|
70
70
|
- !ruby/object:Gem::Version
|
71
|
-
version:
|
71
|
+
version: 0.16.1
|
72
72
|
- !ruby/object:Gem::Dependency
|
73
73
|
name: simplecov-rcov
|
74
74
|
requirement: !ruby/object:Gem::Requirement
|
@@ -279,8 +279,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
279
279
|
- !ruby/object:Gem::Version
|
280
280
|
version: '0'
|
281
281
|
requirements: []
|
282
|
-
|
283
|
-
rubygems_version: 2.6.14.1
|
282
|
+
rubygems_version: 3.1.4
|
284
283
|
signing_key:
|
285
284
|
specification_version: 4
|
286
285
|
summary: Geokit helpers for rails apps.
|