我一直在使用地理位置附近的查询一段时间,但我似乎无法弄清楚如何将结果限制在一定范围内。例如,如何在此查询中将搜索限制在20英里范围内?
Place.near(:coordinates => location.reverse)
# must reverse the resulting coordinates array because mongo stores them backwards [lng,lat]
答案 0 :(得分:10)
南北纬度差异的弧度长度,在任何纬度都大约<60>海里,111公里或69法定英里;您可以详细了解here in wikipedia或mongo地理空间页面The Earth is Round but Maps are Flat。
分别使用英里或公里时,将距离除以69或111,所以现在可以像这样查询
Place.where(:coordinates => {"$near" => location.reverse , '$maxDistance' => 20.fdiv(69)})
答案 1 :(得分:3)
MongoDB支持 maxDistance 属性(MongoDB Querying)
db.places.find( { loc : { $near : [50,50] , $maxDistance : 5 } } )
mongoid_geo扩展程序包含 within_box 和 within_center 方法。
答案 2 :(得分:1)
控制器:
lng, lat, dis = params[:lng], params[:lat], params[:dis]
page, per_page = params[:page] || 1 , params[:per_page] || 30
sms = SideMongo.geo_near([lng.to_f,lat.to_f], max_distance: dis.to_i, unit: "km".to_sym, spherical: true).sort_by!{|r| r.geo[:distance] }
page_sms = sms.per(per_page).page(page)
答案 3 :(得分:0)
试试这个......
Mongo所需的$ maxDistance是弧度,因此您需要将地球表面的距离转换为纬度/经度角。
https://en.wikipedia.org/wiki/Arc_(geometry)
angle(弧度)= distance_at_surface / radius_of_earth
角度= 10km / 6371km
角度= 10sm / 3960sm