天天看點

地心地固坐标系(ECEF)與站心坐标系(ENU)的轉換

詳細論述了地心坐标系到站心坐标的轉換原理及其實作。

目錄

1. 概述

2. 原理

2.1. 平移

2.2. 旋轉

2.3. 總結

3. 實作

4. 參考

我在《大地經緯度坐标與地心地固坐标的的轉換》這篇文章中已經論述了地心坐标系的概念。我們知道,基于地心坐标系的坐标都是很大的值,這樣的值是不太友善進行空間計算的,是以很多時候可以選取一個站心點,将這個很大的值變換成一個較小的值。以圖形學的觀點來看,地心坐标可以看作是世界坐标,站心坐标可以看作局部坐标。

站心坐标系以一個站心點為坐标原點,當把坐标系定義為X軸指東、Y軸指北,Z軸指天,就是ENU(東北天)站心坐标系。這樣,從地心地固坐标系轉換成的站心坐标系,就會成為一個符合常人對地理位置認知的局部坐标系。同時,隻要站心點位置選的合理(通常可選取地理表達區域的中心點),表達的地理坐标都會是很小的值,非常便于空間計算。

地心地固坐标系(ECEF)與站心坐标系(ENU)的轉換

注意站心天向(法向量)與赤道面相交不一定會經過球心

令選取的站心點為P,其大地經緯度坐标為\((B_p,L_p,H_p)\),對應的地心地固坐标系為\((X_p,Y_p,Z_p)\)。地心地固坐标系簡稱為ECEF,站心坐标系簡稱為ENU。

通過第一節的圖可以看出,ENU要轉換到ECEF,一個很明顯的圖形操作是平移變換,将站心移動到地心。根據站心點P在地心坐标系下的坐标\((X_p,Y_p,Z_p)\),可以很容易推出ENU轉到ECEF的平移矩陣:

\[T =

\begin{bmatrix}

1&0&0&X_p\\

0&1&0&Y_p\\

0&0&1&Z_p\\

0&0&0&1\\

\end{bmatrix}

\]

反推之,ECEF轉換到ENU的平移矩陣就是T的逆矩陣:

\[T^{-1} =

1&0&0&-X_p\\

0&1&0&-Y_p\\

0&0&1&-Z_p\\

另外一個需要進行的圖形變換是旋轉變換,其旋轉變換矩陣根據P點所在的經度L和緯度B确定。這個旋轉變換有點難以了解,需要一定的空間想象能力,但是可以直接給出如下結論:

當從ENU轉換到ECEF時,需要先旋轉再平移,旋轉是先繞X軸旋轉\((\frac{pi}{2}-B)\),再繞Z軸旋轉\((\frac{pi}{2}+L)\)

當從ECEF轉換到ENU時,需要先平移再旋轉,旋轉是先繞Z軸旋轉\(-(\frac{pi}{2}+L)\),再繞X軸旋轉\(-(\frac{pi}{2}-B)\)

根據我在《WebGL簡易教程(五):圖形變換(模型、視圖、投影變換)》提到的旋轉變換,繞X軸旋轉矩陣為:

\[R_x =

1&0&0&0\\

0&cosθ&-sinθ&0\\

0&sinθ&cosθ&0\\

繞Z軸旋轉矩陣為:

\[R_z =

cosθ&-sinθ&0&0\\

sinθ&cosθ&0&0\\

0&0&1&0\\

從ENU轉換到ECEF的旋轉矩陣為:

\[R = {R_z(\frac{pi}{2}+L)}\cdot{R_x(\frac{pi}{2}-B)}

\tag{1}

根據三角函數公式:

\[sin(π/2+α)=cosα\\

sin(π/2-α)=cosα\\

cos(π/2+α)=-sinα\\

cos(π/2-α)=sinα\\

有:

\[R_z(\frac{pi}{2}+L) =

-sinL&-cosL&0&0\\

cosL&-sinL&0&0\\

\tag{2}

\[R_x(\frac{pi}{2}-B) =

0&sinB&-cosB&0\\

0&cosB&sinB&0\\

\tag{3}

将(2)、(3)帶入(1)中,則有:

\[R =

-sinL&-sinBcosL&cosBcosL&0\\

cosL&-sinBsinL&cosBsinL&0\\

\tag{4}

而從ECEF轉換到ENU的旋轉矩陣為:

\[R^{-1} = {R_x(-(\frac{pi}{2}-B))} \cdot {R_z(-(\frac{pi}{2}+L))}

\tag{5}

旋轉矩陣是正交矩陣,根據正交矩陣的性質:正交矩陣的逆矩陣等于其轉置矩陣,那麼可直接得:

\[R^{-1} =

-sinL&cosL&0&0\\

-sinBcosL&-sinBsinL&cosB&0\\

cosBcosL&cosBsinL&sinB&0\\

\tag{6}

将上述公式展開,可得從ENU轉換到ECEF的圖形變換矩陣為:

\[M = T \cdot R =

而從ECEF轉換到ENU的圖形變換矩陣為:

\[M^{-1} = R^{-1} * T^{-1} =

接下來用代碼實作這個坐标轉換,選取一個站心點,以這個站心點為原點,擷取某個點在這個站心坐标系下的坐标:

這個示例先用Eigen矩陣庫,計算了坐标轉換需要的矩陣和轉換結果;然後通過osgEarth進行了驗證,兩者的結果基本一緻。運作結果如下:

地心地固坐标系(ECEF)與站心坐标系(ENU)的轉換

站心坐标系和WGS-84地心地固坐标系互相轉換矩陣

Transformations between ECEF and ENU coordinates

GPS經緯度坐标WGS84到東北天坐标系ENU的轉換

三維旋轉矩陣;東北天坐标系(ENU);地心地固坐标系(ECEF);大地坐标系(Geodetic);經緯度對應圓弧距離

繼續閱讀