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
+14 -2
View File
@@ -3,6 +3,7 @@
package svg
import (
"b612.me/astro/internal/limbnote"
"b612.me/astro/internal/timenote"
"errors"
"fmt"
@@ -253,7 +254,8 @@ func renderOccultationPathSVG(
}
writePlanetOccultationEventsPanel(&b, *planetPath, layout, options)
}
writeStarOccultationFooter(&b, layout, options, flags, occultationScaleInstant(path, planetPath))
writeStarOccultationFooter(&b, layout, options, flags, occultationScaleInstant(path, planetPath),
occultationLimbApplied(path, planetPath))
b.WriteString(`</svg>`)
return b.String(), nil
}
@@ -757,16 +759,26 @@ func occultationScaleInstant(path moon.StarOccultationPath, planetPath *moon.Pla
return path.Greatest.Time
}
// occultationLimbApplied 报告图中界线是否按月缘剖面修正。
func occultationLimbApplied(path moon.StarOccultationPath, planetPath *moon.PlanetOccultationPath) bool {
if planetPath != nil {
return planetPath.LunarLimbApplied
}
return path.LunarLimbApplied
}
func writeStarOccultationFooter(
b *strings.Builder,
layout starOccultationSVGLayout,
options StarOccultationSVGOptions,
flags occultationSVGTextFlags,
instant time.Time,
limbApplied bool,
) {
maxWidth := layout.width - 80
lineHeight := svgchart.FooterLineHeight(11)
scaleNote := timenote.Scale(options.TimeScale, instant, options.Location, options.Language)
scaleNote := limbnote.Join(timenote.Scale(options.TimeScale, instant, options.Location, options.Language),
limbnote.Limits(limbApplied, options.Language), options.Language)
// 页脚默认排在画布底边之内(与既有版面一致),说明行放得下时声明单独占最后一行;
// 自定义说明太长时改用按字号留白的行数上限:截断说明也要保住时标声明和底边留白。
lines := occultationWrappedTextLines(starOccultationSVGFooter(options), flags.footerNote, maxWidth, 11)