Анализ query.whereNear и query.whereWithinKilometers возвращают пустой список объектов.

Во-первых, я использую Parse Server на локальном хосте, а мой клиент — Parse Android SDK.

У меня есть класс «Место» с полем GeoPoint, называемым «местоположение». Этот класс имеет 50 строк, все они с «местоположением», например: -22.xxxxxx | -42.xxxxxx

Когда я пытаюсь запросить все строки без фильтра Geopoint, я получаю все 50. Но когда я добавляю фильтр query.whereWithinKilometers или query.whereNear, я получаю пустую переменную objects.

    ParseQuery<ParseObject> query = ParseQuery.getQuery("Place");
    Log.d("LOG 1", String.valueOf(gp.getLatitude()));
    Log.d("LOG 2", String.valueOf(gp.getLongitude()));
    query.whereWithinKilometers("location", gp, 150);
    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> objects, ParseException e) {
            Log.d("LOG 3", objects.toString());
            if (e == null) {
                if (objects.size() > 0) {
                    for (int i = 0; i < objects.size(); i++) {
                        //do something here...
                    }                       
                }
            } else {
                Log.d("Query error", e.getMessage());
            }
        }
    });

Журналы «LOG 1» и «LOG 2» показывают мои правильные координаты, поэтому gp Geopoint правильный.

«LOG 3» не отображается, потому что «objects.toString()» создает исключение NullPointerException.

Вывод:

Точно такой же код без query.whereWithinKilometers работает отлично. И обратный вызов занимает менее 1 секунды.

С query.whereWithinKilometers обратный вызов занимает от 5 до 10 секунд, а затем возвращает пустой объект. Я пробовал 15, 150, 1500, 15000 километров и ничего не возвращается. И все места этого класса находятся в моем городе, так что 10 километров будет достаточно.

Не могу придумать, что еще проверить.


person Fred Vanelli    schedule 11.03.2016    source источник


Ответы (1)


Я нашел решение. Для работы запросов геоточки требуется специальный индекс «2dsphere» в MongoDB.

Решение состоит в том, чтобы выполнить следующий код в оболочке сценария MongoDB:

    db.Place.ensureIndex({ location: "2dsphere" });

Где «Место» — это класс/коллекция, а «местоположение» — поле геоточки.

person Fred Vanelli    schedule 11.03.2016