Подтвердить что ты не робот

WhereNear запрос не работает должным образом в Parse

Я работаю над Android-приложением, связанным с Geolocations. Я использую Parse как backend. Мне нужно отображать результаты на основе текущего местоположения пользователя.

Я использую этот запрос:

ParseQuery<ParseObject> query = ParseQuery.getQuery("Restaurants"); 
ParseGeoPoint sLatlong = new ParseGeoPoint(currentLat, currentLong);
        query.whereNear("rest_location", sLatlong);  

Но результаты не отсортированы по расстоянию.

Может кто-то помочь мне.

4b9b3361

Ответ 1

В соответствии с Документация для Android для Parse порядок сортировки по умолчанию должен быть уже на расстоянии (ближайшем к дальнему), если вы не указали другой порядок сортировки сами.

Кроме того, вам может понадобиться изучить методы ParseQuery.whereWithin*, так как вы можете указать, что вам нужны только местоположения в пределах определенного количества миль, километров и т.д.

Если все остальное не работает, и порядок сортировки просто не хочет работать с возвращенными адресами, вы всегда можете отсортировать их самостоятельно, перейдя через ParseObject, возвращенный из запроса, и используя ParseObject.getParseGeoPoint("rest_location").

Это вернет объект ParseGeoPoint, и вы можете сделать следующее

ParseGeoPoint.distanceInKilometersTo(sLatlong);

Чтобы получить расстояние до местоположения пользователя и отсортировать его.

Для справки здесь приведен пример Comparator:

public class UserLocationComparator  implements Comparator<ParseObject> {

    private final ParseGeoPoint userLoc;

    public UserLocationComparator(ParseGeoPoint userLoc) {
        this.userLoc = userLoc;
    }

    @Override
    public int compare(ParseObject po1, ParseObject po2) {
        ParseGeoPoint loc1 = po1.getParseGeoPoint("rest_location");
        ParseGeoPoint loc2 = po2.getParseGeoPoint("rest_location");

        return loc1 == null ?
                (loc2 == null ? 0 : 1) :
                (loc2 == null ? -1 : Double.compare(userLoc.distanceInKilometersTo(loc1), userLoc.distanceInKilometersTo(loc2)));
    }
}

а затем, предположив, что у вас есть List<ParseObject> results;, просто выполните:

Collections.sort(results, new UserLocationComparator(sLatlong));

Ответ 2

Шаг 1: Прежде всего, вам нужно проверить, имеет ли ваш столбец "rest_location" тип "GeoPoint". Если это так, вы должны получить результаты, отсортированные по расстоянию автоматически с кодом, написанным вами. Единственная проблема может заключаться в том, что "rest_location" не имеет геопозиционного типа, иначе возникает проблема с Parse. Согласно описанию разбора: https://www.parse.com/docs/android/guide#geopoints Он дает по умолчанию результаты в отсортированном порядке (ближайшем к дальнему) из userLocation.

Если он не работает, вы должны использовать свой собственный компаратор.

 class DistanceComparator implements Comparator<ParseObject> {

    ParseGeoPoint userGeoPoint;

    public DistanceComparator(ParseGeoPoint geoPoint) {
      userGeoPoint = geoPoint;
    }

    @Override
    public int compare(ParseObject lhs, ParseObject rhs) {
      double dist1 = lhs.getParseGeoPoint("rest_location").distanceInKilometersTo(userGeoPoint);
      double dist2 = rhs.getParseGeoPoint("rest_location").distanceInKilometersTo(userGeoPoint);

      return Double.compare(dist1,dist2);
    }
  }

Теперь вы можете просто пройти Collections.sort(locationList, новый DistanceComparator (sLatLong));