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 更新履歴
バージョン 更新日 内容
1.8.1 2025/03/15 validRegexPattern() -- debug
1.8.0 2024/11/12 validRegexPattern() 追加
1.7.0 2024/10/09 validURL() validEmail() 追加
1.6.0 2024/10/07 isButton() -- buttonタグに対応
1.5.0 2024/01/28 exitIfExceedVersion() 追加
pahooCalendar.php 更新履歴
バージョン 更新日 内容
4.5.1 2025/05/31 deg2ddmm(), deg2hhmm() 不具合修正
4.5.0 2024/03/17 ヒジュラ暦メソッドを追加
4.4.1 2024/03/17 getCabinetOfficeHolidayTable() -- bug-fix
4.4.0 2024/02/25 内閣府の祝日表を参照できるようにした
4.3.2 2023/02/11 getSolarTerm72() 表記改訂:水澤腹堅→水沢腹堅
pahooAstronomy.php 更新履歴
バージョン 更新日 内容
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. 赤道直交座標を赤道座標(極座標)へ変換する。
これまで登場した座標系を整理しておこう。λ は黄経、δ は黄緯、α は赤経、β は赤緯と呼ぶ。r は中心天体との距離で、動径と呼ぶこともある。これまで見てきたように、座標の相互変換を行うことができる。
座標系 中心 種類 座標値
日心黄道座標 太陽 極座標 λs(黄経), βs(黄緯), rs(日心距離)
日心黄道直交座標 太陽 直交座標 Xs, Ys, Zs
地心黄道座標 地心 極座標 λe(黄経), βe(黄緯), re(地心距離)
地心黄道直交座標 地球 直交座標 Xe, Ye, Ze
赤道直交座標 地球 直交座標 X, Y, Z
赤道座標 地心 極座標 α(赤経), δ(赤緯), r(動径)
では、地心黄道座標から赤道座標への変換式を見ておこう。

地心黄道直交座標={Xe=cosβ×cosλYe=cosβ×sinλZe=sinβ

赤道直交座標={X=XeY=Ye×cos(ϵ)Ze×sin(ϵ)Z=Ye×sin(ϵ)Ze×cos(ϵ)ϵ=黄道傾斜角

赤道座標={r=X2+Y2+Z2δ=sin1(Zr)α=arctan2(Y,X)

arctan2(y,x)={tan1(yx)if x>0tan1(yx)+πif x<0, y0tan1(yx)πif x<0, y<0+π2if x=0, y>0π2if x=0, y<0undefinedif x=0, y=0

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

pahooAstronomy.php

 326: /**
 327:  * 惑星の赤道座標を求める.
 328:  * @param   string $planet 惑星名(Mercury, Venus, ... Pluto)
 329:  * @param   int $year, $month, $day  グレゴリオ暦による年月日
 330:  * @param   double $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   double $T ユリウス世紀
 268:  * @return  double 平均黄道傾斜(単位:度)
 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
 
表紙 天体の位置計算
著者 長沢工
出版社 地人書館
サイズ 単行本
発売日 1985年09月
価格 2,970円(税込)
ISBN 9784805202258
 
(この項おわり)
header