Нахождение геопространственного с помощью Morphia Mongodb с использованием Java - PullRequest
1 голос
/ 28 октября 2011

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 28 октября 2011

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

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

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

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

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

3 голосов
/ 16 сентября 2013

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

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

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

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

0 голосов
/ 12 июля 2016
public static void test() {
        DB datastore = ConnectionFactory.getInstance().getDatabaseMongo();
        double[] near = { 20.593684, 78.96288 };
        BasicDBObject basicDBObject = new BasicDBObject();
        basicDBObject.put("type", "Point");
        basicDBObject.put("coordinates", near);
        BasicDBObject geoNearParams = new BasicDBObject();
        geoNearParams.append("geoNear", <Collection name>);
        geoNearParams.append("near", basicDBObject);
        geoNearParams.append("spherical", true);
        geoNearParams.append("maxDistance", 100);
        geoNearParams.append("limit", 10);
        CommandResult commandResult = datastore.command(geoNearParams);
        commandResult.getErrorMessage();
        Object data = commandResult.get("results");
        System.out.println(data.toString());
    }
...