天天看点

地心地固坐标系(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);经纬度对应圆弧距离

继续阅读