緯度・経度の差分から移動距離を計算する方法(3)

こんにちは、Takum!です。
 これまで、1.完全球体で近似する方法2.回転楕円体できっちり解く方法という形で緯度経度を距離に変換してきました。今回は、2ほどの計算量は無く、もう少し簡単な計算で求める方法について述べていきます。



3.回転楕円体から球体への近似

今回の近似は、今までの組み合わせです。移動差分が地球サイズに比べて十分に小さい場合、その位置(緯度)における地球中心との距離を持つ球体上での変位としてとらえるものです。イメージとしては、下記のようになります。


 緯度$\theta$における地球中心との距離$R$は、前回の(4)式


$${x^2}+{y^2}+\frac{z^2}{(1-f)^2}=a^2\tag{4}$$
$$x=R\cos\theta$$
$$y=0$$
$$z=R\sin\theta$$
を代入することで、
$$R=\frac{a(1-f)}{\sqrt{\sin^2\theta+(1-f)^2\cos^2\theta}}$$
と求めることができます。その半径$R$の球体上での、緯度方向$\gamma$、経度方向$\delta$の移動分として近似します。

 緯度方向への移動分は
$$L_{lat}=2\pi R\cdot\frac{\gamma}{360}=\frac{2\pi a(1-f)\cdot\gamma}{360\sqrt{\sin^2\theta+(1-f)^2\cos\theta}}\tag{14}$$
となり、経度方向への移動分は
$$L_{lng}=2\pi R\cos\theta\cdot\frac{\delta}{360}=\frac{2\pi a(1-f)\cos\theta\cdot\delta}{360\sqrt{\sin^2\theta+(1-f)^2\cos^2\theta}}\tag{15}$$
これらより、三平方の定理により
$$L=\sqrt{L_{lat}^2+L_{lng}^2}=\frac{2\pi a(1-f)\sqrt{\gamma^2 + \cos^2\theta\cdot\delta^2}}{360\sqrt{\sin^2\theta+(1-f)^2\cos^2\theta}}\tag{16}$$
と求められました。
 ※あまり計算量減ってないかもしれませんが…

 この式(16)を関数化すると、下記のようになりました。


def calculateHubeni(latitude, lat_delta, lng_delta):
    a = 6378137 # 赤道面半径
    f = 1 / 298.257222101 # 扁平率
    theta = latitude / 180 * np.pi
    return np.pi*a*(1-f)*np.sqrt(lat_delta**2+lng_delta**2*np.cos(theta)**2)/(180*np.sqrt(np.sin(theta)**2+(1-f)**2*np.cos(theta)**2))

コメント

このブログの人気の投稿

MS Azure Information Protection を入れたら右クリックの「分類して保護する」がうざい

Zwiftがいきなり楽になってしまった件(顛末)