最近開始做一個類似gis的東西. 需要求一些經緯度相關的值..
看了
通過兩個點的經緯度計算距離這篇,據說是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為距離。