2010-07-15 17 views
5

He utilizado el algoritmo en http://www.movable-type.co.uk/scripts/latlong.html para encontrar la distancia entre dos puntos.La distancia entre dos ubicaciones no es correcta

Mis dos puntos son

long1 = 51.507467; 
lat1 = -0.08776; 

long2 = 51.508736; 
lat2 = -0.08612; 

Según Movable Type Script la respuesta es 0,1812 kilometros

Mi solicitud da el resultado (d) como 0,230 kilometros

fórmula Comprobar Haversine: 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; 

Respuesta

9

Por qué reinventar su propia calculadora de distancia, hay una integrada en la clase Location.

Salida

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 intentaré :) – Ally

+0

¡Funcionó! Gracias – Ally

3

Su implementación es correcta. La distancia dada a esas longitudes y latitudes debería producir una distancia de 0.230 km. La entrada normal para coordenadas, sin embargo, es (latitud, longitud). Ponerlos hacia atrás (longitud, latitud) produce una distancia incorrecta de 0.1812 km.

+1

... Oh poco de vergüenza. Gracias por su ayuda :) – 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; 
} 

aliado a su concepto fue right.May ser un poco chang en esta línea double c = 2 * Math.asin(Math.sqrt(a));

Cuestiones relacionadas