通過兩個點的經緯度計算距離
看了通過兩個點的經緯度計算距離這篇,據說是Google里扒來的算法,于是決定驗證一下。
通過計算發現非常正確。
用30,120和31,121兩個坐標點進行驗證,同Mapinfo中計算的結果非常的相近。
后來又把坐標系直接當成直角坐標系來計算,發現誤差很大。
于是仍然用直角坐標系方法來計算,給緯度加上了個0.86的參數,這樣計算下來和結果相近。
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;
}
vb代碼
Const EARTH_RADIUS = 6378.137
Const Pi = 3.1415926535898
Function rad(ByVal d As Double) As Double
rad = d * Pi / 180
End Function
Function GetDistance(lat1 As Double, lng1 As Double, lat2 As Double, lng2 As Double) As Double
Dim radlat1 As Double, radlat2 As Double
Dim a As Double, b As Double, s As Double, Temp As Double
radlat1 = rad(lat1)
radlat2 = rad(lat2)
a = radlat1 - radlat2
b = rad(lng1) - rad(lng2)
Temp = Sqr(Sin(a / 2) ^ 2 + Cos(radlat1) * Cos(radlat2) * Sin(b / 2) ^ 2)
s = 2 * Atn(Temp / Sqr(-Temp * Temp + 1)) '沒有反正弦函數,網上找了個
s = s * EARTH_RADIUS
GetDistance = s
End Function
Private Sub Command1_Click()
Text5.Text = Str(GetDistance(Val(Text1.Text), Val(Text2.Text), Val(Text3.Text), Val(Text4.Text)))
End Sub
Private Sub Command2_Click()
Text5.Text = Str((Sqr((Val(Text3.Text) - Val(Text1.Text)) ^ 2 + (Val(Text4.Text) - Val(Text2.Text)) ^ 2)) * 111.3199338)
End Sub
Private Sub Command3_Click()
Text5.Text = Str((Sqr((Val(Text3.Text) * 0.86 - Val(Text1.Text) * 0.86) ^ 2 + (Val(Text4.Text) - Val(Text2.Text)) ^ 2)) * 111.3199338)
End Sub
A(60,30),B(60,90)兩點之間,此段代碼和我用余弦定理算出來的結果很一致。
余弦定理的步驟是:1、算A、B弦長:地球半徑R*cos(經度差60)=R/2;
2、算角AOB,O為地球圓心,利用余弦定理,
cosAOB=(2R*R-(R/2)^2) /2*R*R=7/8;
3、弧AB的長為:R*arc cos(7/8);求畢
原理:
地球赤道上環繞地球一周走一圈共40075.04公里,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的長度計算如下:
40075.04km/360°=111.31955km
111.31955km/60=1.8553258km=1855.3m
而每一分又有60秒,每一秒就代表1855.3m/60=30.92m
任意兩點距離計算公式為
d=111.12cos{1/[sinΦAsinΦB十cosΦAcosΦBcos(λB—λA)]}
其中A點經度,緯度分別為λA和ΦA,B點的經度、緯度分別為λB和ΦB,d為距離。
posted on 2008-02-28 15:18 Khan 閱讀(16306) 評論(11) 編輯 收藏 引用 所屬分類: GCC/G++ 、跨平臺開發 、Java 、周邊技術

