2011-10-21 55 views
4

我一直在使用地球附近的查詢一段時間了,但我似乎無法弄清楚如何限制結果在一定範圍內。例如,如何在此查詢中將搜索範圍限制在20英里以內?與Mongoid的Model.near方法的最大距離

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

回答

10

南北緯度差的arcdegree的長度,大約是60海里,111公里或69法定英里在任何緯度;你可以閱讀更多關於here in wikipedia或mongo geospatial頁面The Earth is Round but Maps are Flat。通過69或分別使用英里或公里時111

鴻溝的距離,所以現在你可以查詢它像這樣

Place.where(:coordinates => {"$near" => location.reverse , '$maxDistance' => 20.fdiv(69)}) 
3

MongoDB的支持maxDistance屬性(MongoDB Querying

db.places.find({ loc : { $near : [50,50] , $maxDistance : 5 } }) 

而且該mongoid_geo擴展名具有within_boxwithin_center方法。

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

這並不在Mongoid工作4.0 ...返回一個ArgumentError:錯誤的參數數目(2代表1) – vanboom