2015-06-15 219 views
1

我試圖計算兩個地理位置之間的距離。我的問題是:我試圖像庫:Geocalc半正矢公式是這樣的:計算兩個地理位置之間的距離

public static final double RKilometers = 6371; 

public static double calculationByDistance(double lat1, double lon1, double lat2, double lon2) { 
    double dLat = Math.toRadians(lat2 - lat1); 
    double dLon = Math.toRadians(lon2 - lon1); 
    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 

    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
    double c = 2 * Math.asin(Math.sqrt(a)); 
    return RKilometers * c; 
} 

但我得到同樣的錯誤的價值觀與所有這些選項。對於短距離它完美的工作,但長距離它不會。

這是測試我所做的:

//distance between Barrow Island(Australia) and Tavatave(Madagascar) 
assertEquals(calculationByDistance(20.82, 115.4, 18.15, 49.4), 6885, 20); 
//get 6875.965169284442 

//here is the problem 
//distance between Rio Grande and Glasgow 
assertEquals(calculationByDistance(32.05, 52.11, 55.83, 4.25), 10744, 20); 
//get 4522.502442756569 

是否有人知道哪裏是我的錯誤?謝謝!

回答

1

我發現了錯誤。問題是緯度和縱向的數值是錯誤的。我從Wolframalpha那裏獲得了這些數據,並且他們沒有顯示這些值的標誌。我測試的權值是:

assertEquals(calculationByDistance(-32.05, 52.11, 55.83, -4.25), 10744, 20); 

感謝您的時間!很遺憾的愚蠢錯誤:)

1

我從很久以前就有過這樣的代碼,我甚至不記得我是自己寫的還是自己寫的。據我記憶,它提供了一個非常好的估計,你可以試試看看它是否適合你。 (歡迎編輯)

public static double distFrom(double lat1, double lng1, double lat2, double lng2) { 
     double earthRadius = 3958.75; //this is in miles I believe 
     double dLat = Math.toRadians(lat2-lat1); 
     double dLng = Math.toRadians(lng2-lng1); 
     double sindLat = Math.sin(dLat/2); 
     double sindLng = Math.sin(dLng/2); 
     double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2) 
       * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)); 
     double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
     double dist = earthRadius * c; 

     return dist; 
} 
+0

我得到同樣的錯誤值:(4522而不是10744 – IrApp

+0

@IrApp結果以英里爲單位,您可能需要更改地球半徑 – nafas

+0

是的,我已經更改了km。 – IrApp

0

很難向您推薦任何代碼片段或現有工具和服務。只是因爲計算距離取決於某個任務。有多種地圖投影和相應的公式。例如,如果您使用Google地圖,則可能會考慮高度差異進行更精確的計算。例如,OpenStreetMap不提供(至少在幾年前)任何高度信息,因此您的精度可能會有所不同(例如,比較使用OpenStreetMap在東歐和舊金山的「平坦」城市所獲得的精度)。

我對https://code.google.com/p/simplelatlng/感到滿意。這非常簡單,並且可以避免您編寫樣板代碼。

對於長距離的特定Web服務可以做得很好(特別是當服務從其他幾個服務彙總數據時)。

0
public static float distFrom(float lat1, float lng1, float lat2, float lng2) 
{ 
    // Earth Radius in meters 

    double earthRadius = 6371000; 
    double dLat = Math.toRadians(lat2-lat1); 
    double dLng = Math.toRadians(lng2-lng1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
       Math.cos(Math.toRadians(lat1)) * 
       Math.cos(Math.toRadians(lat2)) * 
       Math.sin(dLng/2) * Math.sin(dLng/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    float dist = (float) (earthRadius * c); 

    System.out.println("Distance is : " + dist); 
    return dist; // distance in meters 
} 
相關問題