我一直在使用地理位置附近查询,但似乎无法限制结果在某个半径范围内。例如,如何在此查询中将搜索限制在20英里范围内?
Place.near(:coordinates => location.reverse)
# must reverse the resulting coordinates array because mongo stores them backwards [lng,lat]
我一直在使用地理位置附近查询,但似乎无法限制结果在某个半径范围内。例如,如何在此查询中将搜索限制在20英里范围内?
Place.near(:coordinates => location.reverse)
# must reverse the resulting coordinates array because mongo stores them backwards [lng,lat]
在任何纬度上,一度南北纬差的弧长约为60海里、111公里或69英里。你可以在维基百科这里或Mongo地理空间页面“地球是圆的,但地图是平的”了解更多信息。
当使用英里或公里时,将距离除以69或111,因此现在您可以像这样查询:
Place.where(:coordinates => {"$near" => location.reverse , '$maxDistance' => 20.fdiv(69)})
MongoDB支持一个名为maxDistance的属性(MongoDB查询)。
db.places.find( { loc : { $near : [50,50] , $maxDistance : 5 } } )
mongoid_geo扩展提供了within_box和within_center方法,可用于处理地理位置相关的问题。
控制器:
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)
试试这个...
Mongo所需的$maxDistance是以弧度为单位的,因此您需要将地球表面上的距离转换为纬度/经度角度。
https://en.wikipedia.org/wiki/Arc_(geometry)
角度(弧度)= 地球表面距离 / 地球半径
角度 = 10公里 / 6371公里
角度 = 10英里 / 3960英里