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

設(shè)兩點A、B的經(jīng)、緯度分別為(jA,wA)(jB,wB),則半徑為R的球面上兩點間的最短距離(大圓弧)為:
弧AB=R*arccos[sin(wA)sin(wB)+cos(wA)cos(wB)*cos(jA-jB)]
地球是一個近乎標(biāo)準(zhǔn)的橢球體,它的赤道半徑為6378.140千米,極半徑為6356.755千米,平均半徑6371.004千米。如果我們假設(shè)地球是一個完美的球體,那么它的半徑就是地球的平均半徑,記為R。如果以0度經(jīng)線為基準(zhǔn),那么根據(jù)地球表面任意兩點的經(jīng)緯度就可以計算出這兩點間的地表距離(這里忽略地球表面地形對計算帶來的誤差,僅僅是理論上的估算值)。設(shè)第一點A的經(jīng)緯度為(LonA, LatA),第二點B的經(jīng)緯度為(LonB, LatB),按照0度經(jīng)線的基準(zhǔn),東經(jīng)取經(jīng)度的正值(Longitude),西經(jīng)取經(jīng)度負值(-Longitude),北緯取90-緯度值(90-Latitude),南緯取90+緯度值(90+Latitude),則經(jīng)過上述處理過后的兩點被計為(MLonA, MLatA)和(MLonB, MLatB)。那么根據(jù)三角推導(dǎo),可以得到計算兩點距離的如下公式:
C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB)
Distance = R*Arccos(C)*Pi/180
這里,R和Distance單位是相同,如果是采用6371.004千米作為半徑,那么Distance就是千米為單位。
如果僅對經(jīng)度作正負的處理,而不對緯度作90-Latitude(假設(shè)都是北半球,南半球只有澳洲具有應(yīng)用意義)的處理,那么公式將是:
C = sin(LatA)*sin(LatB) + cos(LatA)*cos(LatB)*cos(MLonA-MLonB)
Distance = R*Arccos(C)*Pi/180
以上通過簡單的三角變換就可以推出。
如果三角函數(shù)的輸入和輸出都采用弧度值,那么公式還可以寫作:
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ù)兩點間經(jīng)緯度坐標(biāo)(double值),計算兩點間距離,單位為米 |
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; |