关于评分
我们如何把云量、月光与天文黑暗压缩成一个 0–10 的数字——以及哪些因素被有意排除。
核心问题
今晚是否值得出门取决于三件事:能看到多少天空(云)、有多黑(太阳与月亮)、以及你在哪里(光污染)。评分只融合前两项。光污染决定了在你所处位置能看到什么,但本身不参与计算这个数字。
一个评分,两个参考值
- 总评 — 在整个天文黑暗窗口(太阳低于地平线 18° 以上)取平均。诚实地回答“今晚整体如何”。
- 最佳2小时 — 黑暗时段内最好的连续两小时。时间有限时可参考,但绝不取代主评分。
- 晚间 21–01 — 21:00 至 01:00,截取其中真正天黑的部分:傍晚出门能看到的情况。
公式
评分综合了清晰度(不被云覆盖的天空比例)和黑暗度(月亮对天空的提亮程度),并加入一个柔性可见度门槛。
score = visibility × (clearness × 0.6 + darkness × 0.4) / 10 clearness = 100 − cloudCover% // averaged over the dark window darkness = 100 − moonPenalty // averaged over the same hours visibility = min(1, clearness / 30)
可见度因子承认云会决定一切:若大部分天空被云覆盖,再完美的黑暗也无法得分。清晰度高于 30% 时,visibility = 1,公式回退为普通加权平均。低于 30% 时,评分线性下降至零。
月亮惩罚
月亮亮度先按照明比例分级,再按每个黑暗时段中月亮的实际高度进行缩放。
- 亮度低于 25%(新月或细月牙):无惩罚。
- 亮度 25–75%(接近上下弦月):惩罚 = 亮度 × 0.5。
- 亮度高于 75%(盈/亏凸月或满月):惩罚 = 亮度 × 1.0。
- 月亮在地平线以下时不扣分;高度达到30°起按完整档位扣分;介于两者之间则按高度比例计算。月出、月落和高度均由 astronomy-engine 按你的精确位置计算。
评分不包含的因素
- 光污染(基于 VIIRS 卫星数据估算的 Bortle 等级)影响的是“今晚可见”深空清单,而非这个数字。
- 风、湿度和降水会出现在向下滚动后的时间轴中,但不会改变评分。
- 预报置信度。当天气模型不确定时我们不会调低评分——我们信任预报,让下一次刷新自行修正。
算例:完全阴天的夜晚
阿姆斯特丹 · 2026年9月19日 · 真实预报
云量(平均)
96% · 21:43–05:25
月亮
61% · 17:00–23:33
计算
moonPenalty = 1 (low Moon, sets 23:33) clearness = 100 − 96 = 4 darkness = 100 − 1 = 99 visibility = min(1, 4 / 30) = 0.13 raw = 0.13 × (4×0.6 + 99×0.4) / 10 = 0.56
评分
0.6
待在室内吧。整夜都是厚实的低云:能见度门槛把评分压到接近零。月亮几乎没有影响:它一直很低,并在 23:33 落下。
算例:极佳的夜晚
同地点 · 晴空、月牙
云量(平均)
8%
月亮
Waxing Crescent · 15%
计算
moonPenalty = 0 (< 25% lit) 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)。七夜预报每天更新。
For the geeks
How the score is calculated
Deeper walkthrough of layer-weighted cloud forecasts, multi-model confidence, METAR observations, and the calibration feedback loop.
Read the methodology →