2010-09-15 54 views
22

Ho usato questo codice, ma doesnt lavoro:Come posso calcolare la distanza tra due punti gps in Java?

bisogno della distanza tra due coordinate GPS come 41,1212, 11,2323 in chilometri (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

Il tuo approccio di trigonometria funzionerebbe molto bene se la Terra fosse una sfera perfetta. Tuttavia, in realtà è un ellissoide, quindi il raggio dalla superficie al nucleo della Terra è variabile a seconda della posizione sulla Terra. Per ottenere una misurazione precisa della distanza, è necessario ottenere una libreria di sistema di coordinate che possa tener conto di ciò. Supponendo che una sfera possa essere abbastanza vicina per qualsiasi cosa tu stia facendo, ma se hai bisogno che sia molto accurata, dovrai trovare una buona libreria. –

+0

duplicato da: [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

risposta

20

longitudine e latitudine sono espresse in gradi (0-360) . Se si desidera convertire i gradi in radianti (0-2 π) è necessario dividere per 360 e moltiplicare per 2 π, (o equivalentemente, moltiplicare per π/180). Tuttavia, nel codice, si moltiplica per 180/π.

Cioè, il cambiamento

double d2r = (180/Math.PI); 

in

double d2r = Math.PI/180; 
8

La soluzione da http://www.androidsnippets.com/distance-between-two-gps-coordinates-in-meter.

Funziona solo se i punti sono abbastanza vicini da poter omettere che la terra non sia di forma regolare.

 

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; 
} 
// 

vedere Distance between two GPS coordinates in meter.

8

avere uno sguardo un 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"); 

distanza e '1448,7325760822912 km

Ho scritto quella libreria per un mio progetto.

+0

grazie è stato di grande aiuto :) apprezzato. .. –

0

La distanza può essere calcolata con la libreria Esri Geometry: geodesicDistanceOnWGS84.

Suppongo che JTS abbia anche un metodo per calcolare la distanza.