XEphemとPyEphemで天体暦を扱う方法を解説

XEphem(エックス イーフェム)とは、太陽系の惑星や彗星、小惑星などの動きをシミュレーションできるツールです。

非常に歴史のあるソフトですが、PythonラッパーであるPyEphemを使えば、Jupyter Notebook上で手軽に天体の位置計算を行うことができます。

本記事の内容

  • XEphemの概要と天体暦の基礎
  • PyEphemのインストールと基本的な使い方
  • 惑星の位置計算と可視化
  • 人工衛星の軌道計算

天体暦(エフェメリス)とは

天体暦(Ephemeris)とは、天体の位置を時刻の関数として表したデータのことです。惑星や月、太陽の位置を予測するために、天体力学に基づいた数値計算が行われます。

天体の位置は通常、赤経(Right Ascension, RA)と赤緯(Declination, Dec)で表されます。

$$ \alpha = \text{RA} \in [0°, 360°), \quad \delta = \text{Dec} \in [-90°, 90°] $$

赤経は春分点を基準に天の赤道に沿って東向きに測った角度、赤緯は天の赤道からの角距離です。

高度・方位角座標

地上の観測者にとっては、高度(Altitude)と方位角(Azimuth)が直感的な座標系です。

$$ \text{Alt} \in [-90°, 90°], \quad \text{Az} \in [0°, 360°) $$

赤道座標から地平座標への変換には、観測地点の緯度 $\varphi$ と地方恒星時 $\theta_{\text{LST}}$ が必要です。時角 $H$ は、

$$ H = \theta_{\text{LST}} – \alpha $$

で求められ、高度 $a$ は次の式で計算されます。

$$ \sin a = \sin \varphi \sin \delta + \cos \varphi \cos \delta \cos H $$

PyEphemのインストールと基本

PyEphemはpipで簡単にインストールできます。

# pip install ephem

import ephem
import numpy as np
import matplotlib.pyplot as plt

# 観測地点の設定(東京)
observer = ephem.Observer()
observer.lat = '35.6762'    # 緯度 [度]
observer.lon = '139.6503'   # 経度 [度]
observer.elevation = 40     # 標高 [m]
observer.date = '2026/2/19 12:00:00'  # UTC

# 太陽の位置を計算
sun = ephem.Sun(observer)
print(f"太陽の赤経: {sun.ra}")
print(f"太陽の赤緯: {sun.dec}")
print(f"太陽の高度: {sun.alt}")
print(f"太陽の方位角: {sun.az}")

# 月の位置を計算
moon = ephem.Moon(observer)
print(f"\n月の赤経: {moon.ra}")
print(f"月の赤緯: {moon.dec}")
print(f"月の位相: {moon.phase:.1f}%")

惑星の位置を1年間追跡する

太陽系の惑星の赤経・赤緯を1年間にわたって計算し、天球上の動きを可視化してみましょう。

import ephem
import numpy as np
import matplotlib.pyplot as plt

# 観測地点(東京)
observer = ephem.Observer()
observer.lat = '35.6762'
observer.lon = '139.6503'

# 惑星オブジェクト
planets = {
    'Mercury': ephem.Mercury(),
    'Venus': ephem.Venus(),
    'Mars': ephem.Mars(),
    'Jupiter': ephem.Jupiter(),
    'Saturn': ephem.Saturn(),
}

# 1年間の軌跡を計算
start_date = ephem.Date('2026/1/1')
days = 365
dates = [start_date + i for i in range(days)]

fig, ax = plt.subplots(figsize=(12, 6))

for name, planet in planets.items():
    ra_list = []
    dec_list = []
    for d in dates:
        observer.date = d
        planet.compute(observer)
        ra_list.append(np.degrees(float(planet.ra)))
        dec_list.append(np.degrees(float(planet.dec)))
    ax.scatter(ra_list, dec_list, s=1, label=name)

ax.set_xlabel('Right Ascension [deg]')
ax.set_ylabel('Declination [deg]')
ax.set_title('Planetary Positions on Celestial Sphere (2026)')
ax.legend()
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 360)
ax.set_ylim(-30, 30)
plt.tight_layout()
plt.show()

火星は逆行(見かけ上、天球上で西向きに動く現象)を示すことがあり、ループ状の軌跡が観測できます。これは地球と火星の公転速度の差により生じる見かけの運動です。

人工衛星の軌道計算(TLE)

PyEphemでは、TLE(Two-Line Element)データを使って人工衛星の位置を計算できます。

import ephem
import numpy as np
import matplotlib.pyplot as plt

# ISS(国際宇宙ステーション)のTLE
# ※ TLEは定期的に更新が必要です
tle_name = "ISS (ZARYA)"
tle_line1 = "1 25544U 98067A   26049.50000000  .00016717  00000-0  10270-3 0  9003"
tle_line2 = "2 25544  51.6400 200.0000 0007000  90.0000 270.0000 15.50000000100001"

iss = ephem.readtle(tle_name, tle_line1, tle_line2)

# 東京からの観測
observer = ephem.Observer()
observer.lat = '35.6762'
observer.lon = '139.6503'
observer.elevation = 40

# 90分間(約1周回)の地上軌跡を計算
start = ephem.Date('2026/2/19 00:00:00')
minutes = 90
lats = []
lons = []
alts = []

for i in range(minutes * 10):
    observer.date = start + i / (24 * 60 * 10)
    iss.compute(observer)
    lats.append(np.degrees(float(iss.sublat)))
    lons.append(np.degrees(float(iss.sublong)))
    alts.append(float(iss.elevation) / 1000)  # km

# 地上軌跡の可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

axes[0].scatter(lons, lats, c=range(len(lats)), cmap='viridis', s=2)
axes[0].set_xlabel('Longitude [deg]')
axes[0].set_ylabel('Latitude [deg]')
axes[0].set_title('ISS Ground Track (90 min)')
axes[0].set_xlim(-180, 180)
axes[0].set_ylim(-90, 90)
axes[0].grid(True, alpha=0.3)

# 高度の時間変化
t = np.linspace(0, 90, len(alts))
axes[1].plot(t, alts)
axes[1].set_xlabel('Time [min]')
axes[1].set_ylabel('Altitude [km]')
axes[1].set_title('ISS Altitude')
axes[1].grid(True)

plt.tight_layout()
plt.show()

TLEデータはCelesTrakから最新のものを入手できます。TLEは時間とともに精度が低下するため、定期的な更新が必要です。

まとめ

本記事では、天体暦ツールXEphemとPyEphemについて解説しました。

  • 天体暦(エフェメリス)は天体の位置を時刻の関数として表したデータである
  • PyEphemを使えば、Pythonから手軽に惑星や人工衛星の位置を計算できる
  • 赤道座標(赤経・赤緯)と地平座標(高度・方位角)の変換が天体観測の基礎となる
  • TLEデータにより人工衛星の地上軌跡を計算・可視化できる

次のステップとして、以下の記事も参考にしてください。