簡體   English   中英

計算兩個地理位置之間的距離

[英]Calculate distance between two GeoLocation

我正在嘗試計算兩個地理位置之間的距離。 遇到的問題如下:我嘗試使用像Geocalc和Haversine公式這樣的庫:

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

有人知道我的錯誤在哪里嗎? 謝謝!

我有很久以前的這段代碼,我什至不記得是我自己編寫還是從別人那里得到的。 據我記得,它提供了一個很好的估計,您可以嘗試一下,看看它是否適合您。 (歡迎編輯)

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

我發現了錯誤。 問題在於緯度和經度的值是錯誤的。 我從Wolframalpha中獲取了數據,但沒有顯示這些值的跡象。 我的測試的權利值為:

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

謝謝您的寶貴時間!

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
}

很難為您提供任何代碼段或現有工具和服務。 僅僅因為計算距離取決於特定任務。 地圖投影和相應的公式有很多種。

例如,如果您使用的是Google地圖,則考慮到高度差異,您可能可以進行更精確的計算。 例如,OpenStreetMap不提供(至少在幾年前)任何高度信息,因此您的精度可以變化(例如,將OpenStreetMap所獲得的精度與東歐和舊金山的“平坦”城市進行比較)。

我對https://code.google.com/p/simplelatlng/感到滿意。 這真的很簡單,使您不必編寫樣板代碼。

對於長距離而言,特定的Web服務可以做得很好(尤其是當服務聚合來自其他多個服務的數據時)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM