2010-09-15 25 views
22

que utiliza este código pero no funciona:¿Cómo puedo calcular la distancia entre dos puntos de GPS en Java?

necesitan la distancia entre dos coordenadas GPS como 41,1212, 11,2323 en kilómetros (Java)

double d2r = (180/Math.PI); 
double distance = 0; 

try{ 
    double dlong = (endpoint.getLon() - startpoint.getLon()) * d2r; 
    double dlat = (endpoint.getLat() - startpoint.getLat()) * d2r; 
    double a = 
     Math.pow(Math.sin(dlat/2.0), 2) 
      + Math.cos(startpoint.getLat() * d2r) 
      * Math.cos(endpoint.getLat() * d2r) 
      * Math.pow(Math.sin(dlong/2.0), 2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    double d = 6367 * c; 

    return d; 

} catch(Exception e){ 
    e.printStackTrace(); 
} 
+3

Su enfoque de trigonometría funcionaría muy bien si la Tierra fuera una esfera perfecta. Sin embargo, en realidad es un elipsoide, por lo que el radio desde la superficie hasta el núcleo de la Tierra es variable dependiendo de su posición en la tierra. Para obtener una medición de distancia precisa, necesita obtener una biblioteca de sistema de coordenadas que pueda dar cuenta de esto. Asumiendo que una esfera puede estar lo suficientemente cerca para lo que sea que estés haciendo, pero si necesitas que sea muy precisa, necesitarás encontrar una buena biblioteca. –

+0

duplicado a partir de: [http://stackoverflow.com/questions/3694380/calculating-distance-between-two-points-using-latitude-longitude-what-am-i-doi][1] [1]: http://stackoverflow.com/questions/3694380/calculating-distance-between-two-points-using-latitude-longitude-what-am-i-doi – gonella

Respuesta

20

longitud y la latitud se dan en grados (0-360) . Si desea convertir grados a radianes (0-2 π), necesita dividir entre 360 ​​y multiplicar por 2 π, (o equivalentemente, multiplicar por π/180). Sin embargo, en su código, , se multiplica por 180/π.

Esto es, el cambio

double d2r = (180/Math.PI); 

en

double d2r = Math.PI/180; 
8

La solución de http://www.androidsnippets.com/distance-between-two-gps-coordinates-in-meter.

Solo funciona si los puntos están lo suficientemente cerca como para que pueda omitir que la tierra no es de forma regular.

 

private double gps2m(float lat_a, float lng_a, float lat_b, float lng_b) { 
    float pk = (float) (180/3.14169); 

    float a1 = lat_a/pk; 
    float a2 = lng_a/pk; 
    float b1 = lat_b/pk; 
    float b2 = lng_b/pk; 

    float t1 = FloatMath.cos(a1)*FloatMath.cos(a2)*FloatMath.cos(b1)*FloatMath.cos(b2); 
    float t2 = FloatMath.cos(a1)*FloatMath.sin(a2)*FloatMath.cos(b1)*FloatMath.sin(b2); 
    float t3 = FloatMath.sin(a1)*FloatMath.sin(b1); 
    double tt = Math.acos(t1 + t2 + t3); 

    return 6366000*tt; 
} 
// 

ver Distance between two GPS coordinates in meter.

8

echar un vistazo a Distancia Geocalc

Coordinate lat = new GPSCoordinate(41, .1212); 
Coordinate lng = new GPSCoordinate(11, .2323); 
Point point = new Point(lat, lng); 

lat = new DegreeCoordinate(51.4613418); 
lng = new DegreeCoordinate(-0.3035466); 
Point point2 = new Point(lat, lng); 
System.out.println("Distance is " + EarthCalc.getDistance(point2, point)/1000 + " km"); 

es 1.448,7325760822912 kilometros

Escribí esa biblioteca para mi proyecto.

+0

gracias fue de gran ayuda :) apreciado. .. –

0

La distancia se puede calcular con la biblioteca Esome Geometry: geodesicDistanceOnWGS84.

Supongo que JTS también tiene un método para calcular la distancia.

Cuestiones relacionadas