本文へ移動

Wakusei Planets惑星

太陽・惑星・衛星を、線画、陰影つきの絵、表面の地図で描きます。実際の大きさ・傾き・自転つきで、任意の日時の衛星の位置も分かります。

「惑星」(わくせい) は、太陽のまわりを回る大きな星のことです。 名前について(英語)

目次

解説

精度

惑星と衛星の位置が JPL Horizons からどれだけ離れているかを天体ごとに示し、それぞれの作り方を説明します。

位置は NASA の JPL Horizons と比べて確かめています。Horizons は天体の位置の基準になるサービスです。3つのテストが、すべての惑星、月、衛星を Horizons と比べ、下の限度より離れた天体が一つでもあると失敗します。test/accuracy.test.ts は test/data/horizons.json のいくつかの基準日で、test/accuracy-dense.test.ts は1800年から2200年にちらばった60の日付 (test/data/horizons-dense.json、間隔は2437日で、惑星の公転周期に重ならないようにしています) で、test/accuracy-fine.test.ts はより細かい惑星の級数で確かめます。表の数字は、それらの日付のうち一番悪かった値です。距離ではなく向きの違いで、惑星は太陽から見た角度、衛星は惑星から見た角度です。

絵として見るときは、衛星の軌道上の 1度は、画面で見る衛星の円盤の幅くらいです。1分角は、1ピクセルの何分の一かです。

惑星

水星から海王星は、VSOP87B の級数 (Bretagnon と Francou、IMCCE) から作り、地球時で計算します。地球時は、この理論が書かれている時刻系で、時計の UTC に閏秒と 32.184 秒を足したものです。1972年より前は、UTC から地球時への換算に、Espenak と Meeus (NASA) の式の ΔT を使い、1972年からは正確な値を使います。VSOP87 にない冥王星は、Horizons に合わせた20区間の表 (1800年から2200年用) です。この年の範囲の外では、JPL の近似ケプラー要素で答えます。

級数の切り方は2つあり、ページは必要な精度の分だけサイズを払います。

  • ふつうの切り方: 35,080 項のうち 995 項 (8つの惑星の全部で gzip 13.8 kB、これまでと同じ)。コードを変えなくても、誰でもこちらが使われます。
  • tables/vsop (任意): 2,581 項 (gzip で 32 kB。惑星エンジン全体と同じ大きさになるので、tables には入れていません)。import すると、heliocentric がより細かい級数を使うようになります。
import { heliocentric } from "@johnmorrisdotca/wakusei-planets";
import "@johnmorrisdotca/wakusei-planets/tables/vsop"; // より細かい VSOP87B 級数: gzip で約32 kB

const [x, y, z] = heliocentric("saturn", Date.UTC(2026, 10, 7, 12));
console.log(Math.hypot(x, y, z).toFixed(1));
9.4

VSOP87 は JPL の DE200 に合わせてあるので、今の Horizons と比べると、木星と海王星の平均経度が時間に比例してずれています (海王星は2000年で 1.2秒角、そのあと1000年ごとに 13秒角)。scripts/make-vsop-data.py が、テストに使わない80の日付でこの直線を Horizons に合わせ、2つの級数から2つの項として取り除いています。取り除かないと、60の日付で海王星は 5.7秒角、木星は 3.1秒角ずれていました。

天体JPL の近似要素 (以前)ふつう、1800〜2050年の5日ふつう、1800〜2200年の60日限度tables/vsop、60日限度astronomy-engine、60日
水星41″2.3″3.4″4.5″1.3″1.7″74.5″
金星14″0.5″2.0″2.6″0.4″0.6″24.0″
地球8″1.5″3.1″4″0.5″0.7″14.1″
火星58″1.4″4.8″6″0.7″0.95″11.4″
木星309″1.0″2.8″3.6″0.5″0.7″13.7″
土星545″3.7″4.4″5.7″0.8″1.1″19.8″
天王星79″3.8″3.9″5″1.9″2.5″17.3″
海王星45″1.6″2.6″3.4″0.7″0.95″19.9″
冥王星39″0.05″0.06″0.2″同じ同じ26.3″

1秒角は 1度の 3600分の1 です。最初の列は、このパッケージの出発点 (JPL の近似要素を、5つの基準日で測った値) です。2列目と3列目は、今のコードを5日と60日で測った値です。信用できるのは60日のほうで、5日は回帰テスト用の格子なので、その間の日にはもっと悪くなる惑星があります。最後の列は同じ60日での astronomy-engine (MIT) です (node scripts/compare/dense.mjs で表示できます)。一番悪い日は、400年の両端に近いものが多くなります。35,080 項すべてを使った VSOP87B でも、Horizons との差は天王星で 2.2秒角、海王星で (ずれを取り除かなければ) 3.7秒角残ります。細かい級数で天王星が一番ゆるいのは、切り方ではなく理論そのものの限界に近いからです。

級数は1750年から2250年の間で有効で、それより外ではゆっくり悪くなります。

準惑星

ケレス、オルクス、ハウメア、クワオアー、マケマケ、ゴンゴン、エリス、セドナは、冥王星と同じく Horizons に合わせた表です。チェビシェフの区間 (ケレスは1区間4年、動きの遅い天体は50〜200年) を、太陽系の重心から見た位置で作っています。遠い天体の動きは重心から見るとなめらかだからです。太陽から見ると、太陽自身が重心のまわりで12年かけて揺れる動き (木星の引力によるもので、約100万 km) が入ります。短い多項式ではこの揺れを追えないので、このパッケージは惑星の質量から揺れを計算して、あとで足し戻しています。表の年は、ケレスが1900年から2100年、ほかは1800年から2200年です。この範囲の外では、ある日の瞬間の軌道要素で答えます。2026年6月の前後数年は合います。フィットの格子の上にない、1900年から2099年の6つの日付で確かめました。

表は任意です。地球だけを描くページがこの分のサイズを払わなくてよいように、ウェブコンポーネントは表を読み込み、サーバーやスクリプトで heliocentric を呼ぶ場合は、必要な表を自分で import します。表がなければ、これまでの軌道要素で答えます。

import { heliocentric } from "@johnmorrisdotca/wakusei-planets";
import "@johnmorrisdotca/wakusei-planets/tables/dwarfs"; // オルクス、ハウメア、クワオアー、マケマケ、ゴンゴン、エリス、セドナ: gzip で約5 kB
import "@johnmorrisdotca/wakusei-planets/tables/ceres"; // ケレス、1900年から2100年: gzip で約14 kB

const [x, y, z] = heliocentric("ceres", Date.UTC(2000, 0, 1));
console.log(Math.hypot(x, y, z).toFixed(2));
2.55

@johnmorrisdotca/wakusei-planets/tables は両方を読み込みます。

天体測った最悪値守る上限年
ケレス0.16″0.3″1900〜2100
オルクス0.04″0.1″1800〜2200
ハウメア0.03″0.1″1800〜2200
クワオアー0.08″0.15″1800〜2200
マケマケ0.08″0.15″1800〜2200
ゴンゴン0.01″ 未満0.1″1800〜2200
エリス0.02″0.1″1800〜2200
セドナ0.01″ 未満0.1″1800〜2200

これまで準惑星は、2026年の近くでしか合わない単純な楕円でした。ケレスは2000年で2°、1900年で9°ずれ、ほかも数分角ずれていました。

月と衛星

月は月理論 ELP2000-82B (Chapront-Touzé と Chapront、IMCCE) を大きい540項に短くしたもので、惑星と同じく地球時で計算します。

木星と土星の衛星は、発表された理論に従います。任意の入口として入れてあります (tables は両方を読み込みます。ウェブコンポーネントは、その惑星の衛星を描くときだけ、別のチャンクとして読み込むので、1つの惑星を見せるページは大きくなりません)。

  • イオ、エウロパ、ガニメデ、カリスト: L1.2 (Lainey、Duriez、Vienne 2006、IMCCE)。140項に短くし、ゆっくりした揺れにはチェビシェフ多項式を使います (tables/galilean、gzip で約5 kB)。1130年から2760年まで有効です。
  • ミマス、エンケラドゥス、テティス、ディオネ、レア、タイタン、イアペトゥス: TASS1.7 (Vienne と Duriez 1995、IMCCE)。316項に短くしています (tables/saturn-moons、gzip で約7 kB)。ヒペリオンはこのパッケージにありません。
import { system } from "@johnmorrisdotca/wakusei-planets";
import "@johnmorrisdotca/wakusei-planets/tables/saturn-moons"; // ミマスからイアペトゥスまで TASS1.7: gzip で約7 kB

const titan = system("saturn", Date.UTC(2026, 10, 7, 12)).moons.find((moon) => moon.id === "titan");
console.log(Math.round(titan?.distance ?? 0));
21

そのほかの衛星の軌道と、上の表を import する前の衛星の軌道は、1800年から2199年の Horizons の位置と速度に合わせています。軌道面を一つ決め、平均経度は一定の速さで進み、近点と昇交点は一定の速さで回る、という形です。一定の速さだけでは足りない衛星には、もう一つ項があります。軌道が縮んでいるフォボスには加速があり、たがいに引き合うミマスとテティスは、約70年かけて行ったり来たりします。以前は1950年から2050年だけに合わせていたので、フォボスは1800年に4°、アリエルは2194年に1.4°ずれていましたが、今は 0.41° と 0.22° です。天王星と火星の衛星は、合わせた軌道のままです。IMCCE の GUST86 と ESAPHO/ESADEI は、変えたファイルを配ってはいけないという注意書きがあるので使っていません。

天体理論以前、1900〜2100年の7日今、同じ7日今、1800〜2200年の60日守る上限 (60日)
月ELP2000-82B0.0005°0.0005°4.7″5.8″
フォボス合わせた軌道0.57°0.34°0.41°0.55°
ダイモス合わせた軌道0.32°0.33°0.39°0.55°
イオL1.20.08°0.056°0.11°0.15°
エウロパL1.20.09°0.022°0.037°0.05°
ガニメデL1.20.21°0.016°0.026°0.03°
カリストL1.20.07°0.006°0.014°0.02°
ミマスTASS1.71.07°0.74°1.68°2.1°
エンケラドゥスTASS1.70.42°0.23°0.57°0.72°
テティスTASS1.70.22°0.040°0.21°0.27°
ディオネTASS1.70.08°0.086°0.18°0.23°
レアTASS1.70.09°0.081°0.22°0.27°
タイタンTASS1.70.05°0.017°0.044°0.06°
イアペトゥスTASS1.70.23°0.016°0.032°0.04°
ミランダ合わせた軌道1.76°1.15°2.19°3°
アリエル合わせた軌道0.38°0.20°0.22°0.3°
ウンブリエル合わせた軌道0.14°0.084°0.20°0.28°
タイタニア合わせた軌道0.40°0.18°0.39°0.52°
オベロン合わせた軌道0.38°0.43°0.44°0.6°
トリトン合わせた軌道0.03°0.054°0.12°0.17°
ネレイド合わせた軌道6.05°2.5°4.6°6.3°
プロテウス合わせた軌道0.13°0.10°0.12°0.17°
カロン合わせた軌道0.02°0.02°0.02°0.06°
ニクス合わせた軌道1.93°1.55°1.98°2.6°
ヒドラ合わせた軌道1.54°1.57°1.63°2.1°

60の日付では、ガリレオ衛星は astronomy-engine より 6〜11倍近くなります (node scripts/compare/dense.mjs: イオ 411″ 対 2,626″、エウロパ 132″ 対 1,403″、ガニメデ 92″ 対 814″、カリスト 52″ 対 379″)。月は 4.7″ 対 207″ です。

  • 土星の衛星がこれ以上近くならない理由。 TASS1.7 は衛星の観測に合わせた理論で、土星の衛星の観測は約 0.1秒角、土星では 600 km の精度です。1日足らずで回る、軌道 185,000 km のミマスが 0.7° ずれるのは、そのためです。Horizons の暦は数値計算で、探査機 (カッシーニ) に合わせてあるので、両者はそのくらい違います。ディオネとレアは、1950年から2050年に合わせた以前の軌道が理論と同じくらい近かったので、変わっていません。
  • ネレイドが一番ゆるいのは、軌道がとても細長い (離心率 0.75) からです。一番近い所の近くでは、時刻の小さなずれが大きな角度になります。
  • ニクスとヒドラは、二つが回っている冥王星系の重心から測っています。冥王星の中心は重心から約 2,000 km 離れているので、冥王星の中心から見ると、最大で約 2.5° さらにずれることがあります。
  • ミランダとミマスは、ふつうの衛星の中では一番ゆるいものです。どちらも、合わせた軌道では表せない小さな揺れがあります。
  • 冥王星以外の準惑星の衛星 (エリス、ハウメア、マケマケ、オルクス、クワオアなど) は、src/data/dwarf.ts に書いた論文から作っていて、この確認には入っていません。

何に使えるか

惑星は数秒角の範囲で、衛星は軌道上で 1度か 2度の範囲 (木星の4つ、土星のタイタンとイアペトゥスは数百分の1度) で正しい場所に描かれます。絵、図、空の話には十分です。望遠鏡を向けたり飛行計画を立てたりする暦としては使えません。その場合は JPL Horizons そのものを使ってください。

自分で確かめる

pnpm test で精度のテストが動きます。python3 -I scripts/fetch-horizons-reference.py と python3 -I scripts/fetch-horizons-dense.py は Horizons の位置をもう一度取り直して test/data/horizons.json と test/data/horizons-dense.json に書きます。python3 -I scripts/make-vsop-data.py (と fine)、make-lunar-data.py、make-galilean-data.py、make-tass17-data.py、make-moon-data.py は、src/data の級数と軌道を書きます。どれもネットワークが必要で、テストの中では動きません。

<!-- comparison:start -->

他のパッケージとの比較

同じ日時を各パッケージに渡し、JPL Horizons との方向のずれを測定しました。以下はこの少数の日付での一致度であり、全期間での保証でも、観測そのものに対する精度の証明でもありません。小さい値ほど良い結果です。未対応・未測定は「—」で、ゼロ誤差という意味ではありません。

測定した wakusei は package.json 上の版 0.21.0、ソースのリビジョン a126c5e(src/ を最後に変更したコミット)です。同じ版番号でも src/ が違う後のリリースは対象外です。

共有できる 1950–2050 年のサンプル

全期間の最大値だけでは、対応期間外の呼び出しや暦の問題が順位を支配します。まず 1950 年以降、2050-01-01T12:00:00Z までの共通サンプルを示します。天体によって日付とサンプル数は異なります。planet は3日、dwarf は4日、moon は5日、horizon は6日です。

天体wakusei(秒角)上限astronomy-enginesolarsystemsuncalc
mercury2.3233.50010.36936.760—
venus0.5381.0006.57911.172—
earth1.4642.2001.14910.375—
mars1.4142.2002.75055.795—
jupiter1.0391.6006.42661.115—
saturn3.7305.6009.94175.064—
uranus3.8395.80012.50374.782—
neptune1.6432.50014.93444.883—
pluto0.0370.3004.86952.455—
ceres0.1590.300—2665.961†—
eris0.0100.100—129.397†—
moon0.6512.88010.497165.958—
io129.160288.00096.969——
europa79.052108.00097.804——
ganymede56.42479.20086.120——
callisto19.97628.80061.012——
sun1.4642.2001.14910.375—
sun (horizon)3.9256.0004.502—30.927
moon (horizon)4.8398.00010.560—34.195

Astronomy Engine が良い場合もあります。 この部分集合では地球・地心の太陽とイオで最大誤差が小さくなりました。全期間で勝つのは地球と地心の太陽だけで、差は0.05秒角未満です。wakusei は地球以外の8行(惑星と冥王星)、地球の月、エウロパ・ガニメデ・カリスト(全期間ではイオも)で小さい最大誤差を示しますが、個々の日付で常に勝つわけではありません。サイズでも勝者ではありません。

幾何学的位置:全ての参照日

単位はすべて秒角です。惑星は1800–2050年の5日、準惑星は1900–2099年の6日、衛星は1900–2100年の7日です。太陽は惑星と同じ5日に地心から測定します。ベクトルは地球のベクトルの符号を反転したものなので、その方向誤差は地球と同じで、独立した証拠ではありません。これらの期間はパッケージ共通の保証範囲ではありません。

天体wakusei(秒角)上限astronomy-enginesolarsystemsuncalc
mercury2.3233.50010.36937992.132—
venus0.5381.0006.57911670.162—
earth1.4642.2001.4187344.329—
mars1.4142.2002.7503563.521—
jupiter1.0391.6006.426612.646—
saturn3.7305.6009.941331.634—
uranus3.8395.80012.503225.545—
neptune1.6432.50015.91144.883—
pluto0.0450.30018.9302052.754—
ceres0.1590.300—3184.163†—
orcus0.0420.100———
haumea0.0270.100———
quaoar0.0810.150———
makemake0.0810.150———
gonggong0.0070.100———
eris0.0200.100—345.847†—
sedna0.0030.100———
moon1.8322.88078.28953144.774—
phobos1237.2891800.000———
deimos1190.1301620.000———
io201.808288.000901.772——
europa79.052108.000504.853——
ganymede56.79779.200339.079——
callisto19.97628.800129.411——
mimas2655.2813600.000———
enceladus832.3441152.000———
tethys144.408216.000———
dione308.090540.000———
rhea290.012540.000———
titan61.69590.000———
iapetus56.63790.000———
miranda4146.9935760.000———
ariel728.7351080.000———
umbriel302.326468.000———
titania641.514900.000———
oberon1541.9542160.000———
triton192.912360.000———
nereid9004.49912960.000———
proteus370.863540.000———
charon70.477180.000———
nix5586.8828640.000———
hydra5666.4668640.000———
sun1.4642.2001.4187344.329—

惑星・準惑星は太陽中心、衛星は親天体中心(Nix・Hydra は冥王星系の重心)、太陽は地球中心です。参照は J2000 平均黄道の幾何学的ベクトルです。木星から冥王星は惑星単体の中心ではなく、惑星系の重心が Horizons の対象です。公開 API が明示しない中心の違いも小さな誤差に寄与し得ます。距離の誤差は順位付けしません。wakusei は tables/vsop (より細かい惑星級数) を除く全ての任意テーブルを読み込みます。Astronomy Engine の HelioVector・GeoMoon・JupiterMoons は J2000 赤道から固定黄道傾斜角で回転します。Python solarsystem は precession=False の平均日付黄道座標を IAU 1976 歳差・平均黄道傾斜角で J2000 に変換します。緯度を捨てる経度差ではなく、正規化した3次元ベクトル間の角度を安定な atan2 式で求めます。

† Ceres・Eris の Python スコアは、元期付き軌道要素を固定 J2000 座標と解釈した値です。公開 API はこの2天体の座標系を明確に保証していないため、確定的な順位には使いません。日付黄道と解釈した場合の全期間最大値は ceres: 3066.112; eris: 4665.214 秒角です。両方の解釈を結果 JSON に保持しています。

Python パッケージの内部ユリウス日は、1800年のサンプルで2日、1900年1月のサンプルで1日早い値になります。入力日は修正していません。これは全期間表の大きな誤差の一因であり、通常期間の軌道精度だけを示す数値ではありません。Chiron は Python 側にありますが、共有できる参照・wakusei の実装がないため採点しません。

観測者から見た太陽・月:別の量

SunCalc の公開 API は視位置の地平座標を返すため、幾何学的な惑星表には混ぜません。既存の惑星・月の日付の和集合9日を使い、北緯35°・東経−105°・楕円体高0mで Horizons の視位置・大気差なしの方位角と高度を別途取得しました。各ライブラリーの大気差だけを数値的に取り除き、視差・光行差・光行時間・恒星時モデルの差は残して比較します。地平線より下も含み、天候や大気モデル自体の精度は測りません。

天体wakusei(秒角)上限astronomy-enginesolarsystemsuncalc
sun (horizon)3.9256.0004.502—1140.685
moon (horizon)4.8398.00077.952—13159.151

SunCalc 2.1.2 の TT−UT 多項式は約1900–2150年を対象とし、1800年は範囲外です。上の全期間値にはその外挿も含まれるため、通常期間の精度として宣伝してはいけません。1950–2050年の結果は最初の表にあります。この比較は方向だけです。出没時刻・食・位相の精度は証明しません。

サイズ・ライセンス・再現

パッケージ・版測定したコードgzip(バイト)ライセンス
wakusei 0.21.0メイン全出力+/suncalc 全出力+全ての任意テーブル(より細かい惑星級数 tables/vsop を除く)76,979MIT
astronomy-engine 2.1.19ESM エントリーの全出力43,971MIT
solarsystem 0.1.8Python 全モジュールのソース(下記参照)11,351MIT
suncalc 2.1.2ESM エントリーの全出力3,893BSD-2-Clause

JavaScript は esbuild 0.25.12 で全出力を ESM にバンドルして最小化し、gzip level 9 で圧縮します。wakusei の測定にはこの表で使う任意データと /suncalc を含み、メインの SVG・天体情報も含みます。Python はファイル名順の .py 全文を連結した gzip であり、JS バンドルとの単純な大小比較には使えません。どの値も言語ランタイム・インストール用メタデータ・画像を除きます。Python や Node の版によって gzip が少し変わることがあります。root の依存関係と src/ は変更していません。記録環境は Node v24.14.1(zlib 1.2.12)、Python 3.14.4(zlib 1.2.12)です。再現確認では最小化コードのバイト数とコードの指紋に一致を求めます。圧縮後のサイズ差は表示しますが、圧縮器の差を科学的な回帰とは判定しません。

同じ UTC インスタントを渡します。wakusei は理論を TT で実行し、Astronomy Engine は自身の Delta-T モデル、SunCalc は自身の TT−UT 多項式を使います。Python solarsystem は UT の日数をそのまま理論に使います。歴史的な Horizons の UT は近代的な UTC と同一ではなく、UT1・地球姿勢・将来の Delta-T の扱いも誤差に含まれます。入力時刻を調整して相手の結果を良くすることはしていません。同じ UTC 入力でも、内部の TT の仮定が一致するとは限りません。

リポジトリーのルートから次の順に実行します(Node 24以上、Python 3.12以上)。初回のインストールだけネットワークが必要です。通常の比較は保存した参照を使うためオフラインで実行できます。

pnpm install --frozen-lockfile
pnpm --dir scripts/compare install --frozen-lockfile --ignore-scripts
python3 -m venv scripts/compare/.venv
scripts/compare/.venv/bin/python -m pip install --require-hashes --only-binary=:all: --no-deps -r scripts/compare/requirements.txt
node scripts/compare/run.mjs
node scripts/compare/run.mjs --check
pnpm check
pnpm docs:check

Windows の仮想環境は Scripts/python.exe を使います。COMPARE_PYTHON で Python の実行ファイルを明示できます。run.mjs は results.json とこの英日セクションを生成します。--check は生成済みの値と文書が一致するか確認します。test/comparison.test.ts は第三者のインストールなしで、同じ参照日の wakusei の値が公開上限を超えないことを検査します。上限は自動で緩めません。

参照ベクトル・APIパラメーター・全ての日付ごとの誤差とワースト日付は scripts/compare/ にあります。新しい地平座標の参照を取得する場合だけ python3 -I scripts/compare/fetch-observer.py を実行します。浮動小数点の丸めによるゼロを避けるため、極小の角度にも acos を使いません。Horizons ベクトルは0.1km単位に丸められています。適合テーブルは同じ Horizons を元に作ったものなので、この表はその参照への一致度を示します。全期間の精度、未知の日付での精度、パッケージ全体の優劣はこの少数の点だけでは証明できません。

出典:Astronomy Engine API、solarsystem、SunCalc、Schlyter の日付座標系・暦の範囲、Horizons の定義。

実行していないもの:README の主張だけ

Caelis Engine は AGPL-3.0 で、VSOP87B と ELP/MPP02-LLR を使うと説明しています。Pyswisseph は AGPL-3.0 で、JPL DE431 に基づく高精度エフェメリスと説明しています。ephemeris は Moshier 系の実装と説明し、元の README は GPL-2 を明記しています。これらは2026-11-07に確認した公開READMEの主張で、今回の測定値ではありません。どれもインストール・実行していません。各 README にこの表と同じ条件の数値上限はないため、誤差の数値を作って補うことはしません。

<!-- comparison:end -->

ソースを見るGitHub で編集@johnmorrisdotca/wakusei-planets 0.24.0 のソースから作成しました。

この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。