abbadon1334 / sun-position-spa-php
太阳能数据计算和太阳位置
2.0.0
2019-07-08 09:51 UTC
Requires
- php: >=7.2
Requires (Dev)
- codacy/coverage: dev-master
- friendsofphp/php-cs-fixer: dev-master@dev
- phpmd/phpmd: 2.6.0
- phpmetrics/phpmetrics: dev-master@dev
- phpstan/phpstan: 0.11.5
- phpunit/phpunit: *
- squizlabs/php_codesniffer: 3.4.2
- symfony/yaml: ~2.1|~3.0|~4.0
This package is auto-updated.
Last update: 2024-09-19 05:18:31 UTC
README
PHP的SPA太阳位置计算库
此库基于Ibrahim Reda和Afshin Andreas(SPA)的工作,为太阳能辐射应用设计(2008年美国国家可再生能源实验室)的太阳能位置算法
原始研究的摘要
已经有许多发表的文章描述了太阳能辐射应用的太阳位置算法。在这些文章中,大多数达到的最佳不确定性大于±0.01 / 在计算太阳天顶角和方位角时。对于其中一些,算法仅对从15年到一百年的有限年份有效。本报告是实现算法的逐步过程,用于计算从-2000年到6000年的太阳天顶角和方位角,不确定度为±0.0003°
PHPUNIT 测试
库测试数据与原始研究表A.4的比较
太阳位置算法(SPA)的C源代码
要求
- PHP 7.2
- PHP 7.3
- PHP 7.4
Composer安装
composer require abbadon1334/sun-position-spa-php
简单用法
$SD = new SolarData\SolarData();
/* ARGS : observer latitude, observer longitude, observer altitude */
$SD->setObserverPosition(39.742476,-105.1786,1830.14);
/* ARGS : Observer Date : Year, Month, Day */
$SD->setObserverDate(2003, 10, 17);
/* ARGS : Observer Time : Hours, Minutes, Seconds */
$SD->setObserverTime(12, 30,30);
/* ARGS : difference in seconds between the Earth rotation time and the Terrestrial Time (TT) */
$SD->setDeltaTime(67);
/* ARGS : Observer Timezone */
$SD->setObserverTimezone(-7);
/* ARGS : Observer mean pressure in Millibar */
$SD->object->setObserverAtmosphericPressure(820);
/* ARGS : Observer mean temperature in Celsius */
$SD->object->setObserverAtmosphericTemperature(11.0);
/* calculate sun position */
$SunPosition = $SD->calculate();
calculate()后的可用属性
我知道这些属性名称不是非常正统。 原始文档中存在的公式非常复杂,使用相同的名称为变量是一个很大的调试帮助
L°
地球日心经度(度)B°
地球日心纬度(度)R
地球半径矢量,R(天文单位,AU)Θ°
地心经度(度)β°
地心纬度(度)X
经度和倾斜的章动ε°
黄道真倾斜角(度)Δτ
折射修正(度)λ°
表面太阳经度(度)ν°
格林尼治视恒星时(度)ν0°
格林尼治平均视恒星时(度)α°
地心太阳赤经(度)α´°
地面中心太阳赤经(度)δ°
地心太阳赤纬(度)δ´°
地面中心太阳赤纬(度)H°
观测者时角(度)H´°
地面中心时角(度)ξ°
太阳赤道水平视差(度)Z°
地面中心天顶角(度)Γ°
地面中心天文学家方位角(度)Φ°
地面中心方位角,M用于导航和太阳能辐射用户(度)e0°
地面中心无大气折射仰角(度)e°
地面中心仰角(度)Eot
时差
获取角H° - 观测者时角的示例
$SD = new SolarData\SolarData();
/* ARGS : observer latitude, observer longitude, observer altitude */
$SD->setObserverPosition(39.742476,-105.1786,1830.14);
/* ARGS : Observer Date : Year, Month, Day */
$SD->setObserverDate(2003, 10, 17);
/* ARGS : Observer Time : Hours, Minutes, Seconds */
$SD->setObserverTime(12, 30,30);
/* ARGS : difference in seconds between the Earth rotation time and the Terrestrial Time (TT) */
$SD->setDeltaTime(67);
/* ARGS : Observer Timezone */
$SD->setObserverTimezone(-7);
/* ARGS : Observer mean pressure in Millibar */
$SD->object->setObserverAtmosphericPressure(820);
/* ARGS : Observer mean temperature in Celsius */
$SD->object->setObserverAtmosphericTemperature(11.0);
/* calculate sun position */
$SunPosition = $SD->calculate();
获取H° 观测者时角(度)
echo $SunPosition->H°;
*获取日出 - 中午 - 日落的比例日份的示例 *
$SD = new SolarData\SolarData();
/* ARGS : observer latitude, observer longitude, observer altitude */
$SD->setObserverPosition(39.742476,-105.1786,1830.14);
/* ARGS : Observer Date : Year, Month, Day */
$SD->setObserverDate(2003, 10, 17);
/* ARGS : Observer Time : Hours, Minutes, Seconds */
$SD->setObserverTime(12, 30,30);
/* ARGS : difference in seconds between the Earth rotation time and the Terrestrial Time (TT) */
$SD->setDeltaTime(67);
/* ARGS : Observer Timezone */
$SD->setObserverTimezone(-7);
/* ARGS : Observer mean pressure in Millibar */
$SD->object->setObserverAtmosphericPressure(820);
/* ARGS : Observer mean temperature in Celsius */
$SD->object->setObserverAtmosphericTemperature(11.0);
/* calculate sun position and calculate sun rise transit set angles
ARGS : true = call ->calculate()
*/
$SunPosition = $SD->calculateSunRiseTransitSet(true);
$SunRiseDayFraction = $SunPosition->DayFractionSunrise;
$TransitDayFraction = $SunPosition->DayFractionTransit;
$SunsetDayFraction = $SunPosition->DayFractionSunset;
获取太阳入射角
$SD = new SolarData\SolarData();
/* ARGS : observer latitude, observer longitude, observer altitude */
$SD->setObserverPosition(39.742476,-105.1786,1830.14);
/* ARGS : Observer Date : Year, Month, Day */
$SD->setObserverDate(2003, 10, 17);
/* ARGS : Observer Time : Hours, Minutes, Seconds */
$SD->setObserverTime(12, 30,30);
/* ARGS : difference in seconds between the Earth rotation time and the Terrestrial Time (TT) */
$SD->setDeltaTime(67);
/* ARGS : Observer Timezone */
$SD->setObserverTimezone(-7);
/* ARGS : Observer mean pressure in Millibar */
$SD->object->setObserverAtmosphericPressure(820);
/* ARGS : Observer mean temperature in Celsius */
$SD->object->setObserverAtmosphericTemperature(11.0);
- 无需调用calculate*
/* ARGS : tilt angle from horizontal plane, rotation angle from real south */
$Surface2SunAngleOfIncidence = $SD->getSurfaceIncidenceAngle(30,-10)