举个例子,我有一个这样的模型
class Place < ActiveRecord::Base
# has a "latitude" & "longitude" field
# notice it has "max_distance" field (meter), will be different on each record
end
如何实现给定坐标点的查询,将获得距离坐标点和max_distance字段之间的所有位置。
lat = 37.792
lng = -122.393
Place.query_in_range_by_point([lat, lng])
# will get nearest places within range "max_distance" field
我一直在寻找Geocoder&amp; Geo-Kit gem文档,但没有找到任何类似的功能。
如果上面的gem不支持该功能,那么有人可以建议另一种方法来解决问题吗?
由于
答案 0 :(得分:1)
我认为以下补丁可以解决问题。
创建以下文件config / initializers / geokit_rails_patch.rb
module Geokit::ActsAsMappable
module ClassMethods
def query_in_range_by_point(options = {})
sql = build_distance_sql(options)
where("#{sql} <= #{table_name}.max_distance")
end
private
def build_distance_sql(options)
origin = extract_origin_from_options(options)
units = extract_units_from_options(options)
formula = extract_formula_from_options(options)
distance_sql(origin, units, formula)
end
end
end
然后你可以查询
Place.query_in_range_by_point(origin: [-23.5062855, -55.0919171])
答案 1 :(得分:0)
我认为Geocoder的near
功能可以满足您的要求。
class Place < ActiveRecord::Base
def self.query_in_range_by_point(lat, lng)
self.near([lat, lng], self.max_distance)
end
end
Geocoder文档参考此函数: https://github.com/alexreisner/geocoder#for-activerecord-models
答案 2 :(得分:0)
很抱歉,我将此作为答案发布,但在评论部分发布代码示例时格式化已关闭。
...
按地点,我的意思是拥有latitude
,longitude
,max_distance
属性,因为如果是这种情况,那么您可能只需要
class Place < AR::Base
...
def nearby_places
Place.where.not(id: id).near([latitude, longitude], max_distance)
end
...
end
要访问这些附近的地方,请执行以下操作:
place = Place.first
nearby_places = place.nearby_places