2016-02-01 9 views
13

Sto lavorando a un'app Android relativa a Geolocations. Sto usando Parse come backend. Ho bisogno di visualizzare i risultati in base alla posizione corrente dell'utente.whereNear query non sembra funzionare correttamente in Parse

sto usando questa query:

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

Ma i risultati non sono allineati a distanza saggia.

Qualcuno può darmi una mano.

+0

Sapete che Parse si sta spegnendo giusto? A gennaio 2017 il loro servizio verrà chiuso. http://blog.parse.com/announcements/moving-on/ – Dom

+0

Sì, lo so. Userò questo solo per 3 mesi, per convalidare la mia idea. – Anirudh

+0

Come nota a margine della mia risposta quando dici che i risultati non sono ordinati a distanza stai verificando l'ordine dei risultati nel metodo 'FindCallback.done (...)'? Altrimenti dove altro stai verificando l'ordine dei risultati? Forse stai modificando l'ordine da solo dopo aver elaborato i risultati. –

risposta

4

In base allo standard Android Documentation per Parse, l'ordinamento predefinito deve essere già in base alla distanza (il più vicino al più lontano), a meno che non si specifichi un altro ordinamento.

Inoltre, si potrebbe voler esaminare le ParseQuery.whereWithin* metodi come è possibile specificare desideri solo posizioni all'interno di un certo numero di miglia, chilometri, ecc

Se tutto il resto fallisce e l'ordinamento semplicemente non lo fa vuoi lavorare sulle posizioni restituite, puoi sempre ordinarle manualmente eseguendo il looping dei numeri ParseObject restituiti dalla query e utilizzando ParseObject.getParseGeoPoint("rest_location").

che restituirà un oggetto ParseGeoPoint e quindi è possibile effettuare le seguenti operazioni

ParseGeoPoint.distanceInKilometersTo(sLatlong); 

Per ottenere la distanza la posizione dell'utente e ordinare su questo.

Per riferimento qui è un campione 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))); 
    } 
} 

e poi ammesso che abbiate un List<ParseObject> results; fare semplicemente:

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

Step1: Prima di tutto è necessario verificare se il vostro la colonna "rest_location" è di tipo "GeoPoint". Se è così, dovresti ottenere i risultati ordinati per distanza automaticamente con il codice scritto da te. L'unico problema può essere che "rest_location" non è di tipo geopoint, altrimenti c'è qualche problema con Parse. Come da documentazione dell'analisi: https://www.parse.com/docs/android/guide#geopoints Fornisce di default i risultati in ordine ordinato (il più vicino al più lontano) da posizione utente.

Se non funziona, è necessario utilizzare il proprio comparatore.

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

Ora si può semplicemente passare Collections.sort (locationList, nuova DistanceComparator (sLatLong));

Problemi correlati