关于评分
我们如何把云量、月光与天文黑暗压缩成一个 0–10 的数字——以及哪些因素被有意排除。
核心问题
今晚是否值得出门取决于三件事:能看到多少天空(云)、有多黑(太阳与月亮)、以及你在哪里(光污染)。评分只融合前两项。光污染决定了在你所处位置能看到什么,但本身不参与计算这个数字。
每晚三个分值
- 总评 — 在整个天文黑暗窗口(太阳低于地平线 18° 以上)取平均。诚实地回答“今晚整体如何”。
- 峰值 2 小时 — 夜间最佳的两小时窗口。当你只能短暂出门时使用。
- 黄金时段 21–01 — 不论天文黑暗何时开始,若你在 21:00 左右出门、01:00 左右回房,你实际能体验到的状况。
公式
评分综合了清晰度(不被云覆盖的天空比例)和黑暗度(月亮对天空的提亮程度),并加入一个柔性可见度门槛。
score = visibility × (clearness × 0.6 + darkness × 0.4) / 10 clearness = 100 − cloudCover% darkness = 100 − moonPenalty visibility = min(1, clearness / 30)
可见度因子承认云会决定一切:若大部分天空被云覆盖,再完美的黑暗也无法得分。清晰度高于 30% 时,visibility = 1,公式回退为普通加权平均。低于 30% 时,评分线性下降至零。
月亮惩罚
月光按亮度分级处理;后半夜的窗口因月亮通常已开始下落而获得折扣。
- 亮度低于 25%(新月或细月牙):无惩罚。
- 亮度 25–75%(接近上下弦月):惩罚 = 亮度 × 0.5。
- 亮度高于 75%(盈/亏凸月或满月):惩罚 = 亮度 × 1.0。
- 若窗口起始于 00:00 至 03:00 之间,且亮度高于 50%,惩罚再乘以 0.6。
评分不包含的因素
- 光污染(基于 VIIRS 卫星数据估算的 Bortle 等级)影响的是“今晚可见”深空清单,而非这个数字。
- 风、湿度和降水会出现在向下滚动后的时间轴中,但不会改变评分。
- 预报置信度。当天气模型不确定时我们不会调低评分——我们信任预报,让下一次刷新自行修正。
算例:完全阴天的夜晚
阿姆斯特丹 · 2026 年 5 月 5 日
云量(平均)
100%
月亮
Waning Gibbous · 83%
计算
moonPenalty(83, 23) = 83 × 1.0 = 83 clearness = 100 − 100 = 0 darkness = 100 − 83 = 17 visibility = min(1, 0 / 30) = 0 raw = 0 × (0×0.6 + 17×0.4) / 10 = 0.0
评分
0.0
待在室内。可见度门槛把评分压到零——透过 100% 云层什么也看不见。
算例:极佳的夜晚
同地点 · 晴空、月牙
云量(平均)
8%
月亮
Waxing Crescent · 15%
计算
moonPenalty(15, 23) = 0 (< 25% bracket) clearness = 100 − 8 = 92 darkness = 100 − 0 = 100 visibility = min(1, 92 / 30) = 1 raw = 1 × (92×0.6 + 100×0.4) / 10 = 9.52
评分
9.5
放下一切,出门去。月牙、几乎晴朗的天空、完整的天文黑暗。
数据来源
- Open-Meteo:逐小时云量、日月时刻、风、湿度。
- VIIRS Day/Night Band:光污染,用于为“今晚可见”清单估算 Bortle 等级。
更新频率
上游预报每 30 分钟刷新。评分接口在边缘缓存 30 分钟(s-maxage=1800)。七夜预报每天更新。