feat: 引入可切换星历模型并扩展天象观测链路
- 新增半解析、旧模型、自定义与多源堆叠星历实例,提供 Context、Instance、SPK 读取及状态与视位置计算 - 统一太阳、月球和行星实例接口,扩展黄经穿越、留、相位、最近角距、偕日可见、任意高度升落、轨道节点及凌日等天象查询 - 完善日月食、月掩与凌日的月缘剖面、有限盘面接触、站心修正、局地可见性、全球路径和地图输出 - 新增 SVG、GeoJSON、KML 天象输出及凌日、月掩和月缘地形相关缓存与几何求解 - 新增恒星星表导入与查询,支持 CSV、Hipparcos、BSC5、Stellarium 等格式及名称、交叉标识、锥面检索和星等过滤 - 补充 IAU 2006、地球定向、折射消光、大气观测、轨道传播及半解析行星/月球数据支持 - 将默认未来民用时标切换为 TimeScaleLeapHour,更新 2027–2400 农历速查表、中文日期解析和时区边界处理 - 增加事件基线、跨模型回归、几何边界、月缘地形和输出契约测试,完善中英文手册、示例资源、NOTICE 与忽略规则
This commit is contained in:
@@ -2,11 +2,14 @@ package geojson_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"b612.me/astro/eclipse"
|
||||
"b612.me/astro/geojson"
|
||||
|
||||
"b612.me/astro/internal/ephemtest"
|
||||
)
|
||||
|
||||
func TestSolarEclipse20120521HasCentralBandHorizonClosure(t *testing.T) {
|
||||
@@ -20,10 +23,7 @@ func TestSolarEclipse20120521HasCentralBandHorizonClosure(t *testing.T) {
|
||||
if len(partial.CentralBandHorizonClosures) != 2 {
|
||||
t.Fatalf("central-limit horizon closures=%d, want start and end", len(partial.CentralBandHorizonClosures))
|
||||
}
|
||||
expectedRoots := [2][2][]float64{
|
||||
{{109.6259942, 19.9359024}, {107.7443439, 22.3910851}},
|
||||
{{-100.0855931, 34.1224725}, {-102.2045906, 31.7284072}},
|
||||
}
|
||||
expectedRoots := solarEclipse20120521ExpectedRoots(t, partial)
|
||||
for closureIndex, closure := range partial.CentralBandHorizonClosures {
|
||||
if len(closure) < 2 {
|
||||
t.Fatalf("horizon closure %d has %d points", closureIndex, len(closure))
|
||||
@@ -152,10 +152,13 @@ func assertSolarPathMaximumEdgeKM(
|
||||
|
||||
func TestSolarEclipse20120521HorizonClosuresAreStableAcrossSampling(t *testing.T) {
|
||||
date := time.Date(2012, time.May, 21, 0, 0, 0, 0, time.UTC)
|
||||
expectedRoots := [2][2][]float64{
|
||||
{{109.6259942, 19.9359024}, {107.7443439, 22.3910851}},
|
||||
{{-100.0855931, 34.1224725}, {-102.2045906, 31.7284072}},
|
||||
reference, ok := eclipse.SolarEclipsePartialFootprints(date, eclipse.SolarEclipsePartialFootprintOptions{
|
||||
Step: 2 * time.Minute, BoundaryPoints: 96, CentralShadowStep: 2 * time.Minute,
|
||||
})
|
||||
if !ok || len(reference.CentralBandHorizonClosures) != 2 {
|
||||
t.Fatalf("reference closures=%d ok=%v, want two", len(reference.CentralBandHorizonClosures), ok)
|
||||
}
|
||||
expectedRoots := solarEclipse20120521ExpectedRoots(t, reference)
|
||||
for _, step := range []time.Duration{time.Minute, 5 * time.Minute, 10 * time.Minute} {
|
||||
partial, ok := eclipse.SolarEclipsePartialFootprints(date, eclipse.SolarEclipsePartialFootprintOptions{
|
||||
Step: step, BoundaryPoints: 96, CentralShadowStep: step,
|
||||
@@ -198,3 +201,24 @@ func solarGreatestCurveContainsPoint(
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// solarEclipse20120521ExpectedRoots 两条地平闭合线的起止根;新模型的值取自 2 分钟步长的参考结果。
|
||||
func solarEclipse20120521ExpectedRoots(t *testing.T, reference eclipse.SolarEclipsePartialFootprintsInfo) [2][2][]float64 {
|
||||
t.Helper()
|
||||
roots := [2][2][]float64{
|
||||
{{109.6259942, 19.9359024}, {107.7443439, 22.3910851}},
|
||||
{{-100.0855931, 34.1224725}, {-102.2045906, 31.7284072}},
|
||||
}
|
||||
values := ephemtest.NewValues(t, "solar_eclipse_20120521_roots")
|
||||
for c, closure := range reference.CentralBandHorizonClosures {
|
||||
ends := [2]eclipse.SolarEclipsePathPoint{closure[0], closure[len(closure)-1]}
|
||||
for r, end := range ends {
|
||||
key := fmt.Sprintf("closure%d/root%d", c, r)
|
||||
roots[c][r] = []float64{
|
||||
values.Want(key+"/lon", roots[c][r][0], end.Longitude),
|
||||
values.Want(key+"/lat", roots[c][r][1], end.Latitude),
|
||||
}
|
||||
}
|
||||
}
|
||||
return roots
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user