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)