两点坐标间距离的算法以及验证【转】
生活随笔
收集整理的這篇文章主要介紹了
两点坐标间距离的算法以及验证【转】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
看了通過兩個點的經(jīng)緯度計算距離這篇,據(jù)說是Google里扒來的算法,于是決定驗證一下。
東改西改改成了個VB的代碼,通過計算發(fā)現(xiàn)非常正確。
用30,120和31,121兩個坐標點進行驗證,同Mapinfo中計算的結果非常的相近。
后來又把坐標系直接當成直角坐標系來計算,發(fā)現(xiàn)誤差很大。
于是仍然用直角坐標系方法來計算,給緯度加上了個0.86的參數(shù),這樣計算下來和結果相近。
不上傳文件了,直接貼代碼了。代碼如下:(五個TEXT,三個Button)
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))?????'沒有反正弦函數(shù),網(wǎng)上找了個
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
東改西改改成了個VB的代碼,通過計算發(fā)現(xiàn)非常正確。
用30,120和31,121兩個坐標點進行驗證,同Mapinfo中計算的結果非常的相近。
后來又把坐標系直接當成直角坐標系來計算,發(fā)現(xiàn)誤差很大。
于是仍然用直角坐標系方法來計算,給緯度加上了個0.86的參數(shù),這樣計算下來和結果相近。
不上傳文件了,直接貼代碼了。代碼如下:(五個TEXT,三個Button)
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))?????'沒有反正弦函數(shù),網(wǎng)上找了個
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
轉載于:https://www.cnblogs.com/zhuor/archive/2011/07/21/2113250.html
總結
以上是生活随笔為你收集整理的两点坐标间距离的算法以及验证【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么能在main()函数之前或之后执行
- 下一篇: [置顶]信息发布系统 Jquery+MV