2013-04-23 129 views
0

我正在計算兩個緯度和經度之間的距離。我得到了一些距離的結果,但有時候,我得到的結果爲NAN。楠使用緯度和經度計算距離

這是緯度和經度,我已經得到了2位。

對於例如: 38.655553,-121.091611

38.654875,-121.091324

我使用下面的代碼來計算下面的鏈接

Calculating distance between two geographic locations

public static double distanceBetween (double currentLat2, double currentLong2, double mallLat2, double mallLong2) 
{ 
    float pk = (float) (180/3.14169); 

     double a1 = currentLat2/pk; 
     double a2 = currentLong2/pk; 
     double b1 = mallLat2/pk; 
     double b2 = mallLong2/pk; 

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

     return 6366000*tt;    
} 
參照的距離

任何幫助?

謝謝。

+0

位置已經distanceTO,這有什麼錯呢? – Blackbelt 2013-04-23 12:59:49

+0

我正在使用()之間的距離它有時會給NAN帶來結果。下面 – DevAndro 2013-04-23 13:01:23

回答

1

floatMathFloat一起鑄就是你的問題的原因。

我重寫,現在它的工作原理,它給79.34米

但主要的問題是,你使用了錯誤的公式來進行任務,你在這裏使用更大的圓圈距離公式與餘弦定理,這是很好對於浮點算術來說,它是「有條件的」。然後,更糟的是,你只用單精度而不是雙精度。

的更健壯的公式是haversine式。它旨在克服大圓公式的缺點。

這裏你原來的代碼固定的,(但我還是推薦使用haversine公式代替)

public void test1() { 

    // 79.34253285803419 
    double lat1 = 38.655553; 
    double lon1 = -121.091611; 

    double lat2 = 38.654875; 
    double lon2 = -121.091324; 

    System.out.println(distanceBetween(lat1, lon1, lat2, lon2)); 
} 

public static double distanceBetween (double currentLat2, double currentLong2, double mallLat2, double mallLong2) 
{ 
     double pk = 180/Math.PI; 
     double a1 = currentLat2/pk; 
     double a2 = currentLong2/pk; 
     double b1 = mallLat2/pk; 
     double b2 = mallLong2/pk; 

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

     return 6366000*tt; 
} 
0

您可以登錄爲T1,T2,T3的輸出?我有一種感覺,認爲Math.acos()的論據超出範圍。也不知道爲什麼你不必要地投擲浮動,並返回到一倍,當你只能使用Math.sinMath.cos

編輯

使用Math.PI代替3.14169。這個近似值導致你的錯誤。

+0

是詳細信息: T1:0.043878812342882156 T2:0。0023341665510088205 t3:0.9537870287895203 dist:NaN – DevAndro 2013-04-23 13:12:52

+0

這些合計爲1.0000000076834112765,因此當域爲[-1,1]時,您將大於1的數字傳遞給'Math.acos'。看到我上面的編輯。 – 2013-04-23 13:34:15

1

的文檔爲Location.distanceTo(LOcation)說:

返回此位置和 給定位置之間米的大致距離。距離使用WGS84橢球定義。

所以,你可以試試這個方法:

public static float distanceBetween (double currentLat2, double currentLong2, double mallLat2, double mallLong2) { 
     Location loc1 = new Location(""); 
     loc1.setLatitude(currentLat2); 
     loc1.setLongitude(currentLong2); 

     Location loc2 = new Location(""); 
     loc2.setLatitude(mallLat2); 
     loc2.setLongitude(mallLong2); 

     return loc1.distanceTo(loc2); 
} 
相關問題