Edited at

緯度経度、ECEF系、方位角・仰角などの座標変換に便利なプログラムPyMap3d

More than 1 year has passed since last update.


PyMap3d

PyMap3dはボストン大学のリモートセンシングが専門のMichael Hirsch教授が作った3次元の地理座標変換プログラムです。

Pyとついていますが、pythonだけではなく、Matlab・Fortranのプログラムも同じリポジトリで公開されています。

似たような座標変換のpyprojという便利なpythonモジュールもありますが、pyprojはC言語で書かれたPROJ4 libraryのPythonインターフェイスであるのに対して、pyMap3dは純粋にPythonで書かれています。Qiitaにpyprojの使い方の例もあります。

[GPS]pyprojを使用してGPSの緯度経度から距離、方位角、仰角を算出する

また、PyMap3dはMatlab Mapping Toolboxで使われている名前に合わせた関数名にしてあり、理解しやすく、Matlab Mapping Toolboxは1000ドルのソフトのに対して、FreeBSDライセンスで公開されています。

また、pyprojが地表面上の計算や換算に特化しているのに対して、PyMap3dは空中を移動する物体やリモートセンシング向けに特化しています。自分の利用の範囲では、pyprojでは緯度経度上の表面距離は算出できても空中の2地点間の距離の計算は簡単には出来ない(数行かけば出来ますが…)ので、地上局から飛翔中のロケットの方位角や仰角・直線距離を簡単に算出するには不便でした。

PyMap3dではそれぞれの座標系の変換を行えます。

* ECEF(地球中心・地球固定座標系)

* ENU(東、北、上)

* NED(北、東、下)

* ECI(地球中心慣性座標系)

* 測地系(緯度、経度、高度(世界測地系))

* 局所水平座標系(Az-El)

* 赤道座標


インストールと使い方

githubのPyMap3dリポジトリ にかかれている通りです。

pip install pymap3d

でインストールできます。

使い方の例として、東京にある皇居から富士山頂への方位角(真北から時計回りの角度)と仰角(水平面から上向きの角度)と直線距離を出力してみます。

import pymap3d as pm

lat_Fuji = 35.360556 # [deg]
lon_Fuji = 138.727778 # [deg]
alt_Fuji = 3819.9 # 楕円体高 [m]

lat_Kokyo = 35.685175 # [deg]
lon_Kokyo = 139.7528 # [deg]
alt_Kokyo = 50 # 楕円体高 [m]

x,y,z = pm.geodetic2ecef(lat_Kokyo, lon_Kokyo, alt_Kokyo)

az,el,range = pm.geodetic2aer(lat_Fuji, lon_Fuji, alt_Fuji, lat_Kokyo, lon_Kokyo, alt_Kokyo)

print("皇居 ECEF座標 : %d [m], %d [m], %d [m]" % (x, y, z))
print("皇居 to 富士山 : 方位角 = %.1f [deg], 仰角 = %.1f [deg], 直線距離 = %.1f [m]" % (az, el, range))


皇居 ECEF座標 : -3958664 [m], 3350924 [m], 3699904 [m]

皇居 to 富士山 : 方位角 = 249.1 [deg], 仰角 = 1.7 [deg], 直線距離 = 99805.4 [m]


と表示されます。緯度経度さえ指定していれば、1行で必要な値が取れます。


想定される利用先

下記の利用などが想定でき、それぞれ1行でかけるので便利です。


  • ドローン等から出力されるGPS情報から観測者からの距離、方位角、仰角を算出

  • ドローン等が持っているカメラの向きを決めるのに観測したい座標を指定して向ける方位角・仰角(俯角)を算出

  • ロケット等の飛翔体をアンテナで追いかけるのに必要な方位角・仰角を算出

  • 緯度経度からECEF座標やECI座標系への変換

  • 赤経・赤緯でまとめられている星表などから、観測地点でのその星の方位角・仰角の算出