2010-07-15 21 views
5

Ho usato l'algoritmo su http://www.movable-type.co.uk/scripts/latlong.html per trovare la distanza tra due punti.La distanza tra due posizioni non è corretta

miei due punti sono

long1 = 51.507467; 
lat1 = -0.08776; 

long2 = 51.508736; 
lat2 = -0.08612; 

Secondo Movable Type Script la risposta è 0,1812 chilometri

mia applicazione dà il risultato (d) come 0,230 km

Controllare Haversine formula: http://www.movable-type.co.uk/scripts/latlong.html

double R = 6371; // earth’s radius (mean radius = 6,371km) 
    double dLat = Math.toRadians(lat2-lat1); 

    double dLon = Math.toRadians(long2-long1); 
    a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
      Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double d = R * c; 

risposta

9

Perché reinventare il proprio calcolatore di distanza, ce n'è uno incorporato nella classe Location.

Partenza

distanceBetween(double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results) 
Computes the approximate distance in meters between two locations, and optionally the initial and final bearings of the shortest path between them. 
+0

Lo proveremo :) – Ally

+0

Ha funzionato! Grazie – Ally

3

L'implementazione è corretta. La distanza data quelle longitudini e latitudini dovrebbe produrre una distanza di 0.230 km. L'input normale per le coordinate, tuttavia, è (latitudine, longitudine). Inserendoli all'indietro (longitudine, latitudine) produce la distanza errata di 0.1812 km.

+1

Oh ... po' imbarazzato. Grazie per il tuo aiuto :) – Ally

1
public double CalculationByDistance(GeoPoint StartP, GeoPoint EndP) { 
    double lat1 = StartP.getLatitudeE6()/1E6; 
    double lat2 = EndP.getLatitudeE6()/1E6; 
    double lon1 = StartP.getLongitudeE6()/1E6; 
    double lon2 = EndP.getLongitudeE6()/1E6; 
    double dLat = Math.toRadians(lat2-lat1); 
    double dLon = Math.toRadians(lon2-lon1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2 * Math.asin(Math.sqrt(a)); 
    return Radius * c; 
} 

Ally vostro concetto era right.May essere un po 'chang in questa linea double c = 2 * Math.asin(Math.sqrt(a));

Problemi correlati