2016-02-01 12 views
13

Ich arbeite an einer Android App im Zusammenhang mit Geolocations. Ich verwende Parse als Backend. Ich muss die Ergebnisse basierend auf dem aktuellen Standort des Benutzers anzeigen.whereNear Abfrage scheint nicht ordnungsgemäß in Parse

Ich bin mit dieser Abfrage:

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

Aber die Ergebnisse sind nicht Abstand weise sortiert.

Kann mir jemand helfen.

+0

Sie wissen, dass Parse richtig herunterfährt? Im Januar 2017 wird ihr Service eingestellt. http://blog.parse.com/announcements/moving-on/ – Dom

+0

Ja, das weiß ich. Ich benutze das nur für 3 Monate, um meine Idee zu bestätigen. – Anirudh

+0

Als eine Randnotiz zu meiner Antwort, wenn Sie sagen, dass die Ergebnisse nicht distanzweise sortiert sind, überprüfen Sie die Reihenfolge der Ergebnisse in der 'FindCallback.done (...)' Methode? Sonst wo sonst suchen Sie nach der Reihenfolge der Ergebnisse? Vielleicht ändern Sie die Bestellung nach Bearbeitung der Ergebnisse selbst. –

Antwort

4

Nach der Android Documentation für Parse die Standardsortierung Reihenfolge sollte bereits nach Entfernung (am nächsten zu am weitesten) sein, es sei denn, Sie selbst eine andere Sortierreihenfolge angeben.

Auch möchten Sie vielleicht in den ParseQuery.whereWithin* Methoden suchen, wie Sie nur wollen Standorte innerhalb einer bestimmten Anzahl von Meilen angeben, Kilometer usw.

Wenn alles andere fehlschlägt und die Sortierreihenfolge einfach nicht Möchten Sie an den zurückgegebenen Standorten arbeiten, können Sie sie immer selbst sortieren, indem Sie die von der Abfrage zurückgegebenen ParseObject s durchlaufen und ParseObject.getParseGeoPoint("rest_location") verwenden.

dass ein ParseGeoPoint Objekt zurückkehren und Sie können folgende

ParseGeoPoint.distanceInKilometersTo(sLatlong); 

Um den Abstand zu der Position des Benutzers zu erhalten und sortieren das dann tun.

Denn hier Referenz ist eine Probe 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))); 
    } 
} 

und dann vorausgesetzt, Sie haben eine List<ParseObject> results; einfach tun:

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

Schritt 1: Zunächst einmal zu prüfen, ob benötigen Spalte "rest_location" ist vom Typ "GeoPoint". Wenn dies der Fall ist, sollten Sie die Ergebnisse automatisch nach Entfernung mit dem von Ihnen geschriebenen Code sortieren lassen. Das einzige Problem kann sein, dass "rest_location" nicht vom Geointyp ist oder dass es ein Problem mit Parse gibt. Wie pro Parse Dokumentation: https://www.parse.com/docs/android/guide#geopoints Es gibt standardmäßig sortierte Reihenfolge (am nächsten zu am weitesten) von userLocation.

Wenn es nicht funktioniert, sollten Sie Ihren eigenen Komparator verwenden.

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

Jetzt einfach Sie Collections.sort (locationList, neue DistanceComparator (sLatLong)) passieren kann;

Verwandte Themen