- 基于平均下合周期与节点相位预筛候选,减少无效星历计算;跳过无法求解的单个会合周期,避免有限覆盖星历导致搜索提前终止 - 引入影轴 γ、半影半径及地球尺度几何判定,结合站心可见性识别地心无接触、仅部分地区可见的掠凌 - 添加金星 243 年、水星 46 年周期族编号,并明确编号适用范围及未分配时的零值语义 - 为 SVG、GeoJSON 和 KML 增加站心部分凌日可见区,适配接触等时线、几何元数据、图层样式及取景;为地心无接触凌日事件增加正射图,按可见区球面面积加权居中
45 lines
1.5 KiB
Go
45 lines
1.5 KiB
Go
package geojson_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
"time"
|
|
|
|
"b612.me/astro/geojson"
|
|
"b612.me/astro/venus"
|
|
)
|
|
|
|
func TestMarshalVenusTransitGlobalPartial(tester *testing.T) {
|
|
info := venus.NextTransit(time.Date(2854, 1, 1, 0, 0, 0, 0, time.UTC))
|
|
data, err := geojson.MarshalVenusTransit(info, geojson.PlanetTransitOptions{IsochroneStep: 30 * time.Second})
|
|
if err != nil {
|
|
tester.Fatal(err)
|
|
}
|
|
collection, roles := decodeTransit(tester, data)
|
|
for _, role := range []string{"transit-partial", "greatest", "c1-isochrone", "c4-isochrone"} {
|
|
if roles[role] != 1 {
|
|
tester.Fatalf("missing %s: %v", role, roles)
|
|
}
|
|
}
|
|
for _, role := range []string{"c1-horizon", "c4-horizon", "visible-at-c1", "visible-at-c4", "c2-isochrone", "c3-isochrone", "transit-entire"} {
|
|
if roles[role] != 0 {
|
|
tester.Fatalf("fabricated %s", role)
|
|
}
|
|
}
|
|
for _, item := range collection.Features {
|
|
if item.Properties["role"] != "transit-partial" {
|
|
continue
|
|
}
|
|
var polygons [][][][]float64
|
|
if err := json.Unmarshal(item.Geometry.Coordinates, &polygons); err != nil {
|
|
tester.Fatal(err)
|
|
}
|
|
if !geoJSONMultiPolygonContains(polygons, -135, -60) || geoJSONMultiPolygonContains(polygons, 0, 45) {
|
|
tester.Fatal("partial-transit footprint does not match the topocentric geometry")
|
|
}
|
|
if item.Properties["has_geocentric_contacts"] != false || item.Properties["series"] != float64(4) || item.Properties["gamma"] == nil {
|
|
tester.Fatalf("missing global-transit metadata: %v", item.Properties)
|
|
}
|
|
}
|
|
}
|