andrmoel / astronomy-bundle
天文学计算包,如月亮、太阳和行星的位置,日出、日落或日食。大部分计算基于Jean Meeus的《天文学算法》书籍和VSOP87理论。
Requires
- php: ^7.2
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^7
- symfony/phpunit-bridge: ^4.1
- dev-master
- 2.0.1
- 2.0.0
- 1.1.1
- 1.1.0
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.7.0
- 0.6.0
- 0.5.1
- 0.5.0
- 0.4.1
- 0.4.0
- 0.3.8
- 0.3.7
- 0.3.6
- 0.3.5
- 0.3.4
- 0.3.3
- 0.3.2
- 0.3.1
- 0.3.0
- 0.2.6
- 0.1.2
- 0.1.1
- 0.1.0
- dev-conjuction
- dev-apparent
- dev-cache
- dev-central-meridian
- dev-conjunction-longitude
- dev-improve-vsop87
- dev-magnitude
- dev-magnitude-saturn
- dev-moon-calc
- dev-precession
- dev-precission
- dev-solar-eclipse
- dev-sun
- dev-tle
- dev-vsop87
- dev-vsop87_cache
- dev-satellite
- dev-lunar-eclipse
This package is auto-updated.
Last update: 2024-09-09 14:34:59 UTC
README
简介
此库提供用于天文学计算的工具和方法。使用此包,可以计算月亮、太阳和行星的位置以及几个坐标系。为了提高精度,还考虑了诸如章动和精度等几个校正。还可以计算天体的升起、落下和正午事件。详细信息请参阅目录。
大部分计算基于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): voidpublic function setString(string $dateTimeStr): voidpublic function setJulianDay(float $JD): voidpublic 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。
月出、月落和上中天
月相
以下代码片段解释了如何计算属于特定日期的月相的所有重要参数。在此示例中是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_NONE、SolarEclipse:TYPE_PARTIAL、SolarEclipse:TYPE_ANNULAR或SolarEclipse: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);
月食
其他计算
两点之间的距离
$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"