[转载]根据两点的经纬度求方位角和距离,等
轉:http://blog.sina.com.cn/s/blog_658a93570101hynw.html
原文地址:根據兩點的經緯度求方位角和距離,等作者:多乎哉不多也多亦不多乎實乃少也最近自己做的一個小東西要用到經緯度方面的計算,查遍中文網頁見到的要么基本上是一幫惜字如金裝大爺的“磚家”,要么就是像貼膏藥一樣,啪,一大堆代碼往上一貼,一點說明都沒有,讓人看不懂,有的看了半天看懂了,結果他用的公式要么有使用局限(但沒有半點聲明)要么根本就是個錯的。所以現在將自己幾天學習來的在這里總結一下,方便后來人少走彎路。
這里主要解決四個問題:
1、已知兩點經緯度,求一點相對于另一點方位角;
2、已知兩點經緯度,求兩點間距離;
3、已知一點經緯度及與另一點距離和方位角,求另一點經緯度;
4、問題1與問題2的簡化算法。
注:簡化算法的運算量和對系統的運算精度要求都大大降低,但只在短距離內(高緯地區建議10km以下)可以保證精度,除簡化算法之外的算法可適用于地球上任意兩點。這里只是出于便于理解的目的來解釋“原理”,具體到不同的編程環境還要自己做化簡和注意單位。
?
在求算前我們先對符號及單位進行約定:
此處設定求B相對于A的方位角,即A為當前位置,B為目標位置
Aj:A點經度
Aw:A點緯度
Bj:B點經度
Bw:B點緯度
北緯為正,南緯為負;東經為正,西經為負
經緯度使用度,DDD.DDDDDD°,非度分或度分秒。
度數未加說明均采用角度制
R:地球平均半徑
Azimuth:方位角,以真北為0度起點,由東向南向西順時針旋轉360度
A,B,C表示球面上的三個點及球面上“弧線”在該點處所夾的角
a,b,c表示A,B,C三點的對“弧”兩端點與地心連線所夾的角(其實這里解釋成ABC三點對弧的弧度更方便)
O為球心
L為AB兩點間球面距離
(注:因我考慮欠缺,沒有注意字母C大小寫較難分辨,所以此處提醒讀者在后面的公式中注意C的大小寫。)
?
一、方位角的求算
已知A、B兩點經緯度,如何求出B相對于A的方位角?
——————————————————賣關子環節,可選擇性跳過———————————————————
說到這里,人們或許會首先想因為地球是個球體,如果AB兩點足夠近(如相距1Km)可以當做平面三角形已知兩臨邊求夾角,把兩點的經度、緯度各自做差,差值作為兩邊的長度,再用反正切函數一算就得到了角度,似乎很有道理,但是如果將計算結果與實際測量值做比較,就會發現比較大的誤差,而這種誤差在某些地區甚至能用普通的量角器測量出來,其實這已經不叫誤差,而叫錯誤了。這種近似利用平面幾何知識解決問題的算法只適合于低緯度地區(例如南北緯10度),如果在高緯度使用這種方法,偏差會比較大,并且這種偏差會隨著緯度的升高而大幅變大。例如,在北緯10度,AB兩點經緯差0.001時,近似算法與真實值之間的偏差為0.44度。當緯度改為北緯40度其他不變,這時的偏差就達到了7.55度。
為什么會這樣呢?其實原因就在于經線、緯線劃定不同。如果把地球簡化成一個球體,每條經線的長度都等于球體周長的一半,每條經線均在兩極相交。但是,緯線之間互不相交,緯線所圍成的圓均為“同軸”圓,所以每條緯線的長度會因緯度的不同而不同,也就是,緯度不同,1經度差所對應的球面距離是不一樣的,例如,在赤道處,1緯度的跨度約為111.3千米,1經度的跨度也是約為111.3千米;在北緯40附近,1緯度的跨度沒有變,但1經度的跨度卻變為85.3千米。(轉不過彎來的可以去看地球儀,看看就了然了~)
——————————————————賣關子環節結束,正文開啟———————————————————
那么,有沒有一種對地球任何區域任意兩點都普適的求方位角的方法?
答案是肯定的。
現在我們開始計算
第一步:在知道AB點經緯度后,要用到第一個公式,三面角余弦公式,
A~OC~B是面AOC與面BOC的二面角,為了方便,寫成這個樣子
這里我們將已知數據代入,公式便寫成:
沒錯,二面角A~OC~B的度數就是兩點經度之差
第二步:知道了角c的余弦值后我們要求得它的正弦值,所用的公式就是三角函數公式里最基本的“扣方加賽方等于1”的一個變形
第三步:求得正弦后,接下來我們要用一個不太常用的公式,球面正弦公式
將已知數據代入并稍微變形一下,公式寫為:
用反正弦函數求角度,于是上式可直接寫成
這里需要注意一點,我們一開始的假設便是求B點相對于A點的方位角,因此這里是Bj-Aj,不要寫反,否則得不到正確結果。
算到這里,還沒有完,得到的結果并不總符合我們對方位角的定義,因此要根據B相對于A的位置在四個象限兩個軸上進行討論,依據不同情況對計算結果進行不同處理。假設A點固定于原點,則:
B點在第一象限,Azimuth=A;
B在第二象限,Azimuth=360+A;
B在第三四象限,Azimuth=180-A。
這里只說了象限的討論結果,因為軸上的討論更復雜些,要結合程序運行環境一起考慮,考慮的主要因素是系統的計算精度。譬如,在三面角余弦公式中,當AB點緯度值相同時,對公式的值起決定作用的就是cos(Bj-Aj)這一項,當Bj-Aj的值比較小時,例如0.0001(這在赤道地區對應的長度為11米左右),用一般的計算器計算時值為1,這樣,后面的計算便不可能完成。但是,如果用計算機計算則為0.999999999998476913…………。所以,基于以上原因,需要對軸的“范圍進項擴充”,要用單片機、手機運算的尤其要注意。
經過一系列計算,最后,就得到了最終結果。
似乎有人注意到了,以上的計算都是把地球看成標準的球體,而事實是地球是個橢圓,其實,地球的偏心率極低,各位可以將此法得到的計算結果與谷歌地球(WGS84坐標系統,我說的不是谷歌地圖)上的結果進行對比,偏差是非常小的(我測的幾個值,最大偏差0.5度)。
?
二、距離的求算
其實,“眼尖”的或許已經注意到了,第一步的余弦值結果就可以直接用來求算AB兩點間的球面距離,用反余弦函數求得c的度數,再將度數轉換為弧度,乘以地球半徑就得到了兩點間的球面距離。
公式為
這里要注意,L的單位與R的單位一致,單位不同的不要忘記換算
短距離(例如100米,30米)使用這個公式,計算出的結果與谷歌地球給出的距離偏差在0.5%以下,長距離計算時,偏差則可以降至0.01%以下。求算的距離越大,偏差越小,就是這個公式的特點,原因不說自明。
?
PS:對于一些GPS接收機,其數據格式為NMEA-0183,經緯度數據為DDDMM.MMMM,需要將它轉換為度,公式為:
經緯度(度)=DDD+MM.MMMM/60
?
三、第二點經緯度的求算
最近在網上看到不少人在問第二點經緯度的求算,所以,這里也附加說一下求算方法。
都應該能想到一個最最最笨的方法,就是將前面兩部分用的公式聯立解方程。我想只有那些度娘知道里的專家會采用這種方法(因為這種方法費的唾沫最少)。
言歸正傳,解方程的方法可以,但是運算量極大,費時,對于一些系統不現實。
另一種方法,其實就是對方位角求算的再次運用。
已知Aj,Aw,L,R,Azimuth(這里的Azimuth依然定為B相對于A的方位角)。
首先求算c,
(注意此處L、R的單位要統一)
之后求解a,將已知量代入,公式為:
求得a之后我們求解C,
寫到這里應該都恍然大悟了吧,
Bw=90-a
Bj=Aj+C
PS:對于上面兩個三角公式的理解,可以想成把A點作為北極點,相當于把方位角求算中的公式原封不動的再用一遍(其實就是再用了一遍)。
?
四、簡化算法
上面講的算法對于運算精度低的系統簡直就像是噩夢。所以這里不得不講講簡化算法。簡化算法的結果在短距離內可以保證精確度,但是在長距離時,因為地球球面的特性,是萬萬不能用的。
簡化算法的基本思路就是將以經緯度表示的球坐標轉換成三維直角坐標,再利用平面幾何知識去解決。
求算距離:
設:Xa、Ya、Za為三維直角坐標下A點的坐標,B點坐標同樣式,
????Ha為A點海拔高度,Hb為b點海拔高度
則
Xa=(R+Ha)×cos(Aw)×cos(Aj)
Ya=(R+Ha)×cos(AW)×sin(Aj)
Za=(R+Ha)×sin(Aw)
?
Xb=(R+Hb)×cos(Bw)×cos(Bj)
Yb=(R+Hb)×cos(Bw)×sin(Bj)
Zb=(R+Hb)×sin(Bw)
(注:此處坐標轉換為誘導公式化簡后的形式,關于球坐標轉直角坐標的原公式可點此查看:球坐標轉直角坐標)
?
ΔX=Xa-Xb ??????ΔY=Ya-Yb???????ΔZ=Za-Zb 知道三個坐標軸方向上的差值后再用勾股定理就可以求出兩點間距離了,即:這里說明一下,海拔高度H可有可無,如果有的話,注意H與R單位要統一。普通GPS接收機給出的海拔一般很不準確,所以不推薦使用。另外NMEA規范報文中有兩個量涉及到海拔,注意計算。 求算方位角 如果想直接由經緯度求算方位角,則可以避開上面的坐標轉換,直接這樣求:
上面這個式子的基本思路就是將經度和緯度差轉化成地面距離再運用平面幾何知識求解,化簡之后即為上式(過程從略,可自行推導) 這樣,當
B點在第一象限及Y軸正半軸,Azimuth=A;
B在第二象限,Azimuth=360+A;
B在第三四象限及Y軸負半軸,Azimuth=180+A。
對于某些系統,再單獨設定B位于X正負半軸上的值就可以了,有些系統可以返回arctan(X/0)=90。
這種求方位角的算法代入了幾個坐標值與谷歌地球比對,短距離內偏差在0.1度以下。
?
最后,關于百度上很多人答的需要將WGS84坐標轉換成什么北京54、西安80再計算的高深言論,我認為只要不是搞大地測量、土木工程、導彈發射根本就沒有必要,理論分析與計算結果都說明WGS84坐標系統完全可直接用于民用領域。
?
(度娘知道裝大爺的ctrl+c黨copy的時候注明出處。All rights reserved.)
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的[转载]根据两点的经纬度求方位角和距离,等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KindEditorckplayer的简
- 下一篇: IOS开发基础知识--碎片32