根據兩點的經緯度求方位角和距離

 

這裏主要解決四個問題:

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座標系統完全可直接用於民用領域。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章