abbadon1334/sun-position-spa-php

太阳能数据计算和太阳位置

2.0.0 2019-07-08 09:51 UTC

README

PHP的SPA太阳位置计算库

Build Status Coverage Status Maintainability Test Coverage Codacy Badge Codacy Badge

此库基于Ibrahim Reda和Afshin Andreas(SPA)的工作,为太阳能辐射应用设计(2008年美国国家可再生能源实验室)的太阳能位置算法

原始研究的摘要

已经有许多发表的文章描述了太阳能辐射应用的太阳位置算法。在这些文章中,大多数达到的最佳不确定性大于±0.01 / 在计算太阳天顶角和方位角时。对于其中一些,算法仅对从15年到一百年的有限年份有效。本报告是实现算法的逐步过程,用于计算从-2000年到6000年的太阳天顶角和方位角,不确定度为±0.0003°

PHPUNIT 测试

库测试数据与原始研究表A.4的比较

太阳位置算法(SPA)的C源代码

http://www.nrel.gov/midc/spa/

要求

  • 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()后的可用属性

我知道这些属性名称不是非常正统。 原始文档中存在的公式非常复杂,使用相同的名称为变量是一个很大的调试帮助

  • 地球日心经度(度)
  • 地球日心纬度(度)
  • R 地球半径矢量,R(天文单位,AU)
  • Θ° 地心经度(度)
  • β° 地心纬度(度)
  • X 经度和倾斜的章动
  • ε° 黄道真倾斜角(度)
  • Δτ 折射修正(度)
  • λ° 表面太阳经度(度)
  • ν° 格林尼治视恒星时(度)
  • ν0° 格林尼治平均视恒星时(度)
  • α° 地心太阳赤经(度)
  • α´° 地面中心太阳赤经(度)
  • δ° 地心太阳赤纬(度)
  • δ´° 地面中心太阳赤纬(度)
  • 观测者时角(度)
  • H´° 地面中心时角(度)
  • ξ° 太阳赤道水平视差(度)
  • 地面中心天顶角(度)
  • Γ° 地面中心天文学家方位角(度)
  • Φ° 地面中心方位角,M用于导航和太阳能辐射用户(度)
  • e0° 地面中心无大气折射仰角(度)
  • 地面中心仰角(度)
  • 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)