Una soluzione approssimata (basata su una proiezione equirettangolare), molto più veloce (richiede solo 1 trig e 1 radice quadrata).
Questa approssimazione è pertinente se i punti non sono troppo distanti. Sarà sovrastimare sempre rispetto alla vera distanza haversine. Ad esempio, aggiungerà non più dello 0.05382% alla distanza reale se la latitudine o la longitudine delta tra i due punti non supera i 4 gradi decimali.
La formula standard (Haversine) è l'esatto uno (cioè, funziona per qualsiasi coppia di longitudine/latitudine sulla terra) ma è molto più lento come deve 7 trigonometriche e 2 radici quadrate. Se la coppia di punti non è troppo distanziata e la precisione assoluta non è fondamentale, è possibile utilizzare questa versione approssimativa (Equirettangolare), che è molto più veloce in quanto utilizza solo una radice trigonometrica e una radice quadrata.
// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2)/2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;
È possibile ottimizzare questo ulteriore mediante:
- Rimozione della radice quadrata se si confronta semplicemente la distanza ad un altro (in questo caso confrontare entrambi distanza al quadrato);
- Factoring-out the cosine se si calcola la distanza da un punto master a molti altri (in tal caso si esegue la proiezione equirettangolare centrata sul punto master, quindi è possibile calcolare il coseno una volta per tutti i confronti).
Per maggiori informazioni visita: http://www.movable-type.co.uk/scripts/latlong.html
C'è un'implementazione di riferimento bella della formula Haversine in diverse lingue all'indirizzo: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe
fonte
2010-12-02 20:39:10
Probabilmente più lento dell'utilizzo di Location.DistanceBetween() poiché utilizza gli oggetti Location ma funziona molto bene per i miei scopi. – ZoltanF
@praveen thanks man its works .. –
Quale classe devo importare per la posizione 'import android.location.Location;' o che –