geokit-rails 2.3.1 → 2.3.2
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.
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.
|