Максимальное расстояние с методом Mongoid Model.near - PullRequest
4 голосов
/ 21 октября 2011

Я уже некоторое время использую географические запросы, но я не могу понять, как ограничить результаты в пределах определенного радиуса. Например, как я могу ограничить поиск в пределах 20 миль в этом запросе?

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

Ответы [ 4 ]

10 голосов
/ 21 октября 2011

Длина градуса разницы широт север-юг составляет около 60 морских миль, 111 километров или 69 статутных миль на любой широте; Вы можете узнать больше о здесь, в википедии или на геопространственной странице Монго Земля круглая, а карты плоские .

Разделите расстояние на 69 или 111 при использовании мили или км соответственно, так что теперь вы можете запросить его следующим образом

Place.where(:coordinates => {"$near" => location.reverse , '$maxDistance' => 20.fdiv(69)})
3 голосов
/ 21 октября 2011

MongoDB поддерживает атрибут maxDistance ( Запрос MongoDB )

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

А расширение mongoid_geo имеет within_box и в пределах_центра метод.

1 голос
/ 12 июля 2012

контроллер:

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)
0 голосов
/ 18 ноября 2014

Попробуйте это ...

Требуемое Монго значение $ maxDistance указано в радианах, поэтому вам необходимо преобразовать расстояние на поверхности земли в угол широты / долготы.

https://en.wikipedia.org/wiki/Arc_(geometry)

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

угол (радианы) = расстояние_поверхность / radius_of_earth

угол = 10 км / 6371 км

угол = 10 см / 3960 см

...