2016-02-01 8 views
13

Pracuję nad aplikacją na Androida związaną z Geolocations. Używam Parse jako zaplecza. Muszę wyświetlać wyniki na podstawie bieżącej lokalizacji użytkownika.whereNear query nie działa poprawnie w Parse

Używam tej kwerendy:

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

ale wyniki nie są klasyfikowane odległość mądry.

Czy ktoś może mi pomóc?

+0

Wiesz, że Parse jest wyłączany, prawda? W styczniu 2017 r. Ich usługa zostanie zamknięta. http://blog.parse.com/announcements/moving-on/ – Dom

+0

Tak, wiem to. Będę używał tego przez 3 miesiące, aby zatwierdzić mój pomysł. – Anirudh

+0

Na marginesie mojej odpowiedzi, gdy mówisz, że wyniki nie są posortowane na odległość, czy sprawdzasz kolejność wyników w metodzie 'FindCallback.done (...)'? W przeciwnym razie gdzie indziej sprawdzasz kolejność wyników? Być może sam zmieniasz kolejność po przetworzeniu wyników. –

Odpowiedz

4

Zgodnie z Android Documentation dla Parse domyślna kolejność sortowania powinna już być zależna od odległości (najbliższa najdalej), chyba że sam określasz inną kolejność sortowania.

Ponadto, warto zajrzeć do metod ParseQuery.whereWithin* jak można określić tylko chcą lokalizacje w ciągu określonej liczby mil, kilometrów itd

Jeśli wszystko inne zawiedzie, a porządek po prostu nie chcesz pracować nad zwróconymi lokalizacjami, możesz je zawsze sortować, przechodząc przez zwroty z zapytania i używając ParseObject.getParseGeoPoint("rest_location").

To zwróci ParseGeoPoint obiekt, a następnie można wykonać następujące czynności

ParseGeoPoint.distanceInKilometersTo(sLatlong); 

Aby uzyskać dystans do lokalizacji użytkownika i posortować na ten temat.

Dla odniesienia Oto próbka 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))); 
    } 
} 

a następnie zakładając masz List<ParseObject> results; po prostu zrobić:

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

Krok 1: Przede wszystkim trzeba sprawdzić, czy kolumna "położenie_poczta" jest typu "GeoPoint". Jeśli tak, to powinieneś otrzymać wyniki posortowane według odległości automatycznie z kodem napisanym przez ciebie. Jedynym problemem może być to, że "repozytorium_dostępu" nie ma typu geopoint lub istnieje jakiś problem z analizą składni. Zgodnie z dokumentacją analizy: https://www.parse.com/docs/android/guide#geopoints Daje domyślnie wyniki w posortowanej kolejności (najbliższej najdalej) z userLocation.

Jeśli to nie zadziała, należy użyć własnego komparatora.

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); 
    } 
    } 

Teraz można po prostu przejść Collections.sort (locationList, nowy DistanceComparator (sLatLong));