PHPで日出没・月出没・月齢・潮を計算

(1/1)
PHP で二十四節気一覧を作成」「PHP で月齢を計算」では、太陽や月の位置を計算する方法を紹介した。今回は、これらを利用し、日の出・日の入り・月の出・月の入りの時刻、月齢、潮の大小を計算する PHP プログラムをつくってみる。

(2020 年 1 月 25 日)pahooCalendar::__getWeekString の言語判定を修正した。ご指摘ありがとうございました。

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

PHPで日出没・月出没・月齢を計算

サンプル・プログラム

各種暦計算、太陽や月の位置計算は、クラス pahooCalendar として分離している。
圧縮ファイルの内容
myCalendar.phpサンプル・プログラム本体。
pahooCalendar.php暦計算クラス pahooCalendar、潮位計算クラス pahooTide。
include_pathが通ったディレクトリに配置すること。

解説:月出・月没時刻の計算

0985: /**
0986:  * 月の出/月の入り/南中
0987:  * @param int $mode 0=出, 1=没, 2=南中
0988:  * @param int $year, $month, $day  グレゴリオ暦による年月日
0989:  * @param double $longitude 観測値の経度(東経は正数)
0990:  * @param double $latitude  観測値の緯度
0991:  * @param double $height 観測値の高さ
0992:  * @return double 時刻(単位:日)/FALSE 月出/月没がない
0993: */
0994: function moon_time($mode$longitude$latitude$height$year$month$day) {
0995:     //地球自転遅れ補正値(日)計算
0996:     $rotate_rev = (57.0 + 0.8 * ($year - 1990)) / 86400.0;
0997: 
0998:     //2000年1月1日力学時正午からの経過日数(日)計算
0999:     $day_progress = $this->J2000($year$month$day);
1000: 
1001:     //逐次計算時刻(日)初期設定
1002:     $time_loop = 0.5;
1003: 
1004:     //補正値初期値
1005:     $rev = 1.0;
1006: 
1007:     //地平線伏角
1008:     $dip = 0.0353333 * sqrt($height);
1009: 
1010:     $diff_moon = 0;
1011:     $height_moon = 0;
1012:     while (abs($rev) > $this->CONVERGE) {
1013:         //経過ユリウス年(日)計算
1014:         //( 2000.0(2000年1月1日力学時正午)からの経過年数 (年) )
1015:         $jy = ($day_progress + $time_loop + $rotate_rev) / 365.25;
1016:         //月の黄経
1017:         $long_moon = $this->__longitude_moon($jy);
1018:         //月の黄緯
1019:         $lat_moon = $this->__latitude_moon($jy);
1020:         //黄道 → 赤道変換
1021:         list($alpha$delta) = $this->__eclip2equat($long_moon$lat_moon$jy);
1022:         if ($mode != 2) {
1023:             //月の視差
1024:             $dif_moon = $this->__dif_moon($jy);
1025:             //月の出没高度
1026:             $height_moon = -1 * $this->ASTRO_REFRACT - $dip + $dif_moon;
1027:         }
1028:         //恒星時
1029:         $sidereal = $this->__sidereal($jy$time_loop$longitude);
1030:         //時角差計算
1031:         $hour_ang_dif = $this->hour_ang_dif($mode$alpha$delta$latitude$height_moon$sidereal);
1032: 
1033:         //仮定時刻に対する補正値
1034:         $rev = $hour_ang_dif / 347.8;
1035:         $time_loop += $rev;
1036:     }
1037: 
1038:     //月出/月没がない場合は 0 とする
1039:     return ($time_loop < 0 || $time_loop >=1) ? FALSE : $time_loop;
1040: }

計算式は『日の出・日の入りの計算』(長沢工=著)による。

月の出、月の入り、月の南中(真南に来ること)の時刻はユーザー関数 moon_time で計算する。
計算の基準となる日時は、2000 年(平成 12 年)1 月 1 日力学時正午からの経過年数 $jy とする。
まず、月の位置(視黄経,視黄緯)を計算する。黄経,黄緯は、黄道(太陽の通り道)を基準とした直交座標系である。
次に、黄経,黄緯を赤経,赤緯に変換する。赤経,赤緯は、地球の経度・緯度を空に延長した直交座標系である。
ここまでで計算した座標は、月の中心の位置をあらわす。月の出、月の入りについては、月の中心座標が地平線を通過したときと定義されているので、これをそのまま時刻計算に持ち込めばよい。ただし、視差を考慮する必要がある。
なお、日の出は太陽の上縁が地平線に接した時刻、日の入りは太陽の下縁が地平線に接した時刻と定義されている。

解説:潮の計算

1113: /**
1114:  * 潮を求める
1115:  * @param int $year, $month, $day  グレゴリオ暦による年月日
1116:  * @param double $hour, $min, $sec 時分秒(世界時)
1117:  * @return string 潮
1118: */
1119: function tide($year$month$day$hour$min$sec) {
1120:     //黄経差=>潮(気象庁方式)
1121:     static $table = array(
1122:  36 => '大潮',
1123:  72 => '中潮',
1124: 108 => '小潮',
1125: 120 => '長潮',
1126: 132 => '若潮',
1127: 168 => '中潮',
1128: 216 => '大潮',
1129: 252 => '中潮',
1130: 288 => '小潮',
1131: 300 => '長潮',
1132: 312 => '若潮',
1133: 348 => '中潮',
1134: 360 => '大潮'
1135: );
1136: 
1137:     $longitude_sun  = $this->longitude_sun($year$month$day$hour$min$sec);
1138:     $longitude_moon = $this->longitude_moon($year$month$day$hour$min$sec);
1139:     //Δλ=λmoon-λsun
1140:     $delta_rm = $this->__angle($longitude_moon - $longitude_sun);
1141: 
1142:     foreach ($table as $key=>$val) {
1143:         if ($delta_rm < $key) {
1144:             $tide = $val;
1145:             break;
1146:         }
1147:     }
1148: 
1149:     return $tide;
1150: }

月と太陽の位置関係によって潮汐が起きる。

潮の大小は、月と太陽の位相(黄経差)でほぼ決まる。
ユーザー関数 longitude_sunlongitude_moon の差をとって、潮の大小を取得する関数が tide である。
黄経差は気象庁方式を採った。つまり、下記のようになる。
黄経差 潮の大小
348~36度 大潮
36~72度 中潮
72~108度 小潮
108~120度 長潮
120~132度 若潮
132~168度 中潮
168~216度 小潮
216~252度 中潮
252~288度 小潮
288~300度 長潮
300~316度 若潮
312~348度 中潮

参考書籍

表紙 日の出・日の入りの計算
著者 長沢工
出版社 地人書館
サイズ 単行本
発売日 1999年12月
価格 1,650円(税込)
rakuten
ISBN 9784805206348
 

参考サイト

(この項おわり)
header