feat: 引入可切换星历模型并扩展天象观测链路

- 新增半解析、旧模型、自定义与多源堆叠星历实例,提供 Context、Instance、SPK 读取及状态与视位置计算
- 统一太阳、月球和行星实例接口,扩展黄经穿越、留、相位、最近角距、偕日可见、任意高度升落、轨道节点及凌日等天象查询
- 完善日月食、月掩与凌日的月缘剖面、有限盘面接触、站心修正、局地可见性、全球路径和地图输出
- 新增 SVG、GeoJSON、KML 天象输出及凌日、月掩和月缘地形相关缓存与几何求解
- 新增恒星星表导入与查询,支持 CSV、Hipparcos、BSC5、Stellarium 等格式及名称、交叉标识、锥面检索和星等过滤
- 补充 IAU 2006、地球定向、折射消光、大气观测、轨道传播及半解析行星/月球数据支持
- 将默认未来民用时标切换为 TimeScaleLeapHour,更新 2027–2400 农历速查表、中文日期解析和时区边界处理
- 增加事件基线、跨模型回归、几何边界、月缘地形和输出契约测试,完善中英文手册、示例资源、NOTICE 与忽略规则
This commit is contained in:
2026-10-15 23:54:15 +08:00
parent 16c62a97d5
commit 044f2f4381
674 changed files with 62983 additions and 8396 deletions
+30 -8
View File
@@ -40,7 +40,7 @@
这些接口位于根包 `b612.me/astro`。
| 接口 | 返回值 |
| 函数 | 返回值 |
| --- | --- |
| `TTFromUTC(date)` | 同一时刻的 TT 读数 |
| `UTCFromTT(tt)` | TT 读数对应的UTC时刻 |
@@ -78,13 +78,21 @@ func main() {
}
```
```text
UTC: 2026-04-01T00:00:00Z
TT: 2026-04-01 00:01:09.184014
UT1: 2026-04-01 00:00:00.051015
DUT1: 0.051000 s
UTC from TT: 2026-04-01T00:00:00Z
```
数值换算经过浮点儒略日,往返结果可能有微小舍入差。TT/UT1 的显示格式不加 `Z`,以免被当成 UTC 时间戳。
## 儒略日换算 API
下列函数位于 `basic`,参数与返回值是 `float64`。换算函数返回儒略日,差值函数返回秒。
| 接口 | 输入 → 输出 | 说明 |
| 函数 | 输入 → 输出 | 说明 |
| --- | --- | --- |
| `UTC2TT` | UTC JD → TT JD | 1972 年前按 UT1,之后使用 TT−UTC 模型 |
| `TT2UTC` | TT JD → UTC JD | 上述逆变换 |
@@ -125,7 +133,7 @@ TDB−TT 使用 40 项截断级数和质量调整项。在 −3000 至 +6000 年
## ΔT 模型
默认模型为 SMH2016 与 Morrison 2021 的样条和长期外推,并在实测覆盖期内优先使用逐月 ΔT 表。当前表延伸到 2026 年 9 月 1 日,末点为快速观测值,尚非最终解;表外在端点作常值锚定以保持连续。`DeltaT` 对超出 ±40000 年的输入返回 `NaN`。
默认模型为 SMH2016 与 Morrison 2021 的样条和长期外推,并在实测覆盖期内优先使用逐月 ΔT 表。当前表延伸到 2026 年 10 月 1 日,2026 年 9 月 1 日为最终值,末点为预备扩展值;表外在端点作常值锚定以保持连续。`DeltaT` 对超出 ±40000 年的输入返回 `NaN`。
| 常量 | 模型 |
| --- | --- |
@@ -165,6 +173,12 @@ func main() {
}
```
```text
smh2016 86.98252070239269
espenak_meeus_2006 202.7448354310582
nasa_canon_2006 202.7448354310582
```
ΔT 的未来值不能精确预知。按现有模型计算,Espenak–Meeus 2006 与默认模型在 2035、2050、2100、2200 年的差异约为 11、21、116、275 秒。远期日月食的时刻和地面路径会受此影响;与日月食目录对照时,应先统一 ΔT 模型。
### 接入外部模型
@@ -184,19 +198,27 @@ func main() {
## 未来的 UTC 对齐口径假设
`SetTimeScaleFuturePolicy` 与 `GetTimeScaleFuturePolicy` 选择民用时标换算政策,默认是 `TimeScaleLeapSecond`。除 `TimeScaleUT1Civil` 替换全时轴外,其余政策只控制实测窗口之后的 TT−UTC;1972 年后显式注入的 TT−UTC 覆盖始终优先。它与出图的 `TimeScaleUTC` / `TimeScaleUT1` 选项用途不同。
> **2027-05-20 起 UTC 不再插入闰秒(闰时取代闰秒)**
>
> 2026 年 10 月 15 日,第 28 届国际计量大会(CGPM)通过[第 5 号决议《关于确保 UTC 连续性所需的技术行动》](https://www.bipm.org/en/cgpm-2026/resolution-5)(`Resolution-CGPM-28-5`,DOI `10.59161/CGPM2026RES5E`),决定**连续 UTC 自 2027 年 5 月 20 日起生效**,并把 `|UT1−UTC|` 的最大值由 0.9 秒放宽到 **3600 秒(1 小时)**。
>
> [IERS Bulletin C 72(2026-07-06)](https://datacenter.iers.org/data/latestVersion/bulletinC.txt) 已确认 **2026 年 12 月底不插入闰秒**;闰秒机制在 2027-05-20 终止,2027 年 6 月底这一可能的插入点同样不会有闰秒。
>
> 本库据此把内置窗口(截至 2026-10-01)之后的默认政策改为 `TimeScaleLeapHour`:1972–2026 仍按确定的闰秒表计算,历史值不变;窗口之后 TT−UTC 将长期保持 69.184 秒,直到数百年后 `|UT1−UTC|` 逼近 1 小时才需要闰时。农历现代快速表的 1900–2026 段也因此保持逐位不变。
`SetTimeScaleFuturePolicy` 与 `GetTimeScaleFuturePolicy` 选择民用时标换算政策,默认是 `TimeScaleLeapHour`。除 `TimeScaleUT1Civil` 替换全时轴外,其余政策只控制实测窗口之后的 TT−UTC;1972 年后显式注入的 TT−UTC 覆盖始终优先。`TimeScaleUTC` / `TimeScaleUT1` 只决定输出标签的口径,本政策决定民用时标与 TT 的换算,两者互不影响。
| 政策 | 计算假设 |
| --- | --- |
| `TimeScaleLeapSecond`(零值、默认) | 从末端 TT−UTC 出发,以最少整数秒校正使外推 DUT1 回到 ±0.9 秒内 |
| `TimeScaleLeapHour`(零值、默认) | 按 ΔT 外推,以最少整小时校正使 DUT1 回到 ±3600 秒内,对应 2027-05-20 起生效的连续 UTC |
| `TimeScaleLeapSecond` | 从末端 TT−UTC 出发,以最少整数秒校正使外推 DUT1 回到 ±0.9 秒内;对应 1972–2026 的确定闰秒口径,仅供复现与对照 |
| `TimeScaleAssumeUT1Tracking` | 保留末端 DUT1,TT−UTC 随外推 ΔT 平滑变化 |
| `TimeScaleFreezeUTCOffset` | TT−UTC 固定在内置窗口末端值,当前为 69.184 秒 |
| `TimeScaleLeapHour` | 按 ΔT 外推,以最少整小时校正使 DUT1 回到 ±3600 秒内,用于情景计算 |
| `TimeScaleUT1Civil` | 全时轴将民用时间视为 UT1,含历史闰秒表覆盖期;无显式覆盖时 DUT1 恒为 0 |
这些选项是计算假设,不是对未来闰秒或国际决议的预报。整数秒或小时校正由当前查询时刻的 ΔT 决定,不记录历次校正,也不强制落在公告的日历边界。阶跃附近不保证逐值往返恒等;步进政策依赖的 ΔT 无效或超出模型范围时返回 `NaN`,不会退回正常偏移。
默认政策 `TimeScaleLeapHour` 直接对应 2027-05-20 起生效的连续 UTC,不再是情景假设;`TimeScaleLeapSecond` 保留用于复现 1972–2026 的确定口径或作对照。整小时校正由查询时刻的 ΔT 决定,可能不落在公告的日历月边界;步进政策依赖的 ΔT 无效或超出模型范围时返回 `NaN`。
默认模型也不能保证任意未来日期相对真实 UTC 的误差小于 0.9 秒。需要精确民用时刻时,应使用对应日期的已发布时标数据。
`TimeScaleLeapHour` 下 `|UT1−UTC|` 的容限是 3600 秒,因此窗口之后的 TT−UTC 在很长时间内恒为 69.184 秒;`TimeScaleLeapSecond` 仍按 ±0.9 秒外推,会给出每 1–2 年一次阶跃的旧行为,不代表现实。需要精确民用时刻时,应使用对应日期的已发布时标数据。
## SVG、GeoJSON 与 KML 的时间标签