人工衛星の軌道を計算した後,緯度・経度・高度に変換したいとき,ざっくりでよければ地球を球体と仮定して適当にarctanとかを使って求めることはできる.ただ,もう少しきちんと求める場合には,地球を回転楕円体として考えるべきで,この場合の変換はそれほど簡単ではない.
ECEF(Earth Centered Earth Fixed)座標からgeodetic(測地)座標への効率的な変換方法の開発は,多くの研究者の興味を集めてきたトピックで,何十年も前から最近まで多くの論文が発表されている.
ECEF座標とgeodetic座標の関係
まず地球表面上の点r s i t e \boldsymbol{r}_\mathrm{site} r site を式で表すことを考えよう.地球はおおよそ回転楕円体Spheroid(楕円体Ellipsoidのうち1軸に関しては軸対称なもの)で,地軸回りで対称,南北方向に少し押しつぶしたような形をしているので,以下のように表すことができる.ここでϕ r d \phi_\mathrm{rd} ϕ rd はreduced latitudeと呼ばれるもので,geodetic latitude ϕ g c \phi_\mathrm{gc} ϕ gc ではないことに注意しよう.
r s i t e = [ R ⊕ cos ϕ r d cos λ R ⊕ cos ϕ r d sin λ b ⊕ sin ϕ r d ] \begin{gather}
\boldsymbol{r}_\mathrm{site} = \left[ \begin{array}{c}
R_\oplus \cos\phi_\mathrm{rd} \cos\lambda \\
R_\oplus \cos\phi_\mathrm{rd} \sin\lambda \\
b_\oplus \sin\phi_\mathrm{rd} \end{array} \right]
\end{gather} r site = ⎣ ⎡ R ⊕ cos ϕ rd cos λ R ⊕ cos ϕ rd sin λ b ⊕ sin ϕ rd ⎦ ⎤
一方で,geodetic latitude ϕ g c \phi_\mathrm{gc} ϕ gc を使って表すこともできるはずで,r s i t e r_\mathrm{site} r site は何かしらの緯度の関数になる.
r s i t e = [ r s i t e cos ϕ g c cos λ r s i t e cos ϕ g c sin λ r s i t e sin ϕ g c ] \begin{gather}
\boldsymbol{r}_\mathrm{site} = \left[ \begin{array}{c}
r_\mathrm{site} \cos\phi_\mathrm{gc} \cos\lambda \\
r_\mathrm{site} \cos\phi_\mathrm{gc} \sin\lambda \\
r_\mathrm{site} \sin\phi_\mathrm{gc} \end{array} \right]
\end{gather} r site = ⎣ ⎡ r site cos ϕ gc cos λ r site cos ϕ gc sin λ r site sin ϕ gc ⎦ ⎤
これらの式を見比べると,以下の関係が得られる.
tan ϕ g c = b ⊕ R ⊕ tan ϕ r d \begin{gather}
\tan \phi_\mathrm{gc} = \frac{b_\oplus}{R_\oplus} \tan \phi_\mathrm{rd}
\end{gather} tan ϕ gc = R ⊕ b ⊕ tan ϕ rd
次に,ϕ r d \phi_\mathrm{rd} ϕ rd とϕ g d \phi_\mathrm{gd} ϕ gd の関係を導く.
r s i t e \boldsymbol{r}_\mathrm{site} r site での接面の方向は,ϕ r d \phi_\mathrm{rd} ϕ rd とλ \lambda λ について微分してやると分かる.
d d ϕ r d r s i t e = [ − R ⊕ sin ϕ r d cos λ − R ⊕ sin ϕ r d sin λ b ⊕ cos ϕ r d ] , d d λ r s i t e = [ − R ⊕ cos ϕ r d sin λ + R ⊕ cos ϕ r d cos λ 0 ] . \begin{gather}
\frac{d}{d\phi_\mathrm{rd}} \boldsymbol{r}_\mathrm{site} = \left[ \begin{array}{c}
-R_\oplus \sin\phi_\mathrm{rd} \cos\lambda \\
-R_\oplus \sin\phi_\mathrm{rd} \sin\lambda \\
b_\oplus \cos\phi_\mathrm{rd} \end{array} \right], \\
\frac{d}{d\lambda} \boldsymbol{r}_\mathrm{site} =
\left[ \begin{array}{c}
-R_\oplus\cos\phi_\mathrm{rd} \sin\lambda \\
+R_\oplus\cos\phi_\mathrm{rd} \cos\lambda \\
0
\end{array} \right]. \\
\end{gather} d ϕ rd d r site = ⎣ ⎡ − R ⊕ sin ϕ rd cos λ − R ⊕ sin ϕ rd sin λ b ⊕ cos ϕ rd ⎦ ⎤ , d λ d r site = ⎣ ⎡ − R ⊕ cos ϕ rd sin λ + R ⊕ cos ϕ rd cos λ 0 ⎦ ⎤ .
で,これをよく見ると,法線方向が分かる.
n = [ b ⊕ cos ϕ r d cos λ b ⊕ cos ϕ r d sin λ R ⊕ sin ϕ r d ] \begin{gather}
\boldsymbol{n} = \left[ \begin{array}{c}
b_\oplus \cos\phi_\mathrm{rd} \cos\lambda \\
b_\oplus \cos\phi_\mathrm{rd} \sin\lambda \\
R_\oplus \sin\phi_\mathrm{rd}
\end{array} \right]
\end{gather} n = ⎣ ⎡ b ⊕ cos ϕ rd cos λ b ⊕ cos ϕ rd sin λ R ⊕ sin ϕ rd ⎦ ⎤
法線方向が分かると,reduced latitudeとgeodetic latitudeの関係を求めることができる.
tan ϕ g d = R ⊕ b ⊕ tan ϕ r d \begin{gather}
\tan \phi_\mathrm{gd} = \frac{R_\oplus}{b_\oplus} \tan \phi_\mathrm{rd}
\end{gather} tan ϕ gd = b ⊕ R ⊕ tan ϕ rd
これより,geocentric latitudeとgeodetic latitudeの関係は以下のようになる.
tan ϕ g c = b ⊕ 2 R ⊕ 2 tan ϕ g d \begin{gather}
\tan \phi_\mathrm{gc} = \frac{b_\oplus^2}{R_\oplus^2} \tan \phi_\mathrm{gd}
\end{gather} tan ϕ gc = R ⊕ 2 b ⊕ 2 tan ϕ gd
これで,地表面でgeocentricなパラメタからgeodeticへ変換することができた.
ただ,今知りたいのは,軌道上の点( x , y , z ) (x,y,z) ( x , y , z ) からgeodeticなパラメタを求めることで,これにはもうひと手間いる.目標は( x , y , z ) (x,y,z) ( x , y , z ) をgeodeticなパラメタのみで表して,逆に解くことである.
そのためにradius of curvature in the prime vertical C ⊕ C_\oplus C ⊕ をϕ g d \phi_\mathrm{gd} ϕ gd を用いて表す.
r δ = r s i t e cos ϕ g c = R ⊕ cos ϕ r d = C ⊕ cos ϕ g d r k = r s i t e sin ϕ g c = R ⊕ 1 − e ⊕ 2 sin ϕ r d = S ⊕ sin ϕ g d \begin{gather}
r_\delta
= r_\mathrm{site} \cos \phi_\mathrm{gc}
= R_\oplus \cos \phi_\mathrm{rd}
= C_\oplus \cos \phi_\mathrm{gd} \\
r_\mathrm{k}
= r_\mathrm{site} \sin \phi_\mathrm{gc}
% = R_\oplus \frac{b_\oplus}{R_\oplus}\sin \phi_\mathrm{rd}
= R_\oplus \sqrt{1-e_\oplus^2}\sin \phi_\mathrm{rd}
= S_\oplus \sin \phi_\mathrm{gd}
\end{gather} r δ = r site cos ϕ gc = R ⊕ cos ϕ rd = C ⊕ cos ϕ gd r k = r site sin ϕ gc = R ⊕ 1 − e ⊕ 2 sin ϕ rd = S ⊕ sin ϕ gd
これよりC ⊕ = R ⊕ cos ϕ r d cos ϕ g d C_\oplus = R_\oplus \frac{\cos\phi_\mathrm{rd}}{\cos\phi_\mathrm{gd}} C ⊕ = R ⊕ c o s ϕ gd c o s ϕ rd なのだが,cos ϕ r d \cos\phi_\mathrm{rd} cos ϕ rd が邪魔なので,以下の関係を用いて整理する.
tan 2 ϕ g d = R ⊕ 2 b ⊕ 2 ( 1 cos 2 ϕ r d − 1 ) 1 cos 2 ϕ r d = b ⊕ 2 R ⊕ 2 tan 2 ϕ g d + 1 cos ϕ r d = 1 b ⊕ 2 R ⊕ 2 tan 2 ϕ g d + 1 , w h e r e − π 2 ≤ ϕ r d ≤ π 2 \begin{gather}
\tan^2\phi_\mathrm{gd} = \frac{R_\oplus^2}{b_\oplus^2} \left(\frac{1}{\cos^2\phi_\mathrm{rd}} - 1 \right) \\
\frac{1}{\cos^2\phi_\mathrm{rd}} = \frac{b_\oplus^2}{R_\oplus^2} \tan^2\phi_\mathrm{gd} + 1 \\
\cos\phi_\mathrm{rd} = \frac{1}{\sqrt{\frac{b_\oplus^2}{R_\oplus^2} \tan^2\phi_\mathrm{gd} + 1}}, ~~\mathrm{where} ~~ -\frac{\pi}{2} \le \phi_\mathrm{rd} \le \frac{\pi}{2}
\end{gather} tan 2 ϕ gd = b ⊕ 2 R ⊕ 2 ( cos 2 ϕ rd 1 − 1 ) cos 2 ϕ rd 1 = R ⊕ 2 b ⊕ 2 tan 2 ϕ gd + 1 cos ϕ rd = R ⊕ 2 b ⊕ 2 tan 2 ϕ gd + 1 1 , where − 2 π ≤ ϕ rd ≤ 2 π
すると,C ⊕ C_\oplus C ⊕ は以下のように表せる.
C ⊕ = R ⊕ cos ϕ g d 1 b ⊕ 2 R ⊕ 2 tan 2 ϕ g d + 1 = R ⊕ b ⊕ 2 R ⊕ 2 sin 2 ϕ g d + cos 2 ϕ g d = R ⊕ ( 1 − e ⊕ 2 ) sin 2 ϕ g d + cos 2 ϕ g d = R ⊕ 1 − e ⊕ 2 sin 2 ϕ g d \begin{gather}
C_\oplus = \frac{R_\oplus}{\cos\phi_\mathrm{gd}} \frac{1}{\sqrt{\frac{b_\oplus^2}{R_\oplus^2} \tan^2\phi_\mathrm{gd} + 1}}
= \frac{R_\oplus}{\sqrt{\frac{b_\oplus^2}{R_\oplus^2} \sin^2\phi_\mathrm{gd} + \cos^2\phi_\mathrm{gd}}} \\
= \frac{R_\oplus}{\sqrt{(1-e_\oplus^2) \sin^2\phi_\mathrm{gd} + \cos^2\phi_\mathrm{gd}}}
= \frac{R_\oplus}{\sqrt{1 - e_\oplus^2 \sin^2\phi_\mathrm{gd}}}
\end{gather} C ⊕ = cos ϕ gd R ⊕ R ⊕ 2 b ⊕ 2 tan 2 ϕ gd + 1 1 = R ⊕ 2 b ⊕ 2 sin 2 ϕ gd + cos 2 ϕ gd R ⊕ = ( 1 − e ⊕ 2 ) sin 2 ϕ gd + cos 2 ϕ gd R ⊕ = 1 − e ⊕ 2 sin 2 ϕ gd R ⊕
S ⊕ S_\oplus S ⊕ も同様に整理できて,以下のように表される.
S ⊕ = R ⊕ ( 1 − e ⊕ 2 ) 1 − e ⊕ 2 sin 2 ϕ g d \begin{gather}
S_\oplus = \frac{R_\oplus(1-e_\oplus^2)}{\sqrt{1 - e_\oplus^2 \sin^2 \phi_{\mathrm{gd}}}}
\end{gather} S ⊕ = 1 − e ⊕ 2 sin 2 ϕ gd R ⊕ ( 1 − e ⊕ 2 )
これより,( x , y , z ) (x,y,z) ( x , y , z ) 座標とgeodeticなパラメタの関係は以下のようになる.
ここまでの議論は主に参考文献 を参考にした.
[ x y z ] = [ ( C ⊕ + h e l l p ) cos ϕ g d cos λ ( C ⊕ + h e l l p ) cos ϕ g d sin λ ( S ⊕ + h e l l p ) sin ϕ g d ] \begin{gather}
\left[ \begin{array}{c} x \\ y \\ z \end{array} \right] =
\left[ \begin{array}{c}
(C_\oplus + h_\mathrm{ellp}) \cos\phi_\mathrm{gd} \cos\lambda \\
(C_\oplus + h_\mathrm{ellp}) \cos\phi_\mathrm{gd} \sin\lambda \\
(S_\oplus + h_\mathrm{ellp}) \sin\phi_\mathrm{gd}
\end{array} \right]
\end{gather} ⎣ ⎡ x y z ⎦ ⎤ = ⎣ ⎡ ( C ⊕ + h ellp ) cos ϕ gd cos λ ( C ⊕ + h ellp ) cos ϕ gd sin λ ( S ⊕ + h ellp ) sin ϕ gd ⎦ ⎤
数値計算による変換
ここで具体的な変換方法について考えてみよう.
基準となる楕円体としてWGS84を用いることとし,これは長半径(semi-major axis)R ⊕ R_\oplus R ⊕ および扁平率(flattening)f ⊕ f_\oplus f ⊕ で表される.
R ⊕ = 6378.137 k m , f ⊕ = 1 298.257223563 \begin{gather}
R_\oplus = 6378.137~\mathrm{km}, ~~~
f_\oplus = \frac{1}{298.257223563}
\end{gather} R ⊕ = 6378.137 km , f ⊕ = 298.257223563 1
その他のパラメタは次のように計算できる.
e ⊕ = 2 f ⊕ − f ⊕ 2 = 0.0818191908426215 , b ⊕ = R ⊕ 1 − e ⊕ 2 = R ⊕ ( 1 − f ⊕ ) = 6356.75231424518 k m , \begin{gather}
e_\oplus = \sqrt{2f_\oplus - f_\oplus^2} = 0.0818191908426215, \\
b_\oplus = R_\oplus \sqrt{1-e_\oplus^2} = R_\oplus(1-f_\oplus) = 6356.75231424518~\mathrm{km}, \\
\end{gather} e ⊕ = 2 f ⊕ − f ⊕ 2 = 0.0818191908426215 , b ⊕ = R ⊕ 1 − e ⊕ 2 = R ⊕ ( 1 − f ⊕ ) = 6356.75231424518 km ,
経度に関しては,特に問題なく次のように計算できる.
λ = arctan ( y , x ) \begin{gather}
\lambda = \arctan (y,x)
\end{gather} λ = arctan ( y , x )
緯度と高度に関してはexplicitに解けなさそうなので,数値的に求めることを考えてみる.
まず,仮にϕ g d \phi_\mathrm{gd} ϕ gd が分かっていた場合には,h e l l p h_\mathrm{ellp} h ellp は簡単に決定できる.
h e l l p = x 2 + y 2 cos ϕ g d − C ⊕ = x 2 + y 2 cos ϕ g d − R ⊕ 1 − e ⊕ 2 sin 2 ϕ g d h e l l p = z sin ϕ g d − S ⊕ = z sin ϕ g d − R ⊕ ( 1 − e ⊕ 2 ) 1 − e ⊕ 2 sin 2 ϕ g d \begin{gather}
h_\mathrm{ellp} = \frac{\sqrt{x^2+y^2}}{\cos\phi_\mathrm{gd}} - C_\oplus
= \frac{\sqrt{x^2+y^2}}{\cos\phi_\mathrm{gd}} - \frac{R_\oplus}{\sqrt{1 - e_\oplus^2 \sin^2\phi_\mathrm{gd}}} \\
h_\mathrm{ellp} = \frac{z}{\sin\phi_\mathrm{gd}} - S_\oplus
= \frac{z}{\sin\phi_\mathrm{gd}} - \frac{R_\oplus(1-e_\oplus^2)}{\sqrt{1 - e_\oplus^2 \sin^2 \phi_{\mathrm{gd}}}}
\end{gather} h ellp = cos ϕ gd x 2 + y 2 − C ⊕ = cos ϕ gd x 2 + y 2 − 1 − e ⊕ 2 sin 2 ϕ gd R ⊕ h ellp = sin ϕ gd z − S ⊕ = sin ϕ gd z − 1 − e ⊕ 2 sin 2 ϕ gd R ⊕ ( 1 − e ⊕ 2 )
これらが等しくなるように,以下の関係を満たすϕ g d \phi_\mathrm{gd} ϕ gd を数値的に求めればよい.
z − x 2 + y 2 tan ϕ g d + e ⊕ 2 R ⊕ sin ϕ g d 1 − e ⊕ 2 sin 2 ϕ g d = 0 \begin{gather}
z - \sqrt{x^2+y^2} \tan \phi_\mathrm{gd} + \frac{e_\oplus^2 R_\oplus \sin\phi_\mathrm{gd}}{\sqrt{1 - e_\oplus^2 \sin^2 \phi_{\mathrm{gd}}}} = 0
\end{gather} z − x 2 + y 2 tan ϕ gd + 1 − e ⊕ 2 sin 2 ϕ gd e ⊕ 2 R ⊕ sin ϕ gd = 0
ϕ 0 = arctan ( z x 2 + y 2 ) \begin{gather}
\phi_0 = \arctan \left( \frac{z}{\sqrt{x^2 + y^2}} \right)
\end{gather} ϕ 0 = arctan ( x 2 + y 2 z )
初期値はgeocentricなパラメタを用いることとして,
例えばPythonで以下のようなスクリプトを書くと,実際にgeodetic latitudeを求めることができる.
flattening = 1 / 298.257223563
semimajor = 6378.137
eccentricity = np. sqrt( 2 * flattening - flattening** 2 )
def geodetic_latitude ( x, y, z) :
""" calculate the geodetic latitude
# Args:
x(ndarray): x coordinate in ECEF, km
y(ndarray): y coordinate in ECEF, km
z(ndarray): z coordinate in ECEF, km
# Returns:
latitude(ndarray): geodetic latitude, rad
"""
params = ( x, y, z)
latitude = np. arctan( z/ np. sqrt( x** 2 + y** 2 ) )
return optimize. fsolve( latitude_equation, latitude, args= params)
def latitude_equation ( x: np. ndarray, * args) - > np. ndarray:
""" equation to be solved
# Args:
*args(tuple): (x, y, z)
# Returns:
latitude(ndarray): latitude
"""
return args[ 2 ] - np. sqrt( args[ 0 ] ** 2 + args[ 1 ] ** 2 ) * np. tan( x) + eccentricity** 2 * semimajor * np. sin( x) / np. sqrt( 1 - eccentricity** 2 * np. sin( x) ** 2 )
さて,これでECEF座標からgeodeticなパラメタへの変換の基本は理解できた.
ただこの方法で解を探すと,データ量が増えるにつれてかなりの計算量が必要になってしまうので,できればより効率的な方法が欲しくなってくる.
Vermeilleの解析的な変換手法
より効率的な変換手法で,論文としてもよく引用されているものに,Vermeilleの手法がある .この方法では,かなりアクロバットな変数の置き換えをすることで,解析的に解を求めることができる.
まず,次のような変数k k k を定義する.これは常にk > 0 k>0 k > 0 となる.
k = Q S P R = h e l l p + C ⊕ − e ⊕ 2 C ⊕ C ⊕ h e l l p = ( k + e ⊕ 2 − 1 ) C ⊕ = k C ⊕ − S ⊕ \begin{gather}
k = \frac{QS}{PR} = \frac{h_\mathrm{ellp} + C_\oplus - e_\oplus^2 C_\oplus}{C_\oplus} \\
h_\mathrm{ellp} = (k + e_\oplus^2 - 1) C_\oplus = k C_\oplus - S_\oplus
\end{gather} k = PR QS = C ⊕ h ellp + C ⊕ − e ⊕ 2 C ⊕ h ellp = ( k + e ⊕ 2 − 1 ) C ⊕ = k C ⊕ − S ⊕
このk k k を用いた関係式を作るために,C ⊕ C_\oplus C ⊕ をk k k で表す.
sin ϕ g d = z S ⊕ + h e l l p = z k C ⊕ \begin{align}
\sin\phi_\mathrm{gd} = \frac{z}{S_\oplus + h_\mathrm{ellp}}
= \frac{z}{k C_\oplus}
\end{align} sin ϕ gd = S ⊕ + h ellp z = k C ⊕ z
C ⊕ 2 = R ⊕ 2 ( 1 − e ⊕ 2 sin 2 ϕ g d ) C ⊕ 2 ( 1 − e ⊕ 2 sin 2 ϕ g d ) = R ⊕ 2 C ⊕ 2 = R ⊕ 2 + e ⊕ 2 z 2 k 2 \begin{gather}
C_\oplus^2 = \frac{R_\oplus^2}{(1 - e_\oplus^2 \sin^2\phi_\mathrm{gd})} \\
C_\oplus^2 (1 - e_\oplus^2 \sin^2\phi_\mathrm{gd}) = R_\oplus^2 \\
C_\oplus^2 = R_\oplus^2 + \frac{e_\oplus^2 z^2}{k^2}
\end{gather} C ⊕ 2 = ( 1 − e ⊕ 2 sin 2 ϕ gd ) R ⊕ 2 C ⊕ 2 ( 1 − e ⊕ 2 sin 2 ϕ gd ) = R ⊕ 2 C ⊕ 2 = R ⊕ 2 + k 2 e ⊕ 2 z 2
これらを用いて,x 2 + y 2 x^2+y^2 x 2 + y 2 を書き換えていく.
x 2 + y 2 = ( h e l l p + C ⊕ ) 2 cos 2 ϕ g d = ( k + e ⊕ ) 2 C ⊕ 2 ( 1 − sin 2 ϕ g d ) x 2 + y 2 ( k + e ⊕ 2 ) 2 − C ⊕ 2 ( 1 − z 2 k 2 C ⊕ 2 ) = 0 x 2 + y 2 ( k + e ⊕ 2 ) 2 − ( R ⊕ 2 + e ⊕ 2 z 2 k 2 − z 2 k 2 ) = 0 x 2 + y 2 ( k + e ⊕ 2 ) 2 + ( 1 − e ⊕ 2 ) z 2 k 2 = R ⊕ 2 \begin{gather}
x^2 + y^2
= (h_\mathrm{ellp} + C_\oplus)^2 \cos^2\phi_\mathrm{gd}
= (k + e_\oplus)^2 C_\oplus^2 (1 - \sin^2\phi_\mathrm{gd}) \\
\frac{x^2+y^2}{(k+e_\oplus^2)^2} - C_\oplus^2 \left( 1 - \frac{z^2}{k^2 C_\oplus^2} \right) = 0 \\
\frac{x^2+y^2}{(k+e_\oplus^2)^2} - \left( R_\oplus^2 + \frac{e_\oplus^2 z^2}{k^2} - \frac{z^2}{k^2} \right) = 0 \\
\frac{x^2+y^2}{(k+e_\oplus^2)^2} + \frac{(1 - e_\oplus^2) z^2}{k^2} = R_\oplus^2
\end{gather} x 2 + y 2 = ( h ellp + C ⊕ ) 2 cos 2 ϕ gd = ( k + e ⊕ ) 2 C ⊕ 2 ( 1 − sin 2 ϕ gd ) ( k + e ⊕ 2 ) 2 x 2 + y 2 − C ⊕ 2 ( 1 − k 2 C ⊕ 2 z 2 ) = 0 ( k + e ⊕ 2 ) 2 x 2 + y 2 − ( R ⊕ 2 + k 2 e ⊕ 2 z 2 − k 2 z 2 ) = 0 ( k + e ⊕ 2 ) 2 x 2 + y 2 + k 2 ( 1 − e ⊕ 2 ) z 2 = R ⊕ 2
ここで,p , q p, q p , q を以下のようにおく.
p = x 2 + y 2 R ⊕ 2 , q = 1 − e ⊕ 2 R ⊕ 2 z 2 \begin{align}
p = \frac{x^2 + y^2}{R_\oplus^2}, ~~ q = \frac{1-e_\oplus^2}{R_\oplus^2} z^2
\end{align} p = R ⊕ 2 x 2 + y 2 , q = R ⊕ 2 1 − e ⊕ 2 z 2
これらを用いて,k k k について4次の代数方程式を作る.
4次の代数方程式は一般に解くことが可能で,Ferrariの解法をはじめ様々な手法があるようだ.ただ,Vermeilleはそれらの手法をそのまま用いるのではなく,ところどころに式変形のアイデアを取り入れて,因数分解していっている.
k 4 + 2 e ⊕ 2 k 3 − ( p + q − e ⊕ 4 ) k 2 − 2 e ⊕ 2 q k − e ⊕ 4 q = 0 \begin{align}
k^4 + 2e_\oplus^2 k^3 - (p+q-e_\oplus^4) k^2 - 2e_\oplus^2 q k - e_\oplus^4 q = 0
\end{align} k 4 + 2 e ⊕ 2 k 3 − ( p + q − e ⊕ 4 ) k 2 − 2 e ⊕ 2 q k − e ⊕ 4 q = 0
ここで謎のパラメタu u u を導入する.u u u が任意の値の場合について,次の式が成り立つ.
( k 2 + e ⊕ 2 k − u ) 2 − [ ( p + q − 2 u ) k 2 + 2 e ⊕ 2 ( q − u ) k + u 2 + e ⊕ 4 q ] = 0 \begin{align}
(k^2 + e_\oplus^2 k - u)^2 - \left[ (p+q-2u) k^2 + 2e_\oplus^2(q-u)k + u^2 + e_\oplus^4 q \right] = 0
\end{align} ( k 2 + e ⊕ 2 k − u ) 2 − [ ( p + q − 2 u ) k 2 + 2 e ⊕ 2 ( q − u ) k + u 2 + e ⊕ 4 q ] = 0
カギ括弧の中身はk k k の2次方程式になっているが,
これについて判別式がゼロになるように要求すると,以下の関係式が得られる.
この式が満たされるときカギ括弧の中は( ⋯ ) 2 (\cdots)^2 ( ⋯ ) 2 の形で書けて,式全体が因数分解できることが分かる.形は少し異なるものの,謎パラメタを導入しつつ,判別式ゼロを要求することで,因数分解できる形にする,というのはFerrariの解法のアイデアを取り入れたものじゃないかと思われる.
e ⊕ 4 ( q − u ) 2 − ( p + q − 2 u ) ( u 2 + e ⊕ 4 q ) = 0 \begin{align}
e_\oplus^4 (q-u)^2 - (p+q-2u)(u^2 + e_\oplus^4 q) = 0
\end{align} e ⊕ 4 ( q − u ) 2 − ( p + q − 2 u ) ( u 2 + e ⊕ 4 q ) = 0
さらに,変数r , s r, s r , s を以下のように置く.
r = p + q − e ⊕ 4 6 , s = e ⊕ 4 p q 4 r 3 \begin{align}
r = \frac{p+q-e_\oplus^4}{6}, ~~ s = e_\oplus^4 \frac{pq}{4r^3}
\end{align} r = 6 p + q − e ⊕ 4 , s = e ⊕ 4 4 r 3 pq
これらを用いて,さらに全体を2 r 3 2r^3 2 r 3 で割ると以下の関係式が得られる.
u 3 r 3 − 3 u 2 r 2 − 2 s = 0 \begin{align}
\frac{u^3}{r^3} - 3\frac{u^2}{r^2} - 2s = 0
\end{align} r 3 u 3 − 3 r 2 u 2 − 2 s = 0
これは,u r \frac{u}{r} r u の3次方程式になっている.ここで以下のように置いて,t t t の式に書き換える.t > 0 t>0 t > 0 の範囲では,t = 1 t=1 t = 1 で1 + t + 1 t 1+t+\frac{1}{t} 1 + t + t 1 は極小値3をとり,(41)の左辺は− 2 s -2s − 2 s になる.t t t が動けば,u r \frac{u}{r} r u は増加し,0 < t < 1 0<t<1 0 < t < 1 の範囲でひとつ,t > 1 t>1 t > 1 の範囲でもひとつ解を持つはずだ.(ちなみに,相反方程式と呼ばれる形の代数方程式は,x + 1 x = t x+\frac{1}{x}=t x + x 1 = t という変形をすることで,うまく因数分解できるらしい.ちょっと形は違うがその辺からインスピレーションを受けているのかもしれない.)
u r = 1 + t + 1 t \begin{align}
\frac{u}{r} = 1 + t + \frac{1}{t}
\end{align} r u = 1 + t + t 1
t 6 − 2 ( 1 + s ) t 3 + 1 = 0 \begin{gather}
t^6 - 2(1+s)t^3 + 1 = 0
\end{gather} t 6 − 2 ( 1 + s ) t 3 + 1 = 0
実際,以下のような解を見つけることができる.
t 3 = 1 + s ± s ( 2 + s ) t = 1 + s ± s ( 2 + s ) 3 \begin{gather}
t^3 = 1 + s \pm \sqrt{s(2+s)} \\
t = \sqrt[3]{1 + s \pm \sqrt{s(2+s)}}
\end{gather} t 3 = 1 + s ± s ( 2 + s ) t = 3 1 + s ± s ( 2 + s )
で,いずれのt t t の解が得られてもu r \frac{u}{r} r u の値は同じなので,どっちか好きな方を選べばよい.とりあえず,ここではプラスの方を選ぶことにしよう.
これで,(38)のカギ括弧内を2乗の形で表せるようなu u u を求めることができた.
( k 2 + e ⊕ 2 k − u ) 2 − ( e ⊕ 2 q − u v k + v ) 2 = 0 ( k 2 + v − u + q v e ⊕ 2 k + v − u ) ( k 2 + v − u + q v e ⊕ 2 k − v − u ) = 0 w h e r e v = u 2 + e ⊕ 4 q \begin{gather}
(k^2 + e_\oplus^2 k - u)^2 - \left( e_\oplus^2 \frac{q-u}{v}k + v \right)^2 = 0 \\
\left( k^2 + \frac{v-u+q}{v}e_\oplus^2k + v - u\right)\left( k^2 + \frac{v-u+q}{v}e_\oplus^2k - v - u\right) = 0 \\
\mathrm{where}~~ v = \sqrt{u^2 + e_\oplus^4 q}
\end{gather} ( k 2 + e ⊕ 2 k − u ) 2 − ( e ⊕ 2 v q − u k + v ) 2 = 0 ( k 2 + v v − u + q e ⊕ 2 k + v − u ) ( k 2 + v v − u + q e ⊕ 2 k − v − u ) = 0 where v = u 2 + e ⊕ 4 q
(47)のひとつ目の括弧内は,v − u , v , q v-u, v, q v − u , v , q がいずれも正なので,k > 0 k>0 k > 0 に解は持たない.
なので,興味があるのはふたつ目の括弧内の方である.u + v u+v u + v が正なので,k > 0 k>0 k > 0 の解はひとつだけで,これは以下のように書ける.
k = u + v + w 2 − w , w h e r e w = e ⊕ 2 u + v − q 2 v \begin{gather}
k = \sqrt{u+v+w^2} - w, ~~ \mathrm{where} ~~ w = e_\oplus^2\frac{u+v-q}{2v}
\end{gather} k = u + v + w 2 − w , where w = e ⊕ 2 2 v u + v − q
これでk k k が一意に求まったので,緯度も高度も求めることができる.
D = k x 2 + y 2 k + e ⊕ 2 , C ⊕ = D 2 + z 2 k h e l l p = k + e ⊕ 2 − 1 k , ϕ g d = 2 arctan z D + D 2 + z 2 D = \frac{k\sqrt{x^2+y^2}}{k+e_\oplus^2}, ~~
C_\oplus = \frac{\sqrt{D^2+z^2}}{k} \\
h_\mathrm{ellp} = \frac{k+e_\oplus^2-1}{k}, ~~
\phi_\mathrm{gd} = 2 \arctan \frac{z}{D+\sqrt{D^2+z^2}} D = k + e ⊕ 2 k x 2 + y 2 , C ⊕ = k D 2 + z 2 h ellp = k k + e ⊕ 2 − 1 , ϕ gd = 2 arctan D + D 2 + z 2 z
元論文 には変換に最低限必要な式がリストアップされているので,
それらをもとに簡単なスクリプトを書くと,ECEF座標からgeodeticなパラメタへの変換を実行できる.
flattening = 1 / 298.257223563
semimajor = 6378.137
eccentricity = np. sqrt( 2 * flattening - flattening** 2 )
def geodetic_vermeille ( x, y, z) :
""" calculate the geodetic latitude and altitude based on
H. Vermeille, "Direct transformation from geocentric to geodetic coordinates", 2002, Journal of Geodesy, 76:451-454
# Args:
x(ndarray): x coordinate in ECEF, km
y(ndarray): y coordinate in ECEF, km
z(ndarray): z coordinate in ECEF, km
# Returns:
lat(ndarray): geodetic latitude, rad
lon(ndarray): geodetic longitude, rad
h(ndarray): geodetic altitude, km
"""
p = ( x** 2 + y** 2 ) / semimajor** 2
q = ( 1 - eccentricity** 2 ) * z** 2 / semimajor** 2
r = ( p + q - eccentricity** 4 ) / 6
s = eccentricity** 4 * p * q / ( 4 * r** 3 )
t = ( 1 + s + np. sqrt( s * ( 2 + s) ) ) ** ( 1 / 3 )
u = r * ( 1 + t + 1 / t)
v = np. sqrt( u** 2 + eccentricity** 4 * q)
w = eccentricity** 2 * ( u + v - q) / ( 2 * v)
k = np. sqrt( u + v + w** 2 ) - w
D = k * np. sqrt( x** 2 + y** 2 ) / ( k + eccentricity** 2 )
lat = 2 * np. arctan( z/ ( D+ np. sqrt( D** 2 + z** 2 ) ) )
lon = np. arctan2( y, x)
h = ( k + eccentricity** 2 - 1 ) / k * np. sqrt( D** 2 + z** 2 )
return lat, lon, h