- 原始项目:Open-Meteo
- Satellite-api
- om20250206接入Himawari👉 feat: JMA JAXA Himawari solar radiation
以Open-Meteo提供的近实时卫星辐射产品为基础,参考其存档、校正与转换模块,设计冗余库作为工程备份
- 构建稳定、可复现的近实时辐射处理流程(已完成)
- 实现专业的卫星辐射校正算法(进行中)
- 实现专业的辐射转换以适用于功率预测(进行中)
- 卫星:Himawari-8 / Himawari-9
- 产品:L2 PAR(SWR)- 短波辐射产品
- 来源:JAXA 官方 FTP
- 分辨率:10分钟
- 状态:Beta版(未质量保证)
FTP 存储路径:
/pub/himawari/L2/PAR/021/{year}{month}/{day}/{hour}
下载 - 内存读取 - 自定义OM格式,路径:JaxaHimawariDownloader.swift
实时下载nc - 提取SWR - 裁剪指定区域为tif
注意时区问题:github actions运行时, datetime.now() 返回的是utc时间。
- 实时数据,腾讯云函数触发,具体参考前一个项目workflow
- 历史数据,服务器里按日触发,查询执行完成后触发下一个项目
def get_latest_run():
url = f"https://api.github.com/repos/StorywithLove/Himawari_radiation_api/actions/workflows/hist.yml/runs?per_page=1"
headers = {
"Authorization": f"Bearer {GTOKEN}",
"Accept": "application/vnd.github+json"
}
r = requests.get(url, headers=headers)
r.raise_for_status()
run_info = r.json()["workflow_runs"][0]
return run_info
#return datetime.fromisoformat(run_info['created_at'].rstrip('Z')).replace(tzinfo=timezone.utc), run_info["status"], run_info["conclusion"]原始 Himawari L2 SWR 数据存在两个关键问题,使其无法直接用于时间序列分析:
- 时间标签不一致:文件名时间 = 扫描开始时间(如 10:00)、实际观测时间随扫描位置变化(南北差异可达 8-10 分钟,日本区域的像元实际在 10:08 才被观测到)
- 物理含义不匹配:原始数据是瞬时辐射值、实际应用需要时间平均辐射值、扫描过程中太阳位置持续变化
将一次完整的扫描数据视为其后 10 分钟区间的平均辐射:
| 原始文件时间 | 实际观测时间 | 校正后时间 | 物理含义 |
|---|---|---|---|
| 10:00 | 10:00-10:08 | 10:10 | 10:00-10:10 瞬时辐射(中间结果) |
将瞬时辐射值转换为 10 分钟(向后)平均:
| 校正后时间 | 物理含义 |
|---|---|
| 10:10 | 10:00-10:10 平均辐射 |
- Zensun.swift
- calculateDiffuseRadiationBackwards(), 基于Razo, Müller Witwer分离模型, 从总辐射/地面短波辐射中分解出散射分量、直射分量
- DirectNormalIrradiance.swift
- calculateInstantDNI,基于水平面直射分量, 逆向计算太阳法向DNI
- GlobalTilitedIrradiance.swift
- calculateTiltedIrradiance(), 基于[DNI, DHI, tilt, azimuth]计算GTI/POA = 散射辐射-等向性天空, 地面反射-反射率0.2, 直接辐射-太阳入射角余弦, 通过积分平均法计算太阳位置
- SolarPositionAlgorithm.swift
- SolarPositionAlgorithm(), 基于NREL SPA算法的太阳位置计算
- SunRiseSet.swift
- calculateSunRiseSet, 基于太阳几何位置和时间, 计算日出日落时间