PHPで惑星の位置を一覧表示する

(1/1)
天文学では、天球を球体(天球)とみなし、地図上の地点を示す経度・緯度を天球に投映し、赤経・赤緯という2つの角度を用いて天体の位置を表す。
今回は、「PHPでホロスコープを描く」で作った地球を基点にする惑星の位置(地心黄道座標)を計算するプログラムを利用し、ある期間の惑星の位置(赤経・赤緯)を一覧表示するPHPプログラムを作ることにする。
2006年(平成18年)、冥王星は矮惑星に降格になったが、ここでは冥王星の位置も一覧に含める。

目次

サンプル・プログラム:実行例

PHPで惑星の位置を一覧表示する

サンプル・プログラム

圧縮ファイルの内容
planetPosition.phpサンプル・プログラム本体
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pahooAstronomy.php天文計算クラス pahooAstronomy。
使い方は「PHPでホロスコープを描く」などを参照。include_path が通ったディレクトリに配置すること。
pahooCalendar.php暦計算クラス pahooCalendar。
暦計算クラスの使い方は「PHPで日出没・月出没・月齢・潮を計算」を参照。include_path が通ったディレクトリに配置すること。
planetPosition.php 更新履歴
バージョン 更新日 内容
1.0.0 2025/06/01 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加
pahooCalendar.php 更新履歴
バージョン 更新日 内容
4.6.2 2026/07/25 sun_time, moon_time 白夜の戻り値をコメント
4.6.1 2025/11/23 next_fullmoon: bug-fix
4.6.0 2025/10/08 getMidAutumnMoon() 追加
4.5.1 2025/05/31 deg2ddmm(), deg2hhmm() 不具合修正
4.5.0 2024/03/17 ヒジュラ暦メソッドを追加
pahooAstronomy.php 更新履歴
バージョン 更新日 内容
2.1.1 2025/11/29 PHP8.5対応:double→float コメント記載変更
2.1.0 2025/06/01 euatorialCoordinate() を追加
2.0.0 2025/05/31 全面改訂, 天象を計算できるようにした.
1.0 2019/03/23 初版

準備:定数

planetPosition.php

  58: // 初期値(START) =============================================================
  59: 
  60: // 指定できる西暦年の範囲
  61: define('MIN_YEAR', 1901);
  62: define('MAX_YEAR', 2099);
  63: 
  64: // 表示言語(jp:日本語, en:英語, en3:英語略記)
  65: define('LANGUAGE', 'jp');
  66: 
  67: // 世界時からの時差(日本標準時)
  68: define('UTCDIFF', +9.0);
  69: 
  70: // 計算時刻(時)
  71: define('HOUR', 21);
  72: 
  73: // 計算期間(月)
  74: define('CALC_TERM', 3);
  75: 
  76: // 惑星名(初期値)
  77: define('DEF_PLANET', 'Mars');
  78: 
  79: // Spinner - jQuery UI を使用するかどうか
  80: define('USESPINNER', TRUE);
  81: 
  82: // 数値増減クリックで即判定するかどうか(TRUE:即判定,FALE:判定ボタンを用意)
  83: define('ONCHANGE', FALSE);
  84: 
  85: // 表示幅(単位:ピクセル)
  86: define('WIDTH', 550);
  87: 
  88: // 初期値(END) ===============================================================

ここに用意した定数は自由に変更できる。

準備:pahooAstronomy クラス

pahooAstronomy.php

  11: require_once('pahooCalendar.php');
  12: 
  13: // pahooAstronomyクラス ======================================================
  14: class pahooAstronomy extends pahooCalendar {

天文計算を行うクラス pahooAstronomy は、クラス pahooCalendar を継承する。よって、クラスファイル "pahooAstronomy.php", "pahooCalendar.php" の2つを組み込み関数  require_once  を使って読めるディレクトリに配置する。

地心黄道座標から赤道座標を求める

地心黄道座標と赤道座標は、いずれも地球を中心とする極座標系であるが、座標の基準が異なる。すなわち、地心黄道座標は黄道面(太陽が通る軌跡)を基準とするが、赤道座標は地球の赤道を天球に投映した軌跡を基準とする。そこで、次のような手順で座標のベクトル変換を行ってやる。
  1. 地心黄道座標(極座標)を地心黄道直交座標へ変換する。
  2. 地心黄道直交座標を赤道直交座標へ変換する。
  3. 赤道直交座標を赤道座標(極座標)へ変換する。
これまで登場した座標系を整理しておこう。$ \lambda $ は黄経、$ \delta $ は黄緯、$ \alpha $ は赤経、$ \beta $ は赤緯と呼ぶ。$ r $ は中心天体との距離で、動径と呼ぶこともある。これまで見てきたように、座標の相互変換を行うことができる。
座標系 中心 種類 座標値
日心黄道座標 太陽 極座標 $ \lambda_s \text{(黄経)}, \ \beta_s \text{(黄緯)}, \ r_s \text{(日心距離)} $
日心黄道直交座標 太陽 直交座標 $ X_s, \ Y_s, \ Z_s $
地心黄道座標 地心 極座標 $ \lambda_e\text{(黄経)}, \ \beta_e\text{(黄緯)}, \ r_e\text{(地心距離)} $
地心黄道直交座標 地球 直交座標 $ X_e, \ Y_e, \ Z_e $
赤道直交座標 地球 直交座標 $ X, \ Y, \ Z $
赤道座標 地心 極座標 $ \alpha\text{(赤経)}, \ \delta \text{(赤緯)}, \ r\text{(動径)} $
では、地心黄道座標から赤道座標への変換式を見ておこう。

$$ \displaystyle \text{地心黄道直交座標} = \quad \left\{ \begin{align} X_e &= cos \beta \times cos \lambda \\ Y_e &= cos \beta \times sin \lambda \\ Z_e &= sin \beta \end{align} \right. $$

$$ \displaystyle \text{赤道直交座標} = \quad \left\{ \begin{align} X &= X_e \\ Y &= Y_e \times cos(\epsilon) - Z_e \times sin(\epsilon) \\ Z &= Y_e \times sin(\epsilon) - Z_e \times cos(\epsilon) \\ \epsilon &= \text{黄道傾斜角} \end{align} \right. $$

$$ \displaystyle \text{赤道座標} = \quad \left\{ \begin{align} r &= \sqrt{X^2 + Y^2 + Z^2} \\ \delta &= sin^{-1} \left( \dfrac{Z}{r} \right) \\ \alpha &= \arctan2(Y, X) \end{align} \right. $$

$$ \displaystyle \arctan2(y, x) = \begin{cases} \tan^{-1} \left( \dfrac{y}{x} \right) & \text{if } x > 0 \\ \tan^{-1} \left( \dfrac{y}{x} \right) + \pi & \text{if } x < 0,\ y \geq 0 \\ \tan^{-1} \left( \dfrac{y}{x} \right) - \pi & \text{if } x < 0,\ y < 0 \\ +\dfrac{\pi}{2} & \text{if } x = 0,\ y > 0 \\ -\dfrac{\pi}{2} & \text{if } x = 0,\ y < 0 \\ \text{undefined} & \text{if } x = 0,\ y = 0 \end{cases} $$

解説:惑星の赤道座標を求める

pahooAstronomy.php

 326: /**
 327:  * 惑星の赤道座標を求める.
 328:  * @param   string $planet 惑星名(Mercury, Venus, ... Pluto)
 329:  * @param   int $year, $month, $day  グレゴリオ暦による年月日
 330:  * @param   float $hour, $min, $sec 時分秒(ローカル時間)
 331:  * @return  array(赤経,赤緯) (単位:度)/FALSE:惑星名の間違い
 332: */
 333: function euatorialCoordinate($planet, $year, $month, $day, $hour, $min, $sec) {
 334:     // 惑星名のバリデーション
 335:     if (! isset($this->PlanetOrbitalElements[$planet]))     return FALSE;
 336: 
 337:     // 地心黄道座標
 338:     list($l, $b, $r) = $this->zodiacEarthAP($planet, $year, $month, $day, $hour, $min, $sec);
 339: 
 340:     // ユリウス世紀
 341:     $jd = $this->AD2JD($year, $month, $day, $hour, $min, $sec, $this->TDIFF);
 342:     $T  = $this->julianCentury($jd);
 343: 
 344:     // 黄道傾斜角
 345:     $epsilon = $this->meanObliquity($T);
 346: 
 347:     // 地心黄道直交座標へ変換
 348:     $Xe = cos(deg2rad($b)) * cos(deg2rad($l));
 349:     $Ye = cos(deg2rad($b)) * sin(deg2rad($l));
 350:     $Ze = sin(deg2rad($b));
 351: 
 352:     // 赤道直交座標へ変換
 353:     $X = $Xe;
 354:     $Y = $Ye * cos(deg2rad($epsilon)) - $Ze * sin(deg2rad($epsilon));
 355:     $Z = $Ye * sin(deg2rad($epsilon)) + $Ze * cos(deg2rad($epsilon));
 356: 
 357:     // 赤道座標(極座標)へ変換
 358:     $r1 = sqrt($X * $X + $Y * $Y + $Z * $Z);
 359:     $delta = rad2deg(asin($Z / $r1));
 360:     $alpha = $this->__angle(rad2deg(atan2($Y, $X)));
 361: 
 362:     return array($alpha, $delta, $r);
 363: }

上記の座標変換を実装したユーザー定義メソッドが euatorialCoordinate である。惑星名と日時を渡し、赤道座標を得ることができる。

pahooAstronomy.php

 265: /**
 266:  * 黄道傾斜角を求める.
 267:  * @param   float $T ユリウス世紀
 268:  * @return  float 平均黄道傾斜(単位:度)
 269: */
 270: function meanObliquity($T) {
 271:     // 平均黄道傾斜 ε0(単位:度)
 272:     $U = $T / 100.0;
 273:     $epsilon0 = 23.43929111 - 46.8150 / 3600.0 * $T - 0.00059 / 3600.0 * $T * $T + 0.001813 / 3600.0 * $T * $T * $T;
 274: 
 275:     return $epsilon0;
 276: }

黄道傾斜角を求めるメソッドは meanObliquity である。

準備:惑星の位置を一覧表示する

planetPosition.php

 340: // 惑星の位置を一覧表にする.
 341: $table =<<< EOT
 342: <table>
 343: <tr><th>年月日</th><th>赤経</th><th>赤緯</th><th>地心距離<br>(au)</th></tr>
 344: 
 345: EOT;
 346: 
 347: if ($errmsg == '') {
 348:     $yy = $year;
 349:     $mm = $month;
 350:     // 指定期間
 351:     for ($i = 0$i < CALC_TERM$i++) {
 352:         if ($mm > 12) {
 353:             $yy++;
 354:             $mm = 1;
 355:         }
 356:         $cnt = 1;
 357:         $day_of_month = $pa->getDaysInMonth($yy, $mm);
 358:         // 1ヶ月分
 359:         for ($dd = 1$dd <$day_of_month$dd++) {
 360:             list($alpha, $delta, $r) = $pa->euatorialCoordinate($planet, $yy, $mm, $dd, HOUR, 0, 0);
 361:             $ymd = $ymd = sprintf('%04d年%02d月%02d日(%s)', $yy, $mm, $dd, $pa->getWeekString($yy, $mm, $dd));
 362:             $alpha2 = $pa->deg2hhmm($alpha);
 363:             $delta2 = $pa->deg2ddmm($delta);
 364:             $r2     = sprintf('%.2f', $r);
 365: 
 366:             $table .=<<< EOT
 367: <tr>
 368: <td>{$ymd}</td>
 369: <td>{$alpha2}</td>
 370: <td>{$delta2}</td>
 371: <td>{$r2}</td>
 372: </tr>
 373: 
 374: EOT;
 375:         }
 376:         $mm++;
 377:     }
 378:     $table ."</table>\n";
 379: }
 380: 
 381: // 表示用HTMLを生成する.
 382: $HtmlBody = makeCommonBody($planet, $year, $month, $table, $errmsg, $pa);

メイン・プログラムでは、指定した惑星に対し、定数 CALC_TERM で指定する期間の間、euatorialCoordinate を実行し、その結果をHTML文(tableタグ)に出力する。

参考サイト

参考書籍

表紙 新装改訂版 天文計算入門
著者 長谷川一郎
出版社 恒星社厚生閣
サイズ 単行本
発売日 1996年01月25日頃
価格 2,750円(税込)
ISBN 9784769908180
 
表紙 天体の位置計算
著者 長沢 工
出版社 地人書館
サイズ 単行本
発売日 1981年01月01日頃
価格 2,970円(税込)
ISBN 9784805202258
パソコンなどの普及によって,今まで専門家のものとされていた「位置天文学」が,身近なものとなった.本書の構成・指示にしたがって,恒星や,太陽・月・惑星等の位置を自らの手で計算し,その基礎理論を理解することにより,自分のための「観測年表」を作ることも可能になる.
 
(この項おわり)
header