andrmoel/astronomy-bundle

天文学计算包,如月亮、太阳和行星的位置,日出、日落或日食。大部分计算基于Jean Meeus的《天文学算法》书籍和VSOP87理论。

2.0.1 2020-02-27 21:07 UTC

README

  1. 简介
  2. 安装
  3. 示例数据
  4. 角度工具
  5. 关注的时间
    1. 创建TOI
    2. 儒略日、世纪和千年
    3. GMST、GAST和时角
  6. 位置
  7. 坐标系(和转换)
  8. 天体
    1. 太阳
      1. 位置
      2. 到地球的距离
      3. 日出、日落和正午
    2. 月亮
      1. 位置
      2. 到地球的距离
      3. 月出、月落和正午
      4. 相位
    3. 行星
      1. 行星的日心位置
      2. 行星的地心位置
      3. 升起、落下和正午
  9. 事件
    1. 日食
      1. 创建日食
      2. 类型、遮掩、大小、持续时间
      3. 接触点(C1、C2、MAX、C3、C4)
    2. 月食
  10. 其他计算
    1. 两点之间的距离
    2. 地球章动

简介

此库提供用于天文学计算的工具和方法。使用此包,可以计算月亮、太阳和行星的位置以及几个坐标系。为了提高精度,还考虑了诸如章动和精度等几个校正。还可以计算天体的升起、落下和正午事件。详细信息请参阅目录。

大部分计算基于Jean Meeus的《天文学算法》书籍和VSOP87理论。

安装

使用composer安装此包。

composer require andrmoel/astronomy-bundle

示例数据

项目目录中的/examples文件夹中提供了一些示例计算。

php examples/sun.php

角度工具

角度工具提供了将角度转换为不同格式的辅助方法。

示例1:转换十进制度量角

$angleDec = 132.6029282;

$angle = AngleUtil::dec2angle($angleDec);
$time = AngleUtil::dec2time($angleDec);

计算结果应该是
角度:132°36'10.542''
时间:8h50m24.703s

示例2:将时间转换为十进制格式

$time = '8h50m24.703s';

$angle = AngleUtil::time2dec($time);

计算结果应该是
角度:132.60292916667°

关注的时间

TimeOfInterest (TOI) 对象代表所有天文学计算都完成的日期。因此,它是此库中的最重要的对象

ℹ️ 为什么我们不能简单地使用PHP的DateTime对象?

PHP自身DateTime对象的问题是,其支持的日期范围是'1000-01-01'至'9999-12-31'。因此,我们无法处理公元1000年之前的日期的计算。

创建TimeOfInterest对象

有几种初始化TOI对象的方法。

示例1:为2017年7月2日15:30:00 UTC初始化TimeOfInterest对象

// Create from time
$toi = TimeOfInterest::create(2017, 7, 2, 15, 30, 0);
$toi = TimeOfInterest::createFromTime(2017, 7, 2, 15, 30, 0);

// Create from string
$toi = TimeOfInterest::createFromString('2017-07-02 15:30:00');

// Create from PHPs DateTime object
$dateTime = new \DateTime('2017-07-02 15:30:00');
$toi = TimeOfInterest::createFromDateTime($dateTime);

// Create from Julian Day
$JD = 2457937.1458333;
$toi = TimeOfInterest::createFromJulianDay($JD);

// Create from Julian Centuries since J2000
$T = 0.17500741501255;
$toi = TimeOfInterest::createFromJulianCenturiesJ2000($T);

echo $toi;

结果总是: 2017-07-02 15:30:00

示例2:为UTC的当前日期和时间创建TOI对象

$toi = TimeOfInterest::createFromCurrentTime();

echo $toi;

TimeOfInterest提供了一些修改时间的方法

  • public function setDateTime(\DateTime $dateTime): void
  • public function setString(string $dateTimeStr): void
  • public function setJulianDay(float $JD): void
  • public function setJulianCenturiesJ2000(float $T): void

示例3:为当前时间创建TOI对象并将时间更改为2017-07-02 15:30:00 UTC

$toi = TimeOfInterest::createFromCurrentTime();

$toi->setString('2017-07-02 15:30:00');

echo $toi;

结果总是: 2017-07-02 12:00:00

儒略日、从J2000起的儒略世纪和从J2000起的儒略千年

示例:为2017年7月2日13:37 UTC创建TOI

$toi = TimeOfInterest::createFromString('2017-07-02 13:37:00');

$JD = $toi->getJulianDay();
$JD0 = $toi->getJulianDay0();
$T = $toi->getJulianCenturiesFromJ2000();
$t = $toi->getJulianMillenniaFromJ2000();

计算结果应该是
儒略日:2457937.0673611
儒略日0:2457936.5
儒略世纪J2000:0.1750052665602
儒略千年J2000:0.01750052665602

格林威治平均恒星时(GMST)、格林威治视恒星时(GAST)和时间方程

借助TOI-Object,可以计算GMST、GAST和时间方程(所有值的单位均为度)。以下示例解释了如何获取1992年12月20日00:00 UTC的这些值。

$toi = TimeOfInterest::createFromString('1992-12-20 00:00:00');

$GMST = $toi->getGreenwichMeanSiderealTime();
$GAST = $toi->getGreenwichApparentSiderealTime();
$E = $toi->getEquationOfTime();

计算结果应该是
GMST:88.82536°
GAST:88.829629°
时间方程:0.619485°

您可以使用AngleUtil::dec2time($value)将这些值转换为更常见的角度格式。结果将是:
GMST:5小时55分18.086秒
GAST:5小时55分19.111秒
时间方程:0小时2分28.676秒

位置

位置对象表示观测者在地表上的位置。

// Initialize Location object for Berlin
$location = Location::create(52.524, 13.411);

// Initialize Location with elevation (Mt. Everest)
$location = Location::create(27.98787, 86.92483, 8848);

坐标系和转换

该包提供了常见的天文学坐标系以供计算。

  • 地心黄道球坐标系(纬度,经度)
  • 地心赤道球坐标系(赤经,赤纬)
  • 地心赤道直角坐标系(X,Y,Z)
  • 日心黄道球坐标系(纬度,经度)
  • 日心黄道直角坐标系(X,Y,Z)
  • 日心赤道直角坐标系(x,y,z)
  • 本地水平坐标系(方位角,高度角)

每个类都提供了将一个坐标系转换为另一个坐标系的方法。

示例 1:将地心赤道球坐标系转换为地心黄道球坐标系

$T = -0.12727429842574; // Julian Centuries since J2000 (1987-04-10 19:21:00)
$rightAscension = 116.328942;
$declination = 28.026183;

$geoEquSphCoord = new GeocentricEquatorialSphericalCoordinates($rightAscension, $declination);
$geoEclSphCoord = $geoEquSphCoord->getGeocentricEclipticalSphericalCoordinates($T);

$lon = $geoEclSphCoord->getLongitude();
$lat = $geoEclSphCoord->getLatitude();

示例 2:将地心赤道球坐标系转换为本地水平坐标系

$location = Location::create(38.921389, -77.065556); // Washington DC
$T = -0.12727429842574; // Julian Centuries since J2000 (1987-04-10 19:21:00)
$rightAscension = 347.3193375;
$declination = -6.719891667;

$geoEquSphCoord = new GeocentricEquatorialSphericalCoordinates($rightAscension, $declination);
$locHorCoord = $geoEquSphCoord->getLocalHorizontalCoordinates($location, $T);

$altitude = $locHorCoord->getAltitude();
$azimuth = $locHorCoord->getAzimuth();

天体

天体对象必须使用TOI进行初始化。如果在构造函数中未传递TOI,则选择当前时间。

$toi = TimeOfInterest::createFromString('2017-07-02 12:00:00');

$moon = Moon::create($toi);

太阳

太阳的位置

示例 1:计算2019年5月17日17:50 UTC的太阳位置

$toi = TimeOfInterest::createFromString('2019-05-17 17:50');

$sun = Sun::create($toi);

$geoEclSphCoordinates = $sun->getGeocentricEclipticalSphericalCoordinates();
$lon = $geoEclSphCoordinates->getLongitude();
$lat = $geoEclSphCoordinates->getLatitude();

计算结果应该是
经度:56.544°
纬度:0.0001°

示例 2:计算2019年5月17日17:50 UTC在德国柏林观察到的太阳方位角和高度角

$toi = TimeOfInterest::createFromString('2019-05-17 17:50');

$location = Location::create(52.524, 13.411); // Berlin

$sun = Sun::create($toi);

$locHorCoord = $sun->getLocalHorizontalCoordinates($location);
$azimuth = $locHorCoord->getAzimuth();
$altitude = $locHorCoord->getAltitude();

计算结果应该是
方位角:291.0°
高度角:8.49°

高度角的结果已被大气折射校正。要获得未校正折射的本地水平坐标,请将第二个参数传递为false

$locHorCoord = $sun->getLocalHorizontalCoordinates($location, false);

地球到太阳的距离

示例 1:太阳当前距离(千米)可以计算如下

$sun = Sun::create();

$distance = $sun->getDistanceToEarth();

结果应在147.1百万至152.1百万千米之间。

示例 2:获取2017年6月5日20:50 UTC的太阳距离

$toi = TimeOfInterest::createFromString('2017-06-05 20:50');

$sun = Sun::create($toi);

$distance = $sun->getDistanceToEarth();

结果应为151797703km。

日出、日落和上中天

计算2019年5月17日在柏林的日出、日落和上中天的太阳位置

$toi = TimeOfInterest::createFromString('2019-05-17');

$location = Location::create(52.524, 13.411); // Berlin

$sun = Sun::create($toi);

// Results are TimeOfInterest objects
$sunrise = $sun->getSunrise($location);
$sunset = $sun->getSunset($location);
$upperCulmination = $sun->getUpperCulmination($location);

计算结果应该是
日出:03:08 UTC
日落:18:59 UTC
上中天:13:03 UTC

月亮

月球的位置

示例 1:计算1992年4月12日00:00 UTC的月球地心位置。

$toi = TimeOfInterest::createFromString('1992-04-12 00:00:00');

$moon = Moon::create($toi);

$geoEquSphCoord = $moon->getGeocentricEquatorialSphericalCoordinates();
$rightAscension = $geoEquSphCoord->getRightAscension();
$declination = $geoEquSphCoord->getDeclination();

计算结果应该是
赤经:134.69°
赤纬:13.77°

示例 2:计算2019年5月20日23:00 UTC在德国柏林观察到的月球方位角和高度角

$toi = TimeOfInterest::createFromString('2019-05-20 23:00:00');

$location = Location::create(52.524, 13.411); // Berlin

$moon = Moon::create($toi);

$locHorCoord = $moon->getLocalHorizontalCoordinates($location);
$azimuth = $locHorCoord->getAzimuth();
$altitude = $locHorCoord->getAltitude();

计算结果应该是
方位角:153.3°
高度角:12.28°

高度角的结果已被大气折射校正。要获得未校正折射的本地水平坐标,请将第二个参数传递为false

$locHorCoord = $moon->getLocalHorizontalCoordinates($location, false);

地球到月球的距离

示例 1:月球当前距离(千米)可以计算如下

$moon = Moon::create();

$distance = $moon->getDistanceToEarth();

结果应在363300km至405500km之间。

示例 2:获取2017年6月5日20:50 UTC的月球距离

$toi = TimeOfInterest::createFromString('2017-06-05 20:50');

$moon = Moon::create($toi);

$distance = $moon->getDistanceToEarth();

结果应为402970km。

月出、月落和上中天

  • #f03c15 注意:功能尚未实现

月相

以下代码片段解释了如何计算属于特定日期的月相的所有重要参数。在此示例中是2019年5月13日21:30 UTC。

$toi = TimeOfInterest::createFromString('2019-05-13 21:30:00');

$moon = Moon::create($toi);

$isWaxing = $moon->isWaxingMoon();
$illumination = $moon->getIlluminatedFraction();
$positionAngle = $moon->getPositionAngleOfMoonsBrightLimb();

计算结果应该是
是盈月:是
照明度:0.709 (70.9%)
明亮边缘的位置角:293.54°

行星

与太阳和月亮物体一样,行星可以通过传递TimeOfInterest来创建。如果没有传递TimeOfInteressed,则使用当前日期和时间进行进一步计算。

示例:创建一些行星

$toi = TimeOfInterest::createFromString('2018-06-03 19:00:00');

$mercury = Mercury::create();  // Time = now
$venus = Venus::create($toi); // Time = 2018-06-03 19:00:00
$earth = Earth::create($toi);
$mars = Mars::create($toi);
$jupiter = Jupiter::create($toi);
$saturn = Saturn::create($toi);
$uranus = Uranus::create($toi);
$neptune = Neptune::create($toi);

行星的日心位置

计算使用VSOP87理论来获取行星的日心位置。

示例:计算1992年12月20日00:00 UTC时金星日心位置。

$toi = TimeOfInterest::createFromString('1992-12-20 00:00:00');

$venus = Venus::create($toi);

$helEclSphCoord = $venus->getHeliocentricEclipticalSphericalCoordinates();
$lon = $helEclSphCoord->getLongitude();
$lat = $helEclSphCoord->getLatitude();
$r = $helEclSphCoord->getRadiusVector();

$helEclRecCoord = $venus->getHeliocentricEclipticalRectangularCoordinates();
$x = $helEclRecCoord->getX();
$y = $helEclRecCoord->getY();
$z = $helEclRecCoord->getZ();

计算结果应该是
经度:26.11412°
纬度:-2.62063°
半径向量:0.72460
X:0.64995327095595
Y:0.31860745636351
Z:-0.033130385747949

行星的地心位置

所有地心计算解都给出了行星的视位置。这意味着行星的位置已经通过光行差和光折射进行了校正。

示例 1:计算2018年10月25日07:15 UTC金星的地心视位置。

$toi = TimeOfInterest::createFromString('2018-10-25 07:15:00');

$venus = Venus::create($toi);

$geoEclSphCoords = $venus->getGeocentricEclipticalSphericalCoordinates();
$lon = $geoEclSphCoords->getLongitude();
$lat = $geoEclSphCoords->getLatitude();

$geoEclSphCoords = $venus->getGeocentricEquatorialSphericalCoordinates();
$rightAscension = $geoEclSphCoords->getRightAscension();
$declination = $geoEclSphCoords->getDeclination();

计算结果应该是
经度:213.898092° (213°53'53.131")
纬度:-6.476359° (-6°28'34.891")
赤经:209.340427° (13h57m21.702s)
赤纬:-18.898191° (-18°53'53.487")

示例 2:计算2018年10月25日07:15 UTC在柏林金星的天顶角和高度角。

$location = Location::create(52.524, 13.411); // Berlin

$toi = TimeOfInterest::createFromString('2018-10-25 07:15:00');

$venus = Venus::create($toi);

$locHorCoords = $venus->getLocalHorizontalCoordinates($location);
$azimuth = $locHorCoords->getAzimuth();
$altitude = $locHorCoords->getAltitude();

计算结果应该是
天顶角:130.202°
高度角:5.038°

高度角的结果已被大气折射校正。要获得未校正折射的本地水平坐标,请将第二个参数传递为false

$locHorCoord = $venus->getLocalHorizontalCoordinates($location, false);

升起、落下和上中天

计算2018年10月25日07:15 UTC在柏林金星升起、落下和上中天。

$location = Location::create(52.524, 13.411); // Berlin

$toi = TimeOfInterest::createFromString('2018-10-25 07:15:00');

$venus = Venus::create($toi);

// Results are TimeOfInterest objects
$rise = $venus->getRise($location);
$set = $venus->getSet($location);
$upperCulmination = $venus->getUpperCulmination($location);

计算结果应该是
升起:06:31 UTC
落下:15:06 UTC
上中天:10:49 UTC

事件

日食

创建一个日食对象

示例:为2017年8月21日在俄勒冈州马德拉斯的位置创建一个日食。

$location = Location::create(44.61040, -121.23848); // Madras, OR

$toi = TimeOfInterest::createFromString('2017-08-21'); // Date of the eclipse (UTC)

$solarEclipse = SolarEclipse::create($toi, $location);

注意:如果日食的日期无效,将抛出一个异常。

日食类型、遮蔽、强度、持续时间等。

要获得给定位置的日食最大日食的日食情况,请参阅以下示例。

给定位置的日食类型(字符串表示)。但最好使用以下常量:SolarEclipse:TYPE_NONESolarEclipse:TYPE_PARTIALSolarEclipse:TYPE_ANNULARSolarEclipse:TYPE_TOTAL

示例 1:2017年8月21日在俄勒冈州马德拉斯的总日食的当地情况。

$location = Location::create(44.61040, -121.23848); // Madras, OR

$toi = TimeOfInterest::createFromString('2017-08-21'); // Date of the eclipse (UTC)

$solarEclipse = SolarEclipse::create($toi, $location);

$type = $solarEclipse->getEclipseType();
$duration = $solarEclipse->getEclipseDuration(); // in seconds
$durationTotality = $solarEclipse->getEclipseUmbraDuration(); // in seconds
$obscuration = $solarEclipse->getObscuration();
$magnitude = $solarEclipse->getMagnitude();
$moonSunRatio = $solarEclipse->getMoonSunRatio();

计算结果应该是
类型:总日食
日食持续时间:9257s
日食持续时间:120s
遮蔽:1 (100%)
强度:1.01
月-日比率:1.03

示例 2:2015年3月20日在柏林的日偏食的当地情况。

$location = Location::create(52.52, 13.405); // Berlin

$toi = TimeOfInterest::createFromString('2015-03-20'); // Date of the eclipse (UTC)

$solarEclipse = SolarEclipse::create($toi, $location);

$type = $solarEclipse->getEclipseType();
$duration = $solarEclipse->getEclipseDuration(); // in seconds
$durationTotality = $solarEclipse->getEclipseUmbraDuration(); // in seconds
$obscuration = $solarEclipse->getObscuration();
$magnitude = $solarEclipse->getMagnitude();
$moonSunRatio = $solarEclipse->getMoonSunRatio();

计算结果应该是
类型:偏食
日食持续时间:8386s
日食持续时间:0s
遮蔽:0.74 (74%)
强度:0.79
月-日比率:1.05

接触点(C1、C2、MAX、C3、C4)

可以获取每个接触类型(C1、C2、MAX、C3和X4)的日食的当前情况。

  • C1:第一次接触 - 日食开始
  • C2:第二次接触 - 开始全食或环食
  • MAX:日食最大遮蔽
  • C3:第三次接触 - 全食或环食结束
  • C4:第四次接触 - 日食结束
$location = Location::create(44.61040, -121.23848); // Madras, OR

$toi = TimeOfInterest::createFromString('2017-08-21'); // Date of the eclipse (UTC)

$solarEclipse = SolarEclipse::create($toi, $location);

$c1 = $solarEclipse->getCircumstancesC1();
$c2 = $solarEclipse->getCircumstancesC2();
$max = $solarEclipse->getCircumstancesMax();
$c3 = $solarEclipse->getCircumstancesC3();
$c4 = $solarEclipse->getCircumstancesC4();

示例:获取2017年8月21日在俄勒冈州马德拉斯的第二次接触(C2)的时间和太阳的位置。

$location = Location::create(44.61040, -121.23848); // Madras, OR

$toi = TimeOfInterest::createFromString('2017-08-21'); // Date of the eclipse (UTC)

$solarEclipse = SolarEclipse::create($toi, $location);

$c2 = $solarEclipse->getCircumstancesC2();

// Get time for C2
$toiC2 = $solarEclipse->getTimeOfInterest($c2);

// Get local horizontal coordinates (azimuth, altitude) of C2
$locHorCoord = $c2->getLocalHorizontalCoordinates();
$azimuth = $locHorCoord->getAzimuth();
$altitude = $locHorCoord->getAltitude();

第二次接触(C2)的计算结果应为
关注时间:2017-06-21 17:19:24 UTC
太阳天顶角:118.9°
太阳高度角:41.4°

高度角的结果已经通过大气折射进行了校正。为了获得未经折射校正的本地水平坐标,请将false作为参数传递

$locHorCoord = $c2->getLocalHorizontalCoordinates(false);

月食

  • #f03c15 注意:功能尚未实现

其他计算

两点之间的距离

$location1 = Location::create(52.524, 13.411); // Berlin
$location2 = Location::create(40.697,-74.539); // New York

$distance = EarthCalc::getDistanceBetweenLocations($location1, $location2);

计算结果应为6436km。

地球章动

$T = -0.127296372458;

$nutationLon = EarthCalc::getNutationInLongitude($T);
$nutationLon = AngleUtil::dec2angle($nutationLon);

$nutationObl = EarthCalc::getNutationInObliquity($T);
$nutationObl = AngleUtil::dec2angle($nutationObl);

计算结果应该是
经度章动:-0°0'3.788"
倾角章动:0°0'9.442"