Mongoid的Model.near方法的最大距离

时间:2011-10-21 11:16:25

标签: ruby-on-rails mongodb geolocation mongoid

我一直在使用地理位置附近的查询一段时间,但我似乎无法弄清楚如何将结果限制在一定范围内。例如,如何在此查询中将搜索限制在20英里范围内?

Place.near(:coordinates => location.reverse) 
# must reverse the resulting coordinates array because mongo stores them backwards [lng,lat]

4 个答案:

答案 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)

http://docs.mongodb.org/manual/tutorial/calculate-distances-using-spherical-geometry-with-2d-geospatial-indexes/

angle(弧度)= distance_at_surface / radius_of_earth

角度= 10km / 6371km

角度= 10sm / 3960sm