Поиск геопространственных данных с помощью morphia mongodb с использованием Java

Я хотел бы запросить некоторые точки геолокации с помощью morphia framework. Я использую свою широту, долготу и радиус (100 км) с методом «Рядом», чтобы запрашивать других вокруг моего местоположения и ограничивать 10 результатов. Именно так :

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100).limit(10).asList();

Это не ошибка, но результат показывает мне точки местоположения, которые находятся вокруг меня и выходят за пределы моего радиуса (100 км). Итак, мой радиус не касается запроса результата.

В чем моя проблема с оператором запроса?

Заранее спасибо


person Mojiiz    schedule 28.10.2011    source источник


Ответы (2)


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

Преобразуйте расстояние в 111,12 (один градус составляет примерно 111,12 километра) при использовании км или в 69 (для миль).

Поэтому измените свой запрос на

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100/111.12).limit(10).asList();

И убедитесь, что mongodb принимает координаты в [long, lat].

person RameshVel    schedule 28.10.2011
comment
Спасибо за хороший ответ. Я уже прочитал ваши ссылки и больше понимаю расстояние по радиусу с помощью метода mongo db. - person Mojiiz; 30.10.2011
comment
@Mojiiz, рад, что это помогло .. :) - person RameshVel; 31.10.2011
comment
Как добавить к нему индекс? - person krhitesh; 07.04.2019

Согласно веб-сайту (MongoDB : Расчет расстояний в двухмерном индексе с использованием сферической геометрии), чтобы получить радианы расстояния, на которое мы смотрим, мы должны использовать землю в пределах 3,959 миль или 6,371 км.

Просмотрев документацию (MongoDB:$nearSphere), я думаю, что вызов должен быть:

morphia.ds.find(Location.class).field("Location").near(latitude, longitude, 100/6371, true).limit(10).asList();

В моем случае и после некоторой проверки я работаю так.

person Gorgue    schedule 16.09.2013