2010-10-21 13 views
6

quello che sto cercando di fare: l'utente seleziona inizio e destinazione su una mappa e quindi dalle loro coordinate voglio mostrare la posizione del punto più vicino da un elenco di posizioni sulla mappa . Ho un semplice database Sqlite contenente la longitudine, la latitudine e il nome delle possibili posizioni.trova il punto Gps più vicino alla posizione dell'utente forma un elenco

ho fatto qualche ricerca e questo è quello che ho trovato:

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

ma questo è significato per il suo utilizzo con MySQL e una sorta di estensione di ricerca spaziale. c'è la possibilità che io possa fare qualcosa di simile usando Android API o librerie esterne?

public Point dialogFindClosestLocationToPoint(geometry.Point aStartPoint){ 
List<PointWithDistance> helperList=new ArrayList<PointWithDistance>(); 
try { 
openDataBase(); 
Cursor c=getCursorQueryWithAllTheData(); 
if(c.moveToFirst()) 
do{ 
    PointWithDistance helper=new PointWithDistance(c.getDouble(1),c.getDouble(2),c.getString(3)); 
    int distance=returnDistanceBetween2Points(aStartPoint, helper); 
    if(distance<MAX_SEARCH_DISTANCE){ 
    helper.setDistance(distance); 
    Log.i("values", helper.name); 
    helperList.add(helper); 
    } 
}while (c.moveToNext()); 
Collections.sort(helperList,new PointComparator()); 

if(helperList!=null) 
return helperList.get(0); 
else return null; 
}catch(SQLException sqle){ 

throw sqle; 

} 
finally{ 
close(); 
} 

questo è il codice nella) classe (PointComparator:

public int compare(PointWithDistance o1, PointWithDistance o2) { 
    return (o1.getDistance()<o2.getDistance() ? -1 : (o1.getDistance()==o2.getDistance() ? 0 : 1)); 
} 

dove PointWithDistance è un oggetto che contiene: lat, long, distanza, nome

tuttavia questa soluzione non fa fornire le informazioni di ritorno corrette ... e mi rendo conto che non è affatto scalabile e molto lento. ho bisogno di una soluzione che verrà eseguita velocemente con un database con un massimo di 1000 righe.

edit: il mio c'è stato un errore in questo codice nella selezione ora ho è cambiato (dovrebbe essere < invece di>)

risposta

2

ero alla ricerca di qualcosa di molto simile qualche tempo fa:

Android sqlite sort on calculated column (co-ordinates distance)

usavo una ricerca di MySQL sul mio server, MySQL consente di creare una colonna virtuale, esegue il calcolo e sorta dalla distanza , e quindi è possibile impostare i risultati massimi restituiti o la distanza massima - funziona molto bene:

Select Lat, Lon, acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))cos(radians(Lon)-$lon))$R As dist From MyTable ORDER BY dist DESC 

ho voluto eseguire la stessa operazione nella mia app - tirare tutti i punti per le distanze dalle locati degli utenti permettendomi di mostrare i più vicini.Ho finito per andare con una soluzione sulla falsariga di quella suggerita sul link qui sopra, ma realizzo che probabilmente non è la soluzione ottimale ma funziona allo scopo che volevo.

+0

Credo che tu abbia passato variabili attraverso php. $ lat è la tua attuale latitudine, $ lon è la latitudine corrente. Ma cos'è $ R? –

+0

Non è $ R il raggio di terra? vedere: http://www.movable-type.co.uk/scripts/latlong.html – leochab

1

non ho provato a fare funzionare il codice, ma sembra che avrebbe funzionato , è solo che non è efficiente. come se non avessi effettivamente bisogno di ordinare, hai bisogno di estrarre il minimo.

È possibile limitare la query al solo quadrato di dimensioni (2 * MAX_SEARCH_DISTANCE)^2 (con il punto nel mezzo. In questo modo si localizza la query e ciò consente di ottenere meno risultati per calcolare la distanza . (? forse improbabile). per Naturalmente questo non aiuterà se tutte le sedi sono in piazza localizzata

Inoltre, suppongo che si possa utilizzare a distanza di Hamilton al posto di euclidea distanza euclidea = sqrt ((lat0. - lat1)^2 + (lon0 - lon1)^2) hamitonian distance = (lat0 - lat1) + (lon0 - lon1)

+0

in realtà sto usando la funzione definita nell'API Location Android per calcolare la distanza tra due coordinate GPS. come ho scoperto è molto preciso e tiene conto anche della forma della terra. "hai bisogno dell'estratto il minimo." qual è il modo migliore per farlo? – DArkO

3

Thi Il tipo di cosa è fatto in modo più efficiente usando un R-Tree. Il JSI library fornisce un'implementazione Java che ho usato con successo con un indice di 80.000 posizioni, elaborando migliaia di ricerche al secondo. Tuttavia, potrebbe non funzionare su Android.

+0

sì ho trovato alcune informazioni che r-tree è una buona soluzione per questo, ma non ho trovato nessuna libreria per Android finora con cui lavorare. continuerò a cercare e provare il summenzionato. – DArkO

Problemi correlati