2010-09-15 196 views
22

我用這個代碼,但它不工作:我如何計算Java中兩個gps點之間的距離?

需要兩個GPS座標之間的距離就像41.1212,11.2323千米(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

如果地球是一個完美的球體,那麼你的三角函數方法將非常有效。然而,它實際上是一個橢球體,所以從地表到地球核心的半徑根據你在地球上的位置而變化。要獲得準確的距離測量,您需要獲得一個可以解釋這一點的座標系統庫。假設一個球體可能足夠接近你做的任何事情,但如果你需要它非常準確,你需要找到一個好的圖書館。 – 2011-01-06 04:58:50

+0

從重複的:[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 2015-07-19 12:29:02

回答

20

經度和緯度以度給出(0-360) 。如果要將度數轉換爲弧度(0-2 π),則需要除以360並乘以2 π(或等效地,乘以π/180)。在你的代碼中,乘以180/π

即,變化

double d2r = (180/Math.PI); 

double d2r = Math.PI/180; 
8

http://www.androidsnippets.com/distance-between-two-gps-coordinates-in-meter的解決方案。

只有當點足夠接近以至於你可以忽略地球不規則形狀時纔有效。

 

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

參見Distance between two GPS coordinates in meter

8

看看一個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"); 

距離爲1448.7325760822912公里

我爲一個項目編寫了該庫。

+0

非常感謝,謝謝:)讚賞。 .. – 2015-07-16 01:22:15

0

可以使用Esri幾何庫計算距離:geodesicDistanceOnWGS84

我會假設JTS也有一個計算距離的方法。

相關問題