suncalc

发布人:仓颉技术交流平台官方
分类:算法与数据结构 / 数学与科学计算

需要构建仓颉原生高精度天文计算库,解决服务端农业物联网、光伏发电调度及地理信息服务中的太阳月亮位置计算瓶颈。

等待接取
2026-03-10
3

悬赏内容

招募内容

项目背景与战略目标

在后端服务中,基于地理位置和时间的光照计算是智慧农业(光照时长分析)、新能源(光伏板角度调整、发电量预测)、物流调度(夜间行车限制)及地理信息系统(GIS)的核心需求。现有的天文计算库(如 JS 的 suncalc 或 Python 的 pysolar)多采用动态语言实现,浮点运算效率较低,且在高并发场景下(如百万级设备同时请求日出日落时间)容易成为 CPU 瓶颈。此外,动态类型的隐式转换可能导致精度丢失或运行时错误。

本项目旨在利用仓颉编程语言(Cangjie Language)1.0.0+重构 suncalc,打造一款高精度、向量化加速、强类型安全的后端天文计算基础库。

  • 极致计算性能:利用仓颉的静态编译优化和 SIMD 指令集(针对浮点运算),实现毫秒级甚至微秒级的单点计算,支持批量向量化计算,性能较动态语言提升 20-100 倍。

  • 内存安全与零分配:依托仓颉值类型(Value Types)和栈分配机制,在计算过程中避免堆内存分配,杜绝 GC 压力,适合高频调用的实时计算场景。

  • 高精度数学模型:内置多种天文算法模型(如 SPA, Meeus),支持双精度甚至更高精度的浮点运算,确保长期运行下的累积误差最小化。

  • 强类型错误处理:利用代数数据类型(ADT)显式表达计算成功、极昼/极夜等特殊情况,杜绝隐式的 null 或无效时间戳,提升系统稳定性。

  • 时区与地点无关性:纯数学计算核心,无外部依赖,完美适配分布式微服务架构,支持任意时区和经纬度输入。

核心功能需求与技术规格

功能模块分解

模块类别

核心职责

关键技术要求 (仓颉特性)

验收依据

核心天文引擎

计算太阳/月亮的方位角、高度角、赤经、赤纬等

利用 Float64 高精度运算,SIMD 并行处理批量坐标数据

单点计算延迟 < 1μs,批量计算吞吐量 > 10M OPS

日出日落计算器

基于经纬度和时间,精确计算日出、日落、正午、晨昏蒙影时刻

利用迭代法求解地平线交点,处理极昼/极夜边界情况

计算误差 < 1 分钟(对比 NASA 星历表),覆盖全球所有纬度

月相与盈亏计算

计算月龄、月相百分比、满月/新月时刻

利用高精度月球轨道模型,支持历史及未来长周期推算

月相计算误差 < 0.1%,支持前后 100 年范围

光照时长分析

计算任意地点的日照时长、黑夜时长及黄金时刻

利用解析几何快速求解,支持批量日期范围计算

批量计算 1 年数据耗时 < 5ms

坐标转换工具

支持地平坐标系、赤道坐标系、黄道坐标系互转

利用矩阵运算优化转换过程,确保数值稳定性

转换精度符合 IAU 标准,无奇异点崩溃

非功能性需求规范

  • 性能指标:单线程计算吞吐量 > 10M OPS,P99 延迟 < 1μs,内存峰值为 O(1)(无堆分配)。

  • 安全要求:严格处理非法经纬度输入(如超出范围),防止除零错误或 NaN 传播;所有数学函数需经过边界值测试。

  • 可靠性:能够处理闰秒、时区切换及极端地理坐标(南北极点),保证计算结果数学上合理或服务不挂起。

  • 可维护性:算法实现与业务逻辑解耦,支持插拔式天文模型(如切换高精度模型),代码具备完善的数学公式注释。

核心接口设计示例 (伪代码)

// 定义地理坐标
struct GeoLocation {
    latitude: Float64 // -90 to 90
    longitude: Float64 // -180 to 180
    altitude: Float64 // meters, default 0
}

// 定义天文计算结果
struct SunPosition {
    azimuth: Float64 // degrees, 0-360
    altitude: Float64 // degrees, -90-90
    distance: Float64 // AU
}

struct SunTimes {
    sunrise: Option<TimePoint> // None if polar night
    sunset: Option<TimePoint>  // None if polar day
    solarNoon: TimePoint
    goldenHourStart: Option<TimePoint>
    goldenHourEnd: Option<TimePoint>
    civilDawn: Option<TimePoint>
    civilDusk: Option<TimePoint>
}

// 定义计算错误
enum AstroError {
    case InvalidCoordinates(String)
    case PolarDayOrNight(String)
    case CalculationDiverged
}

// 核心计算接口
interface AstroEngine {
    // 计算太阳位置
    func getSunPosition(time: TimePoint, location: GeoLocation): SunPosition
    
    // 计算日出日落时间
    func getSunTimes(date: LocalDate, location: GeoLocation): SunTimes
    
    // 计算月相 (0.0 - 1.0)
    func getMoonPhase(time: TimePoint): Float64
    
    // 批量计算 (向量化优化)
    func batchGetSunPositions(times: List<TimePoint>, location: GeoLocation): List<SunPosition>
    
    // 计算日照时长 (分钟)
    func getDaylightDuration(date: LocalDate, location: GeoLocation): Int32
}

// 工厂类
object SunCalcFactory {
    static func createStandard(): AstroEngine // 标准精度
    static func createHighPrecision(): AstroEngine // 高精度模型 (SPA)
}

项目交付物与实施路线图

阶段性交付物清单

  • 第一阶段:核心太阳位置算法 + 日出日落计算 + 单元测试 (覆盖率≥95%) + 精度验证报告。

  • 第二阶段:月球计算模块 + 批量向量化优化 + 极昼极夜处理 + 性能基准测试。

  • 第三阶段:完整坐标系转换 + 模糊测试 + cjpm 发布包 + 最佳实践文档(含农业/光伏场景案例)。

项目实施路线图

阶段

核心任务

交付成果

周期预估

里程碑

基础构建

核心算法实现、边界处理、单测

可编译库、单测集、精度对比报告

4-5 周

cjpm test 全量通过,误差符合标准

性能攻坚

SIMD 优化、批量计算、极值处理

压测报告、API文档

4-5 周

达到预设 OPS 指标,无 NaN 传播

生态集成

扩展功能、文档完善、发布

用户手册、cjpm 包、场景 Demo

3-4 周

上架仓颉三方库社区

技术实现规范与质量认证体系

仓颉语言专项质量规范

  • 编码规范:100% 符合仓颉语言官方编码规范,通过 cjfmt 自动格式化校验。

  • 类型安全:充分利用 Float64 类型确保精度,利用 Option 类型处理极昼极夜等无解情况,杜绝 null

  • 错误处理:所有非法输入必须通过 Result 类型返回,严禁抛出未捕获的运行时异常。

  • 数值稳定性:关键三角函数计算需考虑数值稳定性,避免大数吃小数问题。

测试与验证标准

  • 单元测试:核心模块行覆盖率≥95%,重点覆盖两极地区、赤道、闰年、夏令时切换等边界情况。

  • 精度验证:与美国海军天文台(USNO)或 NASA JPL 星历表数据进行对比,确保误差在允许范围内。

  • 性能基准:建立与 suncalc (JS), pysolar (Python), PyEphem 的性能对比基准。

文档与可维护性

  • API 文档:代码须包含规范的文档注释,详细说明各算法模型的来源及适用精度范围。

  • 架构决策记录:记录天文模型选型(如 Meeus vs SPA)及优化策略的依据。

  • 贡献指南:明确仓颉项目构建、调试、提交全流程规范。

持续集成质量门禁

#!/bin/bash
# PR 自动化流水线脚本

# 1. 格式检查
cjpm fmt --check

# 2. 构建检查
cjpm build
cjpm build --release

# 3. 静态 lint 检查
cjpm lint --deny-warnings

# 4. 全量测试与覆盖率
cjpm test --all-features --coverage

# 5. 精度验证测试 (对比权威数据)
cjpm test --suite astronomical-accuracy-validation

# 6. 性能基准测试
cjpm bench --threshold 5%

技术栈与开发环境

  • 核心语言:仓颉编程语言(Cangjie Language)1.0.0 及以上版本(强制)。

  • 构建与包管理:CJPM (Cangjie Package Manager)。

  • 测试框架:仓颉原生测试框架。

  • 质量工具:cjfmt, cjpm lint, cjpm bench。

  • 环境要求:仓颉 1.0.0+ 标准工具链,CI 环境需预置权威天文星历表数据集用于精度回归测试。

相关附件

暂无附件

质量认证要求

交付件

NO

交付件描述

备注

1

三方库源代码

源代码

2

三方库测试方案和用例

测试用例和文档

3

用户手册,API文档,设计文档,license文档

 资料和文档

验收标准

1.功能

  1. 三方库必须有明确的功能;

  2. 如果参考对标库移值开发,功能与参考三方库保持一致。

2.资料

  1. Readme:包含简介,软件架构,目录结构,下载安装(编译构建),接口说明,使用示例,约束限制,开源协议,参与贡献等内容;

  2. Changelog,三方库版本需包含基本的修改说明。

3.标准遵从性(可选),三方库实现需满足对应协议或行业标准,举例

  1. appquth:支持对OAuth 的PKCE扩展;

  2. icu4j:支持unicode标准库,通用字符集ISO/IEC 10646。

4.性能目标

  1. 性能敏感三方库接口运行性能持平对标三方库

5.开源协议遵从,必须包含License文件

  1. 放置合适的开源License协议,建议Apache License Version 2.0;

  2. 引用或参考开源三方库,需遵从开源协议。

6.网络安全要求

  1. 满足基础的网络安全红线及隐私要求,符合安全编码规范。

过程质量要求

指标分类

指标名称

指标要求

度量工具

牵引 OR Must

代码度量

平均文件代码行

≤300 LOC

CMetricsPlus,CJMetric

Must

总文件重复率

C/C++≤4%;相比开源不劣化

CMetricsPlus,CJMetric

Must

源文件重复率

C/C++≤4%;相比开源不劣化

CMetricsPlus,CJMetric

Must

平均函数或方法代码行*

≤30  LOC

CMetricsPlus,CJMetric

Must

总代码重复率

C/C++≤10%;相比开源不劣化

CMetricsPlus,CJMetric

Must

源文件代码重复率

C/C++≤10%;相比开源不劣化

CMetricsPlus,CJMetric

Must

平均圈复杂度

≤5;相比开源不劣化

CMetricsPlus,CJMetric

Must

冗余代码

“0” 【2】;

CMetricsPlus,CJMetric

Must

不安全函数

NA

CMetricsPlus,CJMetric

Must

静态检查

编译告警

“0” 【2】

Compile工具

牵引

通用静态告警

“0” 【2】

Pclint plus,CJLINT

Must

开发者测试

DT用例密度(个/KLOC)

> 40

手工

牵引 

DT代码语句覆盖率

>=85%

Gcov,cjcov

牵引

DT代码分支覆盖率

>=50%

Gcov,cjcov

牵引

未做DT文件数

0

手工

牵引

问题解决率

遗留问题DI

整体<10

Issue

牵引 

遗留致命缺陷数(0)

0

Issue

Must

累计缺陷解决率

85%

Issue

牵引 

软件开发

每日构建成功率

100%

CI

牵引

测试评估

测试缺陷密度(/KLOC)

5-9

人工

牵引

测试用例密度(个/KLOC)

20-40

人工

牵引

初验用例自动化率

100%

CIDA

牵引 

HLT自动化用例比率

【85%,95%】

CIDA

牵引 

开源第三方(含构建工具)

开源片段引用

0(除例外备案类)

FOSSBOT+人工

Must

可信构建

二进制一致性

0(含可澄清)

人工

Mus