#太阳能 #算法 #日出 #天顶 #方位角

无 std spa

使用 Rust 编写的太阳位置算法模块(SPA)用于计算特定地理位置和时间(UTC)的日出日落以及方位角和天顶角;例如用于太阳能板定位或汽车。

8 个版本 (4 个破坏性更新)

0.5.1 2024年2月11日
0.5.0 2024年2月11日
0.4.0 2023年6月11日
0.3.1 2023年4月18日
0.1.1 2017年11月19日

#36日期和时间

Download history 656/week @ 2024-03-14 867/week @ 2024-03-21 694/week @ 2024-03-28 1062/week @ 2024-04-04 740/week @ 2024-04-11 703/week @ 2024-04-18 830/week @ 2024-04-25 1915/week @ 2024-05-02 1547/week @ 2024-05-09 1007/week @ 2024-05-16 791/week @ 2024-05-23 794/week @ 2024-05-30 917/week @ 2024-06-06 1029/week @ 2024-06-13 765/week @ 2024-06-20 554/week @ 2024-06-27

3,344 次每月下载
用于 2 crate

Apache-2.0

125KB
361

太阳位置算法(SPA)

太阳位置算法模块(SPA)用于 Rust 计算特定地理位置和时间(UTC)的日出日落以及方位角和天顶角;例如用于太阳能板定位或汽车。

计算日出日落

以下函数用于计算在地理坐标 lat/lon 和时间 t(UTC)的日出日落。

该算法已从http://lexikon.astronomie.info/zeitgleichung/neu.html 移植到 Rust。其精度在几分钟之内。

参数

  • utc - UTC 时间点(DateTime)
  • lat - WGS84 系统中的纬度,范围为 -90.0 到 90.0。
  • lon - WGS84 系统中的经度,范围为 -180.0 到 180.0

该函数返回类型为 SunriseAndSet 的结果。

pub enum SunriseAndSet {
    PolarNight,
    PolarDay,
    Daylight(DateTime<Utc>, DateTime<Utc>),
}

地球北极圈和南极圈附近地区会出现极夜现象,即夜间持续超过24小时。这仅发生在极圈内。相反的现象,即极昼或午夜太阳,发生在太阳持续高于地平线超过24小时。这里的“夜间”是指太阳中心位于自由地平线下方的时刻,用 SunriseAndSet::PolarNightSunriseAndSet::PolarDay 变体表示。

由于大气弯曲了太阳光线,因此极昼比极夜长,受极夜影响的区域略小于午夜太阳的区域。极圈位于这两个区域之间,大约在66.5度的纬度上。该函数使用0.833333度的海拔高度近似大气弯曲。

变体 SunriseAndSet::Daylight(DateTime<Utc>, DateTime<Utc>) 表示日出和日落时间。

如果纬度或经度不在有效范围内,函数将返回 Result::Err(BadParam)

pub fn sunrise_and_set<F: FloatOps>(utc: DateTime<Utc>, lat: f64, lon: f64) -> Result<SunriseAndSet, SpaError> {..}

计算太阳位置

以下函数用于计算在时间 t 和地理位置 lat/lon 时的太阳位置(方位角和仰角)

该算法已从 http://www.psa.es/sdg/sunpos.htm 转移到 Rust。该算法对于1999年和之后的年份,精度在0.5分弧度以内。

参数

  • utc - UTC 时间点(DateTime)
  • lat - WGS84 系统中的纬度,范围为 -90.0 到 90.0。
  • lon - WGS84 系统中的经度,范围为 -180.0 到 180.0

该函数返回类型为 SolarPos 的结果。

pub struct SolarPos {
    // horizontal angle measured clockwise from a north base line or meridian
    pub azimuth: f64,
    // the angle between the zenith and the centre of the sun's disc
    pub zenith_angle: f64,
}

如果纬度或经度不在有效范围内,函数将返回 Result::Err(BadParam)

pub fn solar_position<F: FloatOps>(utc: DateTime<Utc>, lat: f64, lon: f64) -> Result<SolarPos, SpaError> {..}

平台特定的浮点运算

SPA 库通过 FloatOps 特性同时支持 stdno_std 目标构建。

pub trait FloatOps {
    fn sin(x: f64) -> f64;
    fn cos(x: f64) -> f64;
    fn tan(x: f64) -> f64;
    fn asin(x: f64) -> f64;
    fn acos(x: f64) -> f64;
    fn atan(x: f64) -> f64;
    fn atan2(y: f64, x: f64) -> f64;
    fn trunc(x: f64) -> f64;
}
  • std 目标构建(默认)中,提供了内置实现 StdFloatOps,以便您方便使用,受 std 功能的限制。
[dependencies]
spa = "^0.5"
  • no_std 目标构建中,您需要提供自己的浮点运算实现,例如使用 libm。必须在依赖声明中指定 default-features = false 选项。
[dependencies]
spa = { version = "^0.5", default-features = false }

依赖项

~1–1.3MB
~21K SLoC