ECEF2BLH
学习和理解推到过程:https://blog.csdn.net/charlee44/article/details/119979831
LLA坐标系转ECEF坐标系
LLA坐标系下的(lon,lat,alt)转换为ECEF坐标系下点(X,Y,Z)
{
X
=
(
N
+
a
l
t
)
c
o
s
(
l
a
t
)
∗
c
o
s
(
l
o
n
)
Y
=
(
N
+
a
l
t
)
c
o
s
(
l
a
t
)
s
i
n
(
l
o
n
)
Z
=
(
N
(
1
−
e
2
)
+
a
l
t
)
s
i
n
(
l
a
t
)
\begin{cases}X =(N+alt)cos(lat)*cos(lon) \\Y=(N+alt)cos(lat)sin(lon) \\Z =(N(1-e^2)+alt)sin(lat)\end{cases}
⎩
⎨
⎧X=(N+alt)cos(lat)∗cos(lon)Y=(N+alt)cos(lat)sin(lon)Z=(N(1−e2)+alt)sin(lat)
2)其中e为椭球偏心率,N为基准椭球体的曲率半径
{
e
2
=
(
a
2
−
b
2
a
2
)
N
=
a
1
−
e
2
s
i
n
2
(
l
a
t
)
\begin{cases}e^2=(\frac{a^2-b^2}{a^2}) \\N=\frac{a}{\sqrt{1-e^2sin^2(lat)}}\end{cases}
{e2=(a2a2−b2)N=1−e2sin2(lat)a
3)由于WGS-84下极扁率f=(a−b)/a 偏心率e和极扁率f之间的关系:
f
=
(
a
−
b
)
/
a
f=(a-b)/a
f=(a−b)/a
e 2 = ( a 2 − b 2 ) a 2 = ( a − b ) ( a + b ) a 2 = ( a − b ) ( 2 a − ( a − b ) ) a 2 = ( a − b ) a ∗ ( 2 a − ( a − b ) ) a = f ∗ ( 2 − f ) e^2 = \frac{(a^2-b^2)}{a^2} \\= \frac{(a-b)(a+b)}{a^2} \\= \frac{(a-b)(2a-(a-b))}{a^2} \\= \frac{(a-b)}{a}*\frac{(2a-(a-b))}{a} \\= f*(2-f) e2=a2(a2−b2)=a2(a−b)(a+b)=a2(a−b)(2a−(a−b))=a(a−b)∗a(2a−(a−b))=f∗(2−f)
(4) 坐标转换公式也可以为
{
X
=
(
N
+
a
l
t
)
c
o
s
(
l
a
t
)
∗
c
o
s
(
l
o
n
)
Y
=
(
N
+
a
l
t
)
c
o
s
(
l
a
t
)
s
i
n
(
l
o
n
)
Z
=
(
N
(
1
−
f
)
2
+
a
l
t
)
s
i
n
(
l
a
t
)
\begin{cases}X =(N+alt)cos(lat)*cos(lon) \\Y=(N+alt)cos(lat)sin(lon) \\Z =(N(1-f)^2+alt)sin(lat)\end{cases}
⎩
⎨
⎧X=(N+alt)cos(lat)∗cos(lon)Y=(N+alt)cos(lat)sin(lon)Z=(N(1−f)2+alt)sin(lat)
(5) 坐标转换公式也可以为
1
−
f
=
1
−
(
a
−
b
)
/
a
=
a
−
a
+
b
a
=
b
a
1-f = 1-(a-b)/a \\=\frac{a-a+b}{a} \\=\frac{b}{a}
1−f=1−(a−b)/a=aa−a+b=ab
{ X = ( N + a l t ) c o s ( l a t ) ∗ c o s ( l o n ) Y = ( N + a l t ) c o s ( l a t ) s i n ( l o n ) Z = ( N ∗ a 2 b 2 + a l t ) s i n ( l a t ) \begin{cases}X =(N+alt)cos(lat)*cos(lon) \\Y=(N+alt)cos(lat)sin(lon) \\Z =(N*\frac{a^2}{b^2}+alt)sin(lat)\end{cases} ⎩ ⎨ ⎧X=(N+alt)cos(lat)∗cos(lon)Y=(N+alt)cos(lat)sin(lon)Z=(N∗b2a2+alt)sin(lat)
ECEF坐标系转LLA坐标系
l o n = a r c t a n ( y x ) a l t = p c o s ( l a t ) − N l a t = a r c t a n [ z p ∗ ( 1 − e 2 ∗ N N + a l t ) − 1 ] p = x 2 + y 2 \\ lon = arctan(\frac{y}{x}) \\alt = \frac{p}{cos(lat)-N} \\ lat = arctan[\frac{z}{p}*(1-e^2*\frac{N}{N+alt})^{-1}] \\ p = \sqrt{x^2+y^2} lon=arctan(xy)alt=cos(lat)−Nplat=arctan[pz∗(1−e2∗N+altN)−1]p=x2+y2
具体求解算法参考:坐标系转换之LLA、ECEF、ENU互转 – MathSword数值计算软件
算法二
大地经纬度坐标与地心地固坐标的的转换_地心坐标转换为经纬度坐标matlab-CSDN博客
BLH->XYZ
将P点所在的子午椭圆放在平面上,以圆心为坐标原点,建立平面直接坐标系:
对照地心地固坐标系,很容易得出:
{ Z = y X = x ∗ c o s L Y = x ∗ s i n L \begin{cases}Z = y\\X=x*cosL\\Y =x*sinL\end{cases} ⎩ ⎨ ⎧Z=yX=x∗cosLY=x∗sinL (1)
椭球上一点 P P P:
图(1)
满足:
a 2 x 2 + b 2 y 2 = 1 a^2x^2+b^2y^2=1 a2x2+b2y2=1 (1-2)
对x求导,有:
d y d x = − b 2 a 2 x y \frac{\mathrm{d}y}{\mathrm{d}{x}}= -\frac{b^2}{a^2}\frac{x}{y} dxdy=−a2b2yx (2)
又根据解析几何可知,函数曲线(椭圆)某一点(就是P点)的倒数为该点切线的斜率,也就是正切值:
d
y
d
x
=
t
a
n
(
9
0
o
+
B
)
=
−
c
o
t
B
(3)
\frac{dy}{dx} = tan(90^o + B) = -cotB \tag{3}
dxdy=tan(90o+B)=−cotB(3) (3)
联立公式(2)(3),可得:
y = b 2 a 2 t a n B = x ( a 2 − ( a 2 − b 2 ) a 2 ) t a n B = x ( 1 − a 2 − b 2 a 2 ) t a n B y=\frac{b^2}{a^2}tanB\\=x(\frac{a^2-(a^2-b^2)}{a^2})tanB\\=x(1-\frac{a^2-b^2}{a^2})tanB y=a2b2tanB=x(a2a2−(a2−b2))tanB=x(1−a2a2−b2)tanB
又: e = a 2 − b 2 a e=\frac{\sqrt{a^2-b^2}}{a} e=aa2−b2,所以:
y = x ( 1 − e 2 ) t a n B (4) y = x(1-e^2)tanB \tag{4} y=x(1−e2)tanB(4) (4)
其中,e为椭圆第一偏心率
令Pn的距离为N,那么显然有:
x=NcosB (4-2)
根据(4)式可得:
y
=
N
(
1
−
e
2
)
s
i
n
B
y = N(1-e^2)sinB
y=N(1−e2)sinB (4-3)
将其带入(1)式,可得到椭球上P点的坐标为:
{
X
=
N
c
o
s
B
c
o
s
L
Y
=
N
c
o
s
B
s
i
n
L
Z
=
N
(
1
−
e
2
)
s
i
n
B
\begin{cases}X =NcosBcosL\\Y=NcosBsinL\\Z =N(1-e^2)sinB\end{cases}
⎩
⎨
⎧X=NcosBcosLY=NcosBsinLZ=N(1−e2)sinB
那么唯一的未知量就是Pn的长度N了,将(4)式带入到椭圆方程式(1.2):
x 2 a 2 + x 2 ( 1 − e 2 ) 2 t a n 2 B b 2 ) = 1 \frac{x^2}{a^2}+\frac{x^2(1-e^2)^2tan^2B }{b^2})=1 a2x2+b2x2(1−e2)2tan2B)=1
又: e 2 = a 2 − b 2 a 2 e^2 = \frac{a^2-b^2}{a^2} e2=a2a2−b2 故: b 2 = a 2 ( 1 − e 2 ) b^2= a^2(1-e^2) b2=a2(1−e2),则
x 2 a 2 + x 2 ( 1 − e 2 ) 2 t a n 2 B a 2 ( 1 − e 2 ) ) = x 2 ( 1 + ( 1 − e 2 ) t a n 2 B ) a 2 = 1 \frac{x^2}{a^2}+\frac{x^2(1-e^2)^2tan^2B }{a^2(1-e^2)})=\frac{x^2(1+(1-e^2)tan^2B)}{a^2} = 1 a2x2+a2(1−e2)x2(1−e2)2tan2B)=a2x2(1+(1−e2)tan2B)=1,等式两边乘以 a 2 c o s 2 B a^2cos^2B a2cos2B
x 2 [ c o s 2 B + ( 1 − e 2 ) s i n 2 B ] = a 2 c o s 2 B x^2[cos^2B +(1-e^2)sin^2B] = a^2cos^2B x2[cos2B+(1−e2)sin2B]=a2cos2B
x 2 [ c o s 2 B + s i n 2 B − e 2 s i n 2 B ] = x 2 ( 1 − e 2 s i n 2 B ) = a 2 c o s 2 B x^2[cos^2B + sin^2B - e^2sin^2B] = x^2(1-e^2sin^2B) = a^2cos^2B x2[cos2B+sin2B−e2sin2B]=x2(1−e2sin2B)=a2cos2B
简化为:
x = a c o s B 1 − e 2 s i n 2 B x=\frac{acosB}{\sqrt{1-e^2sin^2B}} x=1−e2sin2BacosB (6)
联立(5)(6)得:
N = a s q r t 1 − e 2 s i n 2 B N = \frac{a}{sqrt{1-e^2sin^2B}} N=sqrt1−e2sin2Ba (6-2)
通过式(5)式(6),可以计算椭球上某一点的坐标。但这个点并不是我们真正要求的点,我们要求的点P(B,L,H)是椭球面沿法向量向上H高度的点:
图(2)
P点在椭球面上的点为 P 0 P_0 P0,那么根据矢量相加的性质,有:
P = P 0 + H . n P = P_0 + H.n P=P0+H.n (6-3)
其中, P 0 P_0 P0也就是式(5),而n是 P 0 P_0 P0在椭球面的返现单位矢量。
矢量在任意位置的方向都是一样的,那么我们可以假设存在一个单位球(球的半径为单位1),将法线单位矢量移动到球心位置,可得法线单位矢量为:
n = [ c o s B c o s L c o s B s i n L s i n B ] n = \left [ \begin{matrix} cosBcosL \\ cosBsinL \\ sinB \end{matrix} \right] n= cosBcosLcosBsinLsinB (7)
因此有
P = [ x y z ] = [ ( N + H ) c o s B c o s L ( N + H ) c o s B s i n L [ N ( 1 − e 2 ) + H ] s i n B ] P = \left [ \begin{matrix} x \\y \\z \end{matrix}\right ]=\left[ \begin{matrix} (N+H)cosBcosL \\(N+H)cosBsinL \\ [N(1-e^2)+H]sinB \end{matrix}\right] P= xyz = (N+H)cosBcosL(N+H)cosBsinL[N(1−e2)+H]sinB (8)
其中:
$ N = \frac{a}{\sqrt{1-e2sin2B}}$$ (9)
XYZ->BLH
根据式(8),可知,:
Y X = ( N + H ) c o s B s i n L ( N + H ) c o s B c o s L = t a n L \frac{Y}{X} = \frac{(N+H)cosBsinL}{(N+H)cosBcosL} = tanL XY=(N+H)cosBcosL(N+H)cosBsinL=tanL
故,经度:
L = a r c t a n ( Y X ) L = arctan(\frac{Y}{X}) L=arctan(XY) (10)
不过纬度B就不是那么好算了,首先需要计算法线Pn在赤道两侧的长度。根据图1,有
y = P Q s i n B y=PQsinB y=PQsinB
与式(4-3)比较可得:
P Q = N ( 1 − e 2 ) PQ=N(1−e2) PQ=N(1−e2)
显然,由于
P n = N = P Q + Q n Pn=N=PQ+Qn Pn=N=PQ+Qn
有: Q n = N e 2 Qn=Ne2 Qn=Ne2
接下来如下图所示,对图1做辅助线:
图(3)
有:
{ P P ‘ ‘ = Z O P ‘ ‘ = x 2 + y 2 P P ‘ ‘ ‘ = O K p = Q K p s i n B = N e 2 s i n B P ‘ ‘ P ‘ ‘ ‘ = P P ‘ ‘ + P P ‘ ‘ ‘ \begin{cases} PP^{``}=Z \\ OP^{``} = \sqrt{x^2+y^2}\\ PP^{```} = OK_p = QK_psinB=Ne^2sinB \\ P^{``}P^{```}= PP^{``} + PP^{```}\end{cases} ⎩ ⎨ ⎧PP‘‘=ZOP‘‘=x2+y2PP‘‘‘=OKp=QKpsinB=Ne2sinBP‘‘P‘‘‘=PP‘‘+PP‘‘‘
因而可得:
t a n B = Z + N e 2 s i n B x 2 + x 2 tanB=\frac{Z+Ne^2sinB}{\sqrt{x^2+x^2}} tanB=x2+x2Z+Ne2sinB (11)
这个式子两边都有待定量B,需要用迭代法进行求值。具体可参看代码实现,初始的待定值可取
t a n B = z x 2 + y 2 tanB= \frac{z}{\sqrt{x^2+y^2}} tanB=x2+y2z
大地纬度B已知,那么求高度H就非常简单了,直接根据式(8)中的第三式逆推可得:
$H = \frac{Z}{sinB} - N(1-e^2) $ (12)
汇总三式,可得:
{ L = a r c t a n ( Y X ) t a n B = Z + N e 2 s i n B x 2 + x 2 H = Z s i n B − N ( 1 − e 2 ) \begin{cases} L= arctan(\frac{Y}{X}) \\ tanB=\frac{Z+Ne^2sinB}{\sqrt{x^2+x^2}} \\H = \frac{Z}{sinB} - N(1-e^2) \end{cases} ⎩ ⎨ ⎧L=arctan(XY)tanB=x2+x2Z+Ne2sinBH=sinBZ−N(1−e2)