回覆列表
  • 1 # 使用者9538035845626

    在赤道上,1經度差對應的距離是111千米;在其他緯線上,如果緯度為A,則1經度差對應的距離是111*COSA千米。

    在經線上,1緯度差對應的距離是111千米。

    根據地球上任意兩點的經緯度計算兩點間的距離

    地球是一個近乎標準的橢球體,它的赤道半徑為6378.140千米,極半徑為

    6356.755千米,平均半徑6371.004千米。如果我們假設地球是一個完美的球體,那麼它的半徑就是地球的平均半徑,記為R。如果以0度經線為基

    準,那麼根據地球表面任意兩點的經緯度就可以計算出這兩點間的地表距離(這裡忽略地球表面地形對計算帶來的誤差,僅僅是理論上的估算值)。設第一點A的經

    緯度為(LonA, LatA),第二點B的經緯度為(LonB,

    LatB),按照0度經線的基準,東經取經度的正值(Longitude),西經取經度負值(-Longitude),北緯取90-緯度值(90-

    Latitude),南緯取90+緯度值(90+Latitude),則經過上述處理過後的兩點被計為(MLonA, MLatA)和(MLonB,

    MLatB)。那麼根據三角推導,可以得到計算兩點距離的如下公式:

    C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)

    Distance = R*Arccos(C)*Pi/180

    這裡,R和Distance單位是相同,如果是採用6371.004千米作為半徑,那麼Distance就是千米為單位,如果要使用其他單位,比如mile,還需要做單位換算,1千米=0.621371192mile

    如果僅對經度作正負的處理,而不對緯度作90-Latitude(假設都是北半球,南半球只有澳洲具有應用意義)的處理,那麼公式將是:

    C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)

    Distance = R*Arccos(C)*Pi/180

    以上透過簡單的三角變換就可以推出。

    如果三角函式的輸入和輸出都採用弧度值,那麼公式還可以寫作:

    C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)

    Distance = R*Arccos(C)*Pi/180

    也就是:

    C = sin(LatA/57.2958)*sin(LatB/57.2958) + cos(LatA/57.2958)*cos(LatB/57.2958)*cos((MLonA-MLonB)/57.2958)

    Distance = R*Arccos(C) = 6371.004*Arccos(C) kilometer = 0.621371192*6371.004*Arccos(C) mile = 3958.758349716768*Arccos(C) mile

    在實際應用當中,一般是透過一個個體的郵政編碼來查詢該郵政編碼對應的地區中心的經緯度,然

    後再根據這些經緯度來計算彼此的距離,從而估算出某些群體之間的大致距離範圍(比如酒店旅客的分佈範圍-各個旅客的郵政編碼對應的經緯度和酒店的經緯度所

    計算的距離範圍-等等),所以,透過郵政編碼查詢經緯度這樣一個數據庫是一個很有用的資源。

    附:C#程式碼:

    private const double EARTH_RADIUS = 6378.137;//地球半徑

    private static double rad(double d)

    {

    return d * Math.PI / 180.0;

    }

    public static double GetDistance(double lat1, double lng1, double lat2, double lng2)

    {

    double radLat1 = rad(lat1);

    double radLat2 = rad(lat2);

    double a = radLat1 - radLat2;

    double b = rad(lng1) - rad(lng2);

    double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +

    Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));

    s = s * EARTH_RADIUS;

    s = Math.Round(s * 10000) / 10000;

    return s;

    }

  • 中秋節和大豐收的關聯?
  • 幾個好朋友在一起吃飯,結賬時大家都搶著買單,你會怎麼做?