椭球体下,尤其是地球的旋转椭球体下,大地坐标和笛卡尔坐标的相互转换是最基础的算法了。本章给出两种坐标系下相互转换的原理及相应的转换公式,供参考。
大地坐标(Geodetic coordinate)是大地测量中以参考椭球面为基准面的坐标,点P的位置用大地经度λ、大地纬度φ和大地高H表示。
大地坐标多应用于大地测量学,测绘学等。具体为:
注意大地纬度与地心纬度的区别!大地坐标的示意图如下。
点P的笛卡尔坐标即为参考椭球体中心直角坐标系下的坐标,使用 ( x , y , z ) (x,y,z) (x,y,z)表示。
大地坐标向笛卡尔坐标的转换为直接转换,不需要迭代。
见上图,已知 P P P点的大地坐标 ( λ , φ , h ) (\lambda,\varphi,h) (λ,φ,h), P ′ P' P′为 P P P点在椭球面上的投影点,即 P ′ P P'P P′P为 P ′ P' P′点的法线方向(定义为 n \textbf{n} n)。
法线向量
n
\textbf{n}
n很容易由大地经度和大地纬度计算得到:
n
=
[
c
o
s
(
φ
)
c
o
s
(
λ
)
c
o
s
(
φ
)
s
i
n
(
λ
)
s
i
n
(
φ
)
]
\begin{equation} \textbf{n}=\left [ \begin{matrix} cos(\varphi)cos(\lambda)\\cos(\varphi)sin(\lambda)\\sin(\varphi)\\\end{matrix} \right ] \end{equation}
n=
?cos(φ)cos(λ)cos(φ)sin(λ)sin(φ)?
???
在椭球面系列—基本性质一文中我们知道,若已知椭球面上点
P
′
P'
P′的法线向量
n
\textbf{n}
n,则可求解
k
k
k:
k
2
=
n
T
C
?
1
n
\begin{equation} k^2=\textbf{n}^T\textbf{C}^{-1}\textbf{n} \end{equation}
k2=nTC?1n??
从而可以直接计算得到椭球面上点
P
′
P'
P′的笛卡尔坐标
(
x
′
,
y
′
,
z
′
)
T
(x',y',z')^T
(x′,y′,z′)T:
P
′
=
(
x
′
,
y
′
,
z
′
)
T
=
1
k
C
?
1
n
\begin{equation} P'=(x',y',z')^T=\frac1k\textbf{C}^{-1}\textbf{n} \end{equation}
P′=(x′,y′,z′)T=k1?C?1n??
得到点
P
′
P'
P′后,则由法向量
n
\textbf{n}
n和高度
h
h
h可直接得到点
P
P
P的笛卡尔坐标
(
x
,
y
,
z
)
T
(x,y,z)^T
(x,y,z)T。
P
=
[
x
y
z
]
=
[
x
′
y
′
z
′
]
+
n
∣
n
∣
h
\begin{equation} P= \left [ \begin{matrix}x\\y\\z\\\end{matrix} \right ] =\left [ \begin{matrix}x'\\y'\\z'\\\end{matrix} \right ] +\frac {\textbf{n}}{|\textbf{n}|}h \end{equation}
P=
?xyz?
?=
?x′y′z′?
?+∣n∣n?h??
笛卡尔坐标向大地坐标的转换为隐式转换,需要迭代求解。
仍然见上图,
P
′
P'
P′点的法线方向(定义为
n
\textbf{n}
n)由其笛卡尔坐标
(
x
′
,
y
′
,
z
′
)
T
(x',y',z')^T
(x′,y′,z′)T表示(这里我们不知道大地坐标,所以不能像式(1)方式来表示)则有:
n
=
[
x
′
/
a
2
y
′
/
b
2
z
′
/
c
2
]
\begin{equation} \textbf{n}=\left [ \begin{matrix}x'/a^2\\y'/b^2\\z'/c^2\\\end{matrix} \right ] \end{equation}
n=
?x′/a2y′/b2z′/c2?
???
很明显,此法线
n
\textbf{n}
n为梯度向量的
1
/
2
1/2
1/2。
P
′
P'
P′点和
P
P
P点的关系可表示为(与式(4)形式相同):
[
x
y
z
]
=
[
x
′
y
′
z
′
]
+
t
[
x
′
/
a
2
y
′
/
b
2
z
′
/
c
2
]
\begin{equation} \left [ \begin{matrix}x\\y\\z\\\end{matrix} \right ] = \left [ \begin{matrix}x'\\y'\\z'\\\end{matrix} \right ] + t\left [ \begin{matrix}x'/a^2\\y'/b^2\\z'/c^2\\\end{matrix} \right ] \end{equation}
?xyz?
?=
?x′y′z′?
?+t
?x′/a2y′/b2z′/c2?
???
上式中,
t
t
t为法向量的系数,选取合适的
t
t
t,则可使得上式成立。
P
′
P'
P′点和
P
P
P点的关系为(与式(4)形式相同):
[
x
y
z
]
=
[
x
′
y
′
z
′
]
+
t
[
x
′
/
a
2
y
′
/
b
2
z
′
/
c
2
]
\begin{equation} \left [ \begin{matrix}x\\y\\z\\\end{matrix} \right ] = \left [ \begin{matrix}x'\\y'\\z'\\\end{matrix} \right ] + t\left [ \begin{matrix}x'/a^2\\y'/b^2\\z'/c^2\\\end{matrix} \right ] \end{equation}
?xyz?
?=
?x′y′z′?
?+t
?x′/a2y′/b2z′/c2?
???
将上式形式改变为:
[
x
′
y
′
z
′
]
=
[
x
/
(
1
+
t
/
a
2
)
y
/
(
1
+
t
/
b
2
)
z
/
(
1
+
t
/
c
2
)
]
\begin{equation} \left [ \begin{matrix}x'\\y'\\z'\\\end{matrix} \right ] =\left [ \begin{matrix}x/(1+t/a^2)\\y/(1+t/b^2)\\z/(1+t/c^2)\\\end{matrix} \right ] \end{equation}
?x′y′z′?
?=
?x/(1+t/a2)y/(1+t/b2)z/(1+t/c2)?
???
由于
P
′
P'
P′为椭球面上的点,因此满足椭球面方程:
x
′
2
a
2
+
y
′
2
b
2
+
z
′
2
c
2
=
1
\begin{equation} \frac{x'^2}{a^2} + \frac{y'^2}{b^2} + \frac{z'^2}{c^2} = 1 \end{equation}
a2x′2?+b2y′2?+c2z′2?=1??
将式(8)带入上式,并定义函数
f
(
t
)
f(t)
f(t):
f
(
t
)
=
x
2
a
2
(
1
+
t
/
a
2
)
2
+
y
2
b
2
(
1
+
t
/
b
2
)
2
+
z
2
c
2
(
1
+
t
/
c
2
)
2
?
1
\begin{equation} f(t)=\frac{x^2}{a^2(1+t/a^2)^2} + \frac{y^2}{b^2(1+t/b^2)^2} + \frac{z^2}{c^2(1+t/c^2)^2} - 1 \end{equation}
f(t)=a2(1+t/a2)2x2?+b2(1+t/b2)2y2?+c2(1+t/c2)2z2??1??
由于
P
P
P点坐标
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)已知,则变为求解方程
f
(
t
)
=
0
f(t)=0
f(t)=0的根。
函数
f
(
t
)
f(t)
f(t)为一元函数,且为隐式函数,因此求根一般采用牛顿迭代法(使用一阶导数
f
′
(
t
)
f'(t)
f′(t)),即:
f
(
t
)
=
f
(
t
0
)
+
f
′
(
t
0
)
.
Δ
t
=
0
\begin{equation} f(t)=f(t_0)+f'(t_0).\Delta t=0 \end{equation}
f(t)=f(t0?)+f′(t0?).Δt=0??
迭代求解时,每一步
t
t
t可由前一次数值给出:
t
n
+
1
=
t
n
?
f
(
t
n
)
/
f
′
(
t
n
)
\begin{equation} t_{n+1}=t_n-f(t_n)/f'(t_n) \end{equation}
tn+1?=tn??f(tn?)/f′(tn?)??
由式(10)可得一阶导数
f
′
(
t
)
f'(t)
f′(t):
f
′
(
t
)
=
?
2
x
2
a
4
(
1
+
t
/
a
2
)
3
?
2
y
2
b
4
(
1
+
t
/
b
2
)
3
?
2
z
2
c
4
(
1
+
t
/
c
2
)
3
\begin{equation} f'(t)=\frac{-2x^2}{a^4(1+t/a^2)^3} - \frac{2y^2}{b^4(1+t/b^2)^3} - \frac{2z^2}{c^4(1+t/c^2)^3} \end{equation}
f′(t)=a4(1+t/a2)3?2x2??b4(1+t/b2)32y2??c4(1+t/c2)32z2???
下面给出迭代参数 t t t的初值 t 0 t_0 t0?的求解。
由上图可知,
O
P
OP
OP与椭球面的交点
P
0
P_0
P0?与
P
′
P'
P′点很近,因此首先求解
P
0
P_0
P0?点的坐标
(
x
0
,
y
0
,
z
0
)
(x_0,y_0,z_0)
(x0?,y0?,z0?):
[
x
0
y
0
z
0
]
=
1
d
.
[
x
y
z
]
\begin{equation} \left [ \begin{matrix}x_0\\y_0\\z_0\\\end{matrix} \right ] = \frac 1d .\left [ \begin{matrix}x\\y\\z\\\end{matrix} \right ] \end{equation}
?x0?y0?z0??
?=d1?.
?xyz?
???
上式中
d
d
d可由
P
P
P点的坐标
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)求得:
x
2
a
2
+
y
2
b
2
+
z
2
c
2
=
d
2
\begin{equation} \frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} = d^2 \end{equation}
a2x2?+b2y2?+c2z2?=d2??
迭代开始时,将
P
0
P_0
P0?当作
P
′
P'
P′即可。则根据上图几何关系和式(7),有:
h
=
(
1
?
1
/
d
)
∣
P
∣
=
t
∣
n
∣
h=(1-1/d) |\textbf P|=t|\textbf{n}|
h=(1?1/d)∣P∣=t∣n∣
因此
t
0
t_0
t0?为:
t
=
(
1
?
1
/
d
)
∣
P
∣
/
∣
n
∣
\begin{equation} t=(1-1/d) |\textbf P|/|\textbf{n}| \end{equation}
t=(1?1/d)∣P∣/∣n∣??
上式中:
∣
P
∣
=
x
2
+
y
2
+
z
2
|\textbf P|=\sqrt{x^2+y^2+z^2}
∣P∣=x2+y2+z2?
∣
n
∣
=
x
0
2
/
a
4
+
y
0
2
/
b
4
+
z
0
2
/
c
4
|\textbf{n}|=\sqrt{x_0^2/a^4+y_0^2/b^4+z_0^2/c^4}
∣n∣=x02?/a4+y02?/b4+z02?/c4?
使用牛顿迭代法求得
t
t
t后,则带入式(8)可求得椭球面投影点于
P
′
P'
P′的坐标
(
x
′
,
y
′
,
z
′
)
T
(x',y',z')^T
(x′,y′,z′)T。
有了 P ′ P' P′点坐标,则椭球面法向量 n \textbf{n} n可由式(5)给出。
最终,大地坐标为:
{
λ
=
t
a
n
?
1
(
n
y
,
n
x
)
φ
=
s
i
n
?
1
(
n
z
/
∣
n
∣
)
h
=
t
/
∣
n
∣
\begin{equation} \begin{cases} \lambda=tan^{-1}(n_y,n_x) \\ \varphi=sin^{-1}(n_z/|\textbf{n}|) \\ h=t/|\textbf{n}| \end{cases} \end{equation}
?
?
??λ=tan?1(ny?,nx?)φ=sin?1(nz?/∣n∣)h=t/∣n∣???
注意,上式中的
∣
n
∣
|\textbf{n}|
∣n∣为
x
′
2
/
a
4
+
y
′
2
/
b
4
+
z
′
2
/
c
4
\sqrt{x'^2/a^4+y'^2/b^4+z'^2/c^4}
x′2/a4+y′2/b4+z′2/c4?。
参考:
[1]: 椭球面系列—基本性质
[2]: [学习内容:求一个点到椭球面的距离(下)