手を振るソラくんゆるふわ宇宙・航空
考え中のソラくん

Skyfield入門|Pythonで人工衛星の位置と通過時刻を計算する

2026-10-21 ・ 実践

#Skyfield#Python#人工衛星#軌道計算#実践

Skyfield(スカイフィールド)とは、TLE(軌道要素)という数値の組から、人工衛星の位置や「いつ頭上を通るか」をPythonで計算できるオープンソースのライブラリです。NASA JPLの精密な天文暦計算を使っており、天文学者や衛星運用者も実際に使っています。この記事では、ISSを例に「今どこにいるか」と「自分の場所から見えるのはいつか」を実際に動くコードで計算します。

この記事で分かること

  • SkyfieldはTLE(軌道要素)とSGP4モデルで衛星位置を計算するPythonライブラリであること
  • EarthSatelliteとwgs84.subpointで衛星の緯度・経度・高度が求まること
  • find_eventsで観測地点から見た昇る・最高点・沈むの時刻(可視パス)が計算できること

対象読者:Pythonで実際の人工衛星の位置を計算してみたい方

執筆:ゆるふわ宇宙編集部 最終更新日:2026年10月21日

Skyfieldで何ができるのか

Skyfieldは、TLE形式の軌道データ(NORADが公開する2行の数値)を読み込み、SGP4という軌道伝播モデルで任意の時刻の衛星位置を計算します。できることは大きく2つです。

  • 衛星の地表直下点(緯度・経度・高度)を計算する
  • ある地点から見た衛星の方位・高度角・いつ昇っていつ沈むか(可視パス)を計算する

軌道速度や2体問題のシミュレーションは物理法則から軌道を自分で計算する記事でしたが、Skyfieldは実際に公開されている軌道データを使って、現実の衛星の位置をそのまま計算できるのが違いです。

TLEとは

TLE(Two-Line Element)

衛星の軌道を表す2行のテキスト形式のデータです。軌道傾斜角・離心率・平均運動(1日あたりの周回数)などの数値が詰め込まれており、NORAD(北米航空宇宙防衛司令部)が各衛星ごとに発行・更新しています。SGP4という計算モデルと組み合わせることで、任意の時刻の衛星位置を近似的に求められます。

TLEは観測と軌道決定を元に定期的に更新されるスナップショットです。発行日時(エポック)から離れるほど誤差が増えるため、実際に使うときはCelesTrakなどから、できるだけ新しいTLEを取得する必要があります。

準備

ターミナル
pip install skyfield

Skyfieldをインストールすると、依存ライブラリのnumpyと、SGP4計算を行うsgp4も一緒に入ります。

① 衛星の現在位置を計算する

まずは、ISSのTLEから地表直下点(緯度・経度・高度)を計算します。下のTLEはSkyfield公式ドキュメントが例として使っているISSの軌道データで、エポック(発行時刻)は2014年1月20日です。実際の最新位置を知りたいときは、このTLEをCelesTrakで配布されている最新のものに置き換えてください(TLEはエポックから1〜2週間離れると誤差が大きくなります)。

Python
from skyfield.api import load, EarthSatellite, wgs84
 
# Skyfield公式ドキュメントの例題TLE(エポック: 2014-01-20)
line1 = "1 25544U 98067A   14020.93268519  .00009878  00000-0  18200-4 0  5082"
line2 = "2 25544  51.6498 109.4756 0003572  55.9686 274.8005 15.49815350882671"
 
ts = load.timescale()
satellite = EarthSatellite(line1, line2, "ISS (ZARYA)", ts)
print(satellite)
 
# エポックに近い時刻を指定して位置を計算
t = ts.utc(2014, 1, 23, 11, 18, 7)
geocentric = satellite.at(t)
subpoint = wgs84.subpoint(geocentric)
 
print(f"緯度: {subpoint.latitude.degrees:.4f}")
print(f"経度: {subpoint.longitude.degrees:.4f}")
print(f"高度: {subpoint.elevation.km:.1f} km")

実行結果:

ISS (ZARYA) catalog #25544 epoch 2014-01-20 22:23:04 UTC
緯度: 50.2983
経度: -86.7158
高度: 421.0 km

EarthSatelliteにTLEの2行を渡すだけで衛星オブジェクトができ、wgs84.subpoint()で地表直下点の緯度・経度・高度が求まります。

② 自分の場所から見える時刻を計算する

次は、観測者の緯度経度を指定して、ISSが見える時間帯(昇る・一番高くなる・沈む)を計算します。

Python
from skyfield.api import load, EarthSatellite, wgs84
 
line1 = "1 25544U 98067A   14020.93268519  .00009878  00000-0  18200-4 0  5082"
line2 = "2 25544  51.6498 109.4756 0003572  55.9686 274.8005 15.49815350882671"
 
ts = load.timescale()
satellite = EarthSatellite(line1, line2, "ISS (ZARYA)", ts)
 
# 観測地点(東京)
observer = wgs84.latlon(35.6895, 139.6917, elevation_m=40)
 
t0 = ts.utc(2014, 1, 23)
t1 = ts.utc(2014, 1, 24)
times, events = satellite.find_events(observer, t0, t1, altitude_degrees=10.0)
 
names = ["昇る(高度10°)", "最も高くなる", "沈む(高度10°)"]
for ti, event in zip(times, events):
    print(ti.utc_strftime("%Y-%m-%d %H:%M:%S"), names[event])

実行結果(抜粋):

2014-01-23 14:05:25 昇る(高度10°)
2014-01-23 14:07:36 最も高くなる
2014-01-23 14:09:48 沈む(高度10°)
2014-01-23 15:40:57 昇る(高度10°)
2014-01-23 15:44:06 最も高くなる
2014-01-23 15:47:17 沈む(高度10°)

find_events()に観測地点と時間範囲、見える基準の高度角(ここでは10°以上)を渡すと、「昇る・最高点・沈む」の3つのタイミングがまとめて返ってきます。この日は1日に5回、ISSが東京上空の見える範囲を通過する計算結果になりました。

⚠️

TLEは『鮮度』が大事

SGP4による位置計算は、TLEのエポック(発行時刻)から離れるほど誤差が大きくなります。実際にISSや他の衛星を今日・今の位置で追いたいときは、上のサンプルTLEではなく、CelesTrakなどが配布しているその時点の最新TLEを使ってください。

まとめ

  • Skyfieldは、TLE(軌道要素)とSGP4モデルからPythonで衛星位置を計算するライブラリ
  • EarthSatellite(line1, line2)で衛星オブジェクトを作り、wgs84.subpoint()で地表直下点(緯度・経度・高度)が求まる
  • find_events()で、観測地点から見た昇る・最高点・沈むの時刻(可視パス)が計算できる
  • TLEはエポックから離れるほど誤差が増えるため、実際に使うときは最新のものを取得する

よくある質問

Q. SkyfieldとSGP4はどう違うのですか?

A. SGP4はTLEから衛星位置を計算する軌道伝播モデルそのもので、Skyfieldはそれを使いやすいPython APIとして包んだライブラリです。SkyfieldはSGP4の計算に加えて、観測地点からの見え方(方位・高度角・可視パス)や時刻変換もまとめて扱えます。

Q. 最新のTLEはどこで入手できますか?

A. CelesTrak(celestrak.org)がNORADの公開TLEを衛星カテゴリ別に配布しています。ISSのように国際的に運用されている衛星は、NASAの公式サイトでもTLEや位置情報が公開されています。

Q. 記事のコードが本番の最新位置と一致しないのはなぜですか?

A. 記事内のTLEはSkyfield公式ドキュメントの例題で、エポックが2014年1月20日と古いためです。今日の位置を計算したい場合は、同じコードのline1・line2を今日時点のTLEに置き換えてください。

📚 もう少し詳しく(背景)気になる人向け・タップで開く

SGP4は、地球の扁平さや大気抵抗の影響を簡易モデルとして組み込んだ軌道伝播アルゴリズムで、低軌道の衛星向けに1980年代から使われてきました1。TLEに含まれる平均運動(1日あたりの周回数)や軌道傾斜角などの数値は、地上のレーダー・光学観測から軌道を逆算した結果であり、観測と計算を繰り返して定期的に更新されます。

そのためTLEは「ある瞬間の軌道を要約したスナップショット」であり、エポックから離れるほど実際の位置とのずれが大きくなります2。軌道減衰の記事で扱った大気抵抗の影響も、このずれの一因です。実運用では、CelesTrakのように毎日TLEを更新・配布するサービスから、計算直前に最新データを取得するのが基本になります。

つぎに読むなら

人工衛星の基礎、軌道の種類、地表の軌跡を描くグラウンドトラックもあわせてどうぞ。

参考資料・出典

ゆるふわポータルでは、一次情報・公的資料にもとづき、専門用語をできるだけやさしく翻訳することを心がけています。内容に誤りや古い情報がある場合は、お問い合わせからご連絡ください。

執筆:ゆるふわ宇宙編集部 最終更新日:2026年10月21日

Footnotes

  1. SGP4(Simplified General Perturbations 4)は低軌道の衛星向け軌道伝播モデル。地球の扁平さ・大気抵抗などの摂動を簡易的に扱う。 ↩

  2. TLEのエポック(発行時刻)から離れるほど、SGP4による位置予測の誤差が大きくなる。目安として1〜2週間以内のTLEを使うことが推奨される。 ↩

この記事をシェア:𝕏 で共有LINEで送る

🔥 この分野の最新トレンドをチェック →

あわせて読みたい