用GPS測(cè)出兩個(gè)點(diǎn)的經(jīng)緯度后,如何計(jì)算這兩個(gè)點(diǎn)之間的距離呢?

設(shè)兩點(diǎn)A、B的經(jīng)、緯度分別為(jA,wA)(jB,wB),則半徑為R的球面上兩點(diǎn)間的最短距離(大圓弧)為:
弧AB=R*arccos[sin(wA)sin(wB)+cos(wA)cos(wB)*cos(jA-jB)]
地球是一個(gè)近乎標(biāo)準(zhǔn)的橢球體,它的赤道半徑為6378.140千米,極半徑為6356.755千米,平均半徑6371.004千米。如果我們假設(shè)地球是一個(gè)完美的球體,那么它的半徑就是地球的平均半徑,記為R。如果以0度經(jīng)線為基準(zhǔn),那么根據(jù)地球表面任意兩點(diǎn)的經(jīng)緯度就可以計(jì)算出這兩點(diǎn)間的地表距離(這里忽略地球表面地形對(duì)計(jì)算帶來(lái)的誤差,僅僅是理論上的估算值)。設(shè)第一點(diǎn)A的經(jīng)緯度為(LonA, LatA),第二點(diǎn)B的經(jīng)緯度為(LonB, LatB),按照0度經(jīng)線的基準(zhǔn),東經(jīng)取經(jīng)度的正值(Longitude),西經(jīng)取經(jīng)度負(fù)值(-Longitude),北緯取90-緯度值(90-Latitude),南緯取90+緯度值(90+Latitude),則經(jīng)過(guò)上述處理過(guò)后的兩點(diǎn)被計(jì)為(MLonA, MLatA)和(MLonB, MLatB)。那么根據(jù)三角推導(dǎo),可以得到計(jì)算兩點(diǎn)距離的如下公式:
C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
Distance = R*Arccos(C)*Pi/180
這里,R和Distance單位是相同,如果是采用6371.004千米作為半徑,那么Distance就是千米為單位。
如果僅對(duì)經(jīng)度作正負(fù)的處理,而不對(duì)緯度作90-Latitude(假設(shè)都是北半球,南半球只有澳洲具有應(yīng)用意義)的處理,那么公式將是:
C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)
Distance = R*Arccos(C)*Pi/180
以上通過(guò)簡(jiǎn)單的三角變換就可以推出。
如果三角函數(shù)的輸入和輸出都采用弧度值,那么公式還可以寫(xiě)作:
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
5 | private const double EARTH_RADIUS = 6378.137 ; |
7 | private static double rad( double d) |
9 | return d * Math.PI / 180.0 ; |
13 | * 根據(jù)兩點(diǎn)間經(jīng)緯度坐標(biāo)(double值),計(jì)算兩點(diǎn)間距離,單位為米 |
15 | public static double GetDistance( double lat1, double lng1, double lat2, double lng2) |
17 | double radLat1 = rad(lat1); |
18 | double radLat2 = rad(lat2); |
19 | double a = radLat1 - radLat2; |
20 | double b = rad(lng1) - rad(lng2); |
21 | double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/ 2 ), 2 ) + |
22 | Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/ 2 ), 2 ))); |
24 | s = Math.Round(s * 10000 ) / 10000 ; |