1. 程式人生 > >根據經緯度計算兩點之間的距離的公式推導過程以及google.maps的測距函式

根據經緯度計算兩點之間的距離的公式推導過程以及google.maps的測距函式

首先,你要想了解清楚經緯度的具體定義,看完後再往下看,便會一目瞭然。

將地球看成一個球體,A(WA,JA)、B(WB,JB)兩點分別為兩個點的位置,其中W為緯度,J為經度,O為球心,球半徑為R,過A點畫出A的緯度圈並與B所在的經度相交與點C,分別過B、C兩點做球心O所在直線 的垂線相交與E、H,點B做垂線與CH的延長線相交於點D,OH與BC延長線相交與點F。新增輔助線後的兩點距離示意圖如圖所示。

                                                                        圖 兩點距離示意圖

       由示意圖可知, H、E分別為A、B兩點所在緯度圈的圓心,C點為與A點緯度相同,與B點經度相同,F為BC與HE延長線的交點,△OCF∽△DCB,因此:


因為△AHF為直角三角形,所以

             

由於A、C點在同一個緯度圈上,所以

       

設∠ACF為α,則設∠ACF為π-α,根據餘弦定理得


       綜上則可以得出:

          

       根據A、B兩點經緯度可知:


       帶入公式(7),化簡得


       AB弧長(AB兩點的距離)為

   

根據三角函式公                                                     

對(8)進行化簡,得


具體過程如下圖:(手算的,請見諒)


公式中的經緯度均用弧度表示,計算兩點距離的核心程式碼如下:

public static double algorithm(double longitude1, double latitude1, double longitude2, double latitude2) {

              double Lat1 = rad(latitude1); // 緯度

              double Lat2 = rad(latitude2);

              double a = Lat1 - Lat2;//兩點緯度之差

              double b = rad(longitude1) - rad(longitude2); //經度之差

              double s = 2 * Math.asin(Math

                            .sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(b / 2), 2)));//計算兩點距離的公式

              s = s * 6378137.0;//弧長乘地球半徑(半徑為米)

              s = Math.round(s * 10000d) / 10000d;//精確距離的數值

              return s;

       }

       private static double rad(double d) {

              return d * Math.PI / 180.00; //角度轉換成弧度

       }