Files
astro/doc/manual/planets.md
T

873 lines
50 KiB
Markdown
Raw Permalink Normal View History

# 行星
[English](en/planets.md) | [返回 README](../../README.md)
七大行星各对应一个同名包:`mercury`、`venus`、`mars`、`jupiter`、`saturn`、`uranus`、`neptune`。它们的公开接口按同一套形状组织:以 `time.Time` 传入民用时刻,以 `float64` 返回角度或距离,事件搜索返回 `time.Time` 或结构体。内行星(水星、金星)额外提供上合/下合、大距与地心凌日;外行星(火星到海王星)额外提供冲日与方照;木星独有伽利略卫星,土星独有土星环参数。
低层的 VSOP87 级数与日月解析级数放在 `planet` 包,被这七个包与 `sun` / `moon` 共用。
- 七个包公共能力的函数名一致(例如都提供 `ApparentRa`、`ApparentDec` 与 `ApparentRaDec`),差异只体现在各自额外的那几族接口上;调用时必须带对应包名前缀,不能跨包混用。
- 位置接口给出的是**地心视位置**;站心量与地平坐标单独由 `Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` 提供,公式入口见[坐标工具](coord.md)。
- 事件搜索族都成对出现(`Last...` / `Next...`,部分另有 `Closest...`),一律取"当前或之前/之后最近一次"并包含端点。
- 行星本身没有独立的 SVG 出图入口;月掩相关出图(含土星环月掩)见[月掩手册](occultation.md#月掩出图)。
## 目录
- [火星的位置与升起时刻](#火星的位置与升起时刻)
- [API 参考](#api-参考)
- [按行星横向对照](#按行星横向对照)
- [通用能力与单位](#通用能力与单位)
- [`...N` 截断族](#n-截断族)
- [常用场景](#常用场景)
- [今晚能看到哪颗行星](#今晚能看到哪颗行星)
- [冲日、合日、大距、留与逆行](#冲日合日大距留与逆行)
- [水星与金星凌日](#水星与金星凌日)
- [相位、视直径、视星等与节点](#相位视直径视星等与节点)
- [物理星历与木星伽利略卫星](#物理星历与木星伽利略卫星)
- [与外部资料的对照口径](#与外部资料的对照口径)
- [基础示例](#基础示例)
- [内行星](#内行星)
- [外行星](#外行星)
- [分主题示例](#分主题示例)
- [位置与坐标](#位置与坐标)
- [升落与中天](#升落与中天)
- [合冲留与方照](#合冲留与方照)
- [大距与地心凌日](#大距与地心凌日)
- [节点、相位、视星等、视直径与视差角](#节点相位视星等视直径与视差角)
- [与其他手册的分工](#与其他手册的分工)
- [物理星历](#物理星历)
- [木星伽利略卫星](#木星伽利略卫星)
- [与 `planet` 包共用的类型与常量](#与-planet-包共用的类型与常量)
- [参数与返回值约定](#参数与返回值约定)
- [时标与民用时刻](#时标与民用时刻)
- [单位与口径](#单位与口径)
- [零值、越界与哨兵错误](#零值越界与哨兵错误)
- [站心与地心](#站心与地心)
- [精度与适用范围](#精度与适用范围)
## 火星的位置与升起时刻
```go
package main
import (
"fmt"
"log"
"time"
"b612.me/astro/mars"
)
func main() {
cst := time.FixedZone("CST", 8*3600)
date := time.Date(2020, 1, 1, 8, 8, 8, 0, cst)
lon, lat, height := 108.93, 34.27, 0.0
ra, dec := mars.ApparentRaDec(date)
fmt.Printf("RA=%.6f Dec=%.6f deg\n", ra, dec)
rise, err := mars.RiseTime(date, lon, lat, height, true)
if err != nil {
log.Fatal(err)
}
fmt.Println(rise.Format(time.RFC3339))
}
```
`ApparentRaDec` 返回地心视赤经、视赤纬,单位度。升落接口还需要观测地和椭球高;没有升起事件时返回错误。
## API 参考
### 按行星横向对照
下表按能力对照七个行星包。调用时加包名前缀,例如 `mars.NextOpposition`;`/` 分隔并列函数,`—` 表示该包没有对应接口。
| 能力 | `mercury` | `venus` | `mars` | `jupiter` | `saturn` | `uranus` | `neptune` |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 视黄经 / 视黄纬 | `ApparentLo` / `ApparentBo` | `ApparentLo` / `ApparentBo` | `ApparentLo` / `ApparentBo` | `ApparentLo` / `ApparentBo` | `ApparentLo` / `ApparentBo` | `ApparentLo` / `ApparentBo` | `ApparentLo` / `ApparentBo` |
| 视赤经 / 视赤纬 | `ApparentRa` / `ApparentDec` / `ApparentRaDec` | `ApparentRa` / `ApparentDec` / `ApparentRaDec` | `ApparentRa` / `ApparentDec` / `ApparentRaDec` | `ApparentRa` / `ApparentDec` / `ApparentRaDec` | `ApparentRa` / `ApparentDec` / `ApparentRaDec` | `ApparentRa` / `ApparentDec` / `ApparentRaDec` | `ApparentRa` / `ApparentDec` / `ApparentRaDec` |
| 视星等 | `ApparentMagnitude` | `ApparentMagnitude` | `ApparentMagnitude` | `ApparentMagnitude` | `ApparentMagnitude` | `ApparentMagnitude` | `ApparentMagnitude` |
| 地心距 / 日心距 | `EarthDistance` / `SunDistance` | `EarthDistance` / `SunDistance` | `EarthDistance` / `SunDistance` | `EarthDistance` / `SunDistance` | `EarthDistance` / `SunDistance` | `EarthDistance` / `SunDistance` | `EarthDistance` / `SunDistance` |
| 轨道升交点 / 降交点 | `AscendingNode` / `DescendingNode` | `AscendingNode` / `DescendingNode` | `AscendingNode` / `DescendingNode` | `AscendingNode` / `DescendingNode` | `AscendingNode` / `DescendingNode` | `AscendingNode` / `DescendingNode` | `AscendingNode` / `DescendingNode` |
| 视直径 / 视半径 | `Diameter` / `Semidiameter` | `Diameter` / `Semidiameter` | `Diameter` / `Semidiameter` | `Diameter` / `Semidiameter` | `Diameter` / `Semidiameter` | `Diameter` / `Semidiameter` | `Diameter` / `Semidiameter` |
| 相位角 / 照亮比例 / 亮面位置角 | `PhaseAngle` / `Phase` / `IlluminatedFraction` / `BrightLimbPositionAngle` | `PhaseAngle` / `Phase` / `IlluminatedFraction` / `BrightLimbPositionAngle` | `PhaseAngle` / `Phase` / `IlluminatedFraction` / `BrightLimbPositionAngle` | `PhaseAngle` / `Phase` / `IlluminatedFraction` / `BrightLimbPositionAngle` | `PhaseAngle` / `Phase` / `IlluminatedFraction` / `BrightLimbPositionAngle` | `PhaseAngle` / `Phase` / `IlluminatedFraction` / `BrightLimbPositionAngle` | `PhaseAngle` / `Phase` / `IlluminatedFraction` / `BrightLimbPositionAngle` |
| 站心地平量 | `Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` | `Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` | `Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` | `Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` | `Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` | `Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` | `Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` |
| 升 / 落 / 中天 | `RiseTime` / `SetTime` / `DownTime` / `CulminationTime` | `RiseTime` / `SetTime` / `DownTime` / `CulminationTime` | `RiseTime` / `SetTime` / `DownTime` / `CulminationTime` | `RiseTime` / `SetTime` / `DownTime` / `CulminationTime` | `RiseTime` / `SetTime` / `DownTime` / `CulminationTime` | `RiseTime` / `SetTime` / `DownTime` / `CulminationTime` | `RiseTime` / `SetTime` / `DownTime` / `CulminationTime` |
| 物理星历 | `Physical` / `PhysicalN` | `Physical` / `PhysicalN` | `Physical` / `PhysicalN` | `Physical` / `PhysicalN` / `CentralMeridians` / `CentralMeridiansN` | `Physical` / `PhysicalN` / `PhysicalSystemIII` / `Ring` | `Physical` / `PhysicalN` / `PhysicalSystemIII` | `Physical` / `PhysicalN` |
| 合日 | `LastConjunction` / `NextConjunction` | `LastConjunction` / `NextConjunction` | `LastConjunction` / `NextConjunction` | `LastConjunction` / `NextConjunction` | `LastConjunction` / `NextConjunction` | `LastConjunction` / `NextConjunction` | `LastConjunction` / `NextConjunction` |
| 上合 / 下合 | `LastSuperiorConjunction` / `NextSuperiorConjunction` / `LastInferiorConjunction` / `NextInferiorConjunction` | `LastSuperiorConjunction` / `NextSuperiorConjunction` / `LastInferiorConjunction` / `NextInferiorConjunction` | — | — | — | — | — |
| 留 | `LastProgradeToRetrograde` / `NextProgradeToRetrograde` / `LastRetrogradeToPrograde` / `NextRetrogradeToPrograde`,另有 `LastRetrograde` / `NextRetrograde` | `LastProgradeToRetrograde` / `NextProgradeToRetrograde` / `LastRetrogradeToPrograde` / `NextRetrogradeToPrograde`,另有 `LastRetrograde` / `NextRetrograde` | `LastProgradeToRetrograde` / `NextProgradeToRetrograde` / `LastRetrogradeToPrograde` / `NextRetrogradeToPrograde` | `LastProgradeToRetrograde` / `NextProgradeToRetrograde` / `LastRetrogradeToPrograde` / `NextRetrogradeToPrograde` | `LastProgradeToRetrograde` / `NextProgradeToRetrograde` / `LastRetrogradeToPrograde` / `NextRetrogradeToPrograde` | `LastProgradeToRetrograde` / `NextProgradeToRetrograde` / `LastRetrogradeToPrograde` / `NextRetrogradeToPrograde` | `LastProgradeToRetrograde` / `NextProgradeToRetrograde` / `LastRetrogradeToPrograde` / `NextRetrogradeToPrograde` |
| 冲日 | — | — | `LastOpposition` / `NextOpposition` | `LastOpposition` / `NextOpposition` | `LastOpposition` / `NextOpposition` | `LastOpposition` / `NextOpposition` | `LastOpposition` / `NextOpposition` |
| 方照 | — | — | `LastEasternQuadrature` / `NextEasternQuadrature` / `LastWesternQuadrature` / `NextWesternQuadrature` | `LastEasternQuadrature` / `NextEasternQuadrature` / `LastWesternQuadrature` / `NextWesternQuadrature` | `LastEasternQuadrature` / `NextEasternQuadrature` / `LastWesternQuadrature` / `NextWesternQuadrature` | `LastEasternQuadrature` / `NextEasternQuadrature` / `LastWesternQuadrature` / `NextWesternQuadrature` | `LastEasternQuadrature` / `NextEasternQuadrature` / `LastWesternQuadrature` / `NextWesternQuadrature` |
| 大距 | `LastGreatestElongation` / `NextGreatestElongation` / `LastGreatestElongationEast` / `NextGreatestElongationEast` / `LastGreatestElongationWest` / `NextGreatestElongationWest` | `LastGreatestElongation` / `NextGreatestElongation` / `LastGreatestElongationEast` / `NextGreatestElongationEast` / `LastGreatestElongationWest` / `NextGreatestElongationWest` | — | — | — | — | — |
| 地心凌日 | `LastTransit` / `NextTransit` / `ClosestTransit` | `LastTransit` / `NextTransit` / `ClosestTransit` | — | — | — | — | — |
| 伽利略卫星 | — | — | — | `Satellites` / `SatellitePhenomena` / `LastGalileanPhenomenonEvent` / `NextGalileanPhenomenonEvent` / `ClosestGalileanPhenomenonEvent` / `LastGalileanPhenomenonContactEvent` / `NextGalileanPhenomenonContactEvent` / `ClosestGalileanPhenomenonContactEvent` | — | — | — |
| 结果类型 | `PhysicalInfo` / `TransitInfo` | `PhysicalInfo` / `TransitInfo` | `PhysicalInfo` | `PhysicalInfo` / `CentralMeridianInfo` / `GalileanSatellitesInfo` / `GalileanPhenomenaInfo` / `GalileanSatellitePosition` / `GalileanSatellitePhenomenon` / `GalileanPhenomenonEvent` / `GalileanPhenomenonContactEvent` | `PhysicalInfo` / `RingInfo` | `PhysicalInfo` | `PhysicalInfo` |
七个包的**截断族**都叫同样的名字:给任意一个瞬时求值接口加 `N` 后缀即可,`n < 0` 用全部内置项、`n >= 0` 截断,详见 [`...N` 截断族](#n-截断族)。事件搜索族(`Last...` / `Next...` / `Closest...`)没有 `N` 版本。
### 通用能力与单位
| 能力 | 用途 | 单位与口径 |
| --- | --- | --- |
| `ApparentLo` / `ApparentBo` | 地心视黄经、视黄纬 | 度;当日真春分点,含光行时、光行差与章动 |
| `ApparentRa` / `ApparentDec` / `ApparentRaDec` | 地心视赤经、视赤纬 | 度;当日真赤道;`ApparentRaDec` 一次返回两者 |
| `ApparentMagnitude` | 视星等 | 星等(无量纲) |
| `Altitude` / `Azimuth` / `Zenith` / `HourAngle` | 站心地平坐标 | 度;方位角自正北向东增加,`Zenith` 等于 `90 - Altitude` |
| `RiseTime` / `SetTime` / `DownTime` | 当地民用日内的升起、落下 | `time.Time`,保持输入时区;`DownTime` 是 `SetTime` 的兼容别名 |
| `CulminationTime` | 上中天时刻 | `time.Time`,保持输入时区 |
| `ParallacticAngle` | 视差角(天顶方向角) | 度 |
| `Diameter` / `Semidiameter` | 地心视直径、视半径 | 角秒 |
| `PhaseAngle` | 太阳–行星–地球夹角 | 度 |
| `IlluminatedFraction` / `Phase` | 被照亮比例 | `0–1`;`Phase` 是 `IlluminatedFraction` 的别名 |
| `BrightLimbPositionAngle` | 亮面中心位置角 | 度 |
| `EarthDistance` / `SunDistance` | 地心距、日心距 | AU |
| `AscendingNode` / `DescendingNode` | 轨道面与黄道面交点的黄经 | 度;同一时刻两者相差约 `180°` |
| `Physical` | 盘面朝向、子地/子日经纬度、北极位置角 | 度;经度正方向按各天体 IAU 约定 |
| `planet.WherePlanet` / `planet.WherePlanetN` | VSOP87 黄经、黄纬、日心距 | 度 / AU;越界返回 `NaN` 而不 panic |
### `...N` 截断族
每个瞬时求值接口都有 `...N` 后缀版本,用来在精度与开销之间取舍:`n < 0` 使用全部内置项,与非 `N` 接口等价;`n >= 0` 时按约 `n` 个主项截断并等比缩短高阶项。事件搜索族(`Last...` / `Next...` / `Closest...`)没有 `N` 版本。
带 `N` 的族包括 `ApparentLoN`、`ApparentBoN`、`ApparentRaN`、`ApparentDecN`、`ApparentRaDecN`、`ApparentMagnitudeN`、`EarthDistanceN`、`SunDistanceN`、`AltitudeN`、`AzimuthN`、`ZenithN`、`HourAngleN`、`CulminationTimeN`、`RiseTimeN`、`SetTimeN`、`DownTimeN`、`ParallacticAngleN`、`DiameterN`、`SemidiameterN`、`PhaseAngleN`、`PhaseN`、`IlluminatedFractionN`、`BrightLimbPositionAngleN`、`AscendingNodeN`、`DescendingNodeN`、`PhysicalN`,以及木星的 `CentralMeridiansN`、土星的 `RingN` 与 `PhysicalSystemIIIN`、天王星的 `PhysicalSystemIIIN`。
```go
fmt.Println(mars.ApparentLo(date), mars.ApparentLoN(date, 8)) // 视黄经:全部内置项 / 截断到约 8 项
fmt.Println(mars.SunDistance(date), mars.SunDistanceN(date, 8)) // 日心距,AU
```
## 常用场景
### 今晚能看到哪颗行星
```go
fmt.Println(venus.RiseTime(date, lon, lat, height, true)) // 金星当日升起
fmt.Println(jupiter.CulminationTime(date, lon)) // 木星上中天
fmt.Println(mars.Altitude(date, lon, lat), mars.Azimuth(date, lon, lat)) // 火星此刻高度与方位
```
```text
2020-01-01 10:02:34.350145161 +0800 CST <nil>
2020-01-01 12:32:17.585815787 +0800 CST
31.194578177219057 152.07031660415714
```
`Altitude` 大于 `0` 才在地平线上,方位角自正北向东增加;`aero = true` 按标准大气折射把几何地平线降到约 `-0.5667°`,逐参数口径与极区哨兵错误见[升落与中天](#升落与中天)。
### 冲日、合日、大距、留与逆行
```go
fmt.Println(mars.NextOpposition(date)) // 火星下次冲日
fmt.Println(jupiter.NextConjunction(date)) // 木星下次合日
fmt.Println(saturn.NextProgradeToRetrograde(date)) // 土星下次顺转逆的留
```
```text
2020-10-14 07:25:50.441412627 +0800 CST
2021-01-29 09:39:33.697994649 +0800 CST
2020-05-11 17:26:53.961271941 +0800 CST
```
事件搜索取"当前或之后最近一次"并保持输入时区,成对的 `Last...` 与不区分方向的 `NextRetrograde` 见[合冲留与方照](#合冲留与方照);水星、金星的 `NextGreatestElongationEast` / `...West` 见[大距与地心凌日](#大距与地心凌日)。
### 水星与金星凌日
```go
transit := mercury.NextTransit(date) // 2020 年之后下一场地心水星凌日
fmt.Println(transit.Valid, transit.Start, transit.Greatest) // 是否有凌日、一触与凌甚
fmt.Println(transit.Duration, transit.MinimumSeparationArcsec) // 历时与凌甚最小角距
```
```text
true 2032-11-13 14:41:13.161198198 +0800 CST 2032-11-13 16:54:12.821315824 +0800 CST
4h26m2.695272267s 572.0643215495325
```
`TransitInfo.Valid` 为假表示搜索窗口内没有凌日、其余字段是零值;凌日只判断地心几何,不判断观测地当时太阳是否在地平线上。四触、偏凌与内切口径见[大距与地心凌日](#大距与地心凌日)。
### 相位、视直径、视星等与节点
```go
fmt.Println(venus.PhaseAngle(date), venus.Phase(date)) // 相位角(度)与被照亮比例
fmt.Println(venus.Diameter(date), venus.ApparentMagnitude(date)) // 视直径(角秒)与视星等
fmt.Println(mars.AscendingNode(date), mars.DescendingNode(date)) // 升降交点黄经(度)
```
```text
49.98145049145023 0.8215177914415865
13.059409604614839 -4
49.71479005849112 229.71479005849113
```
`Phase` 是 `IlluminatedFraction` 的别名,取值 `0–1`;升降交点同一时刻相差约 `180°`。各量的定义、别名与截断版见[节点、相位、视星等、视直径与视差角](#节点相位视星等视直径与视差角)。
### 物理星历与木星伽利略卫星
```go
j := jupiter.Physical(date) // 木星物理星历
fmt.Println(j.DS, j.DE, j.CentralMeridianSystemIII) // 子日/子地赤纬与 System III 中央经线
sats := jupiter.Satellites(date) // 四颗伽利略卫星的瞬时位置
fmt.Println(sats.Io.OffsetXJupiterR, sats.Io.InFrontOfJupiter) // 木卫一偏移与是否在盘面前方
```
```text
-56.55778470155335 -2.039966127259664 311.37430665615585
3.8223302102343975 false
```
土星环另有 `saturn.Ring`(`EarthLatitude`、`MinorAxis` 等,角度单位度、长短轴单位角秒);盘面朝向与中央经线的完整口径见[物理星历](#物理星历),伽利略卫星的公开入口在 `jupiter` 包,`basic` 的 `JupiterGalilean*` 是接收儒略日的低层入口,见[木星伽利略卫星](#木星伽利略卫星)。
### 与外部资料的对照口径
```go
fmt.Println(mars.ApparentLo(date), mars.ApparentLoN(date, 8)) // 全部内置项 / 约 8 项截断的视黄经
_, err := mars.RiseTime(date, 0, 89, 0, true) // 极区观测点
fmt.Println(errors.Is(err, mars.ERR_MARS_NEVER_RISE), errors.Is(err, mars.ERR_MARS_NEVER_SET))
```
```text
238.38840227925655 238.39637464888327
true false
```
`ApparentLo` 等是**当日真春分点**的地心视位置,与外部 J2000 或平位置对表前先用 `coord.Precess` 归算;截断族 `n < 0` 用全部内置项、`n >= 0` 截断。伽利略卫星接触事件与 JPL Horizons / IMCCE 年表的口径差异见[与外部资料对照](#与外部资料对照),整体边界见[参数与返回值约定](#参数与返回值约定)。
## 基础示例
下面两段是最小可运行示例,沿用 `date = 2020-01-01 08:08:08 CST` 与西安市坐标。
### 内行星
```go
package main
import (
"b612.me/astro/mercury"
"b612.me/astro/venus"
"fmt"
"time"
)
func main() {
// 以陕西省西安市为例,设置西安市经纬度,设置地平高度为0米
var lon, lat, height float64 = 108.93, 34.27, 0
cst := time.FixedZone("CST", 8*3600)
// 指定观测时刻。
date := time.Date(2020, 1, 1, 8, 8, 8, 8, cst)
//水星上次下合时间
fmt.Println(mercury.LastInferiorConjunction(date))
//金星下次上合时间
fmt.Println(venus.NextSuperiorConjunction(date))
//水星上次留(顺转逆)时间(水逆)
fmt.Println(mercury.LastProgradeToRetrograde(date))
//金星下次留(逆转顺)时间
fmt.Println(venus.NextRetrogradeToPrograde(date))
//水星上次东大距时间
fmt.Println(mercury.LastGreatestElongationEast(date))
//金星下次西大距时间
fmt.Println(venus.NextGreatestElongationWest(date))
//西安市今日金星升起,降落时间
fmt.Println(venus.RiseTime(date, lon, lat, height, true))
fmt.Println(venus.SetTime(date, lon, lat, height, true))
//金星当前视星等
fmt.Println(venus.ApparentMagnitude(date))
//金星相位角、被照亮比例、亮面中心位置角
fmt.Println(venus.PhaseAngle(date))
fmt.Println(venus.Phase(date))
fmt.Println(venus.BrightLimbPositionAngle(date))
//金地距离
fmt.Println(venus.EarthDistance(date))
//金日距离
fmt.Println(venus.SunDistance(date))
}
```
输出结果:
```
2019-11-11 23:21:41.971051096 +0800 CST // 水星上次下合
2021-03-26 14:57:42.052354216 +0800 CST // 金星下次上合
2019-11-01 04:31:49.749019145 +0800 CST // 水星上次由顺行转逆行的留
2020-06-25 02:07:41.599749326 +0800 CST // 金星下次由逆行转顺行的留
2019-10-20 12:01:37.740152478 +0800 CST // 水星上次东大距
2020-08-13 08:14:46.304587125 +0800 CST // 金星下次西大距
2020-01-01 10:02:34.172435402 +0800 CST <nil> // 西安当天金星升起时刻;无错误
2020-01-01 20:25:37.36411482 +0800 CST <nil> // 西安当天金星落下时刻;无错误
-4 // 金星视星等
49.98145049145023 // 金星相位角,单位度
0.8215177914415865 // 金星被照亮比例
255.63802053541346 // 金星亮面中心位置角,单位度
1.2778819631550336 // 金地距离,单位 AU
0.7262651056423838 // 金日距离,单位 AU
```
内外行星同样提供 `Diameter` / `Semidiameter`(以及 `N` 版),返回地心视直径/视半径,单位为角秒。
行星视直径或轨道节点也可以单独查询:
```go
fmt.Println(mars.Diameter(date), mars.Semidiameter(date))
fmt.Println(venus.AscendingNode(date), venus.DescendingNode(date))
```
这里的“升交点 / 降交点”指天体轨道面与黄道面的两个交点:
- `AscendingNode`:天体从黄道南侧穿到黄道北侧时对应的黄经
- `DescendingNode`:天体从黄道北侧穿到黄道南侧时对应的黄经
- 返回值单位都是度;对同一时刻而言,降交点通常与升交点相差约 `180°`
以上面 `date := 2020-01-01 08:08:08 CST` 的示例来说,输出结果是:
```text
4.287299886569956 2.143649943284978 // 火星视直径、视半径,单位角秒
76.86008484515058 256.8600848451506 // 金星升交点、降交点黄经,单位度
```
水星和金星还提供 `NextTransit` / `LastTransit` / `ClosestTransit` 地心凌日查询。这里的“地心”指从地球中心看到的行星圆面经过太阳圆面,不判断某个地点当时太阳是否在地平线上;如果要做观测计划,还需要结合本地太阳高度角和天气条件。
```go
package main
import (
"fmt"
"time"
"b612.me/astro/mercury"
"b612.me/astro/venus"
)
func main() {
// 查询 2019 年之后下一次地心水星凌日。
mercuryTransit := mercury.NextTransit(time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC))
fmt.Println(mercuryTransit.Valid)
fmt.Println(mercuryTransit.Start)
fmt.Println(mercuryTransit.InternalStart)
fmt.Println(mercuryTransit.Greatest)
fmt.Println(mercuryTransit.InternalEnd)
fmt.Println(mercuryTransit.End)
fmt.Println(mercuryTransit.Duration)
fmt.Println(mercuryTransit.MinimumSeparationArcsec)
fmt.Println(mercuryTransit.SunSemidiameterArcsec)
fmt.Println(mercuryTransit.PlanetSemidiameterArcsec)
// 查询 2012 年之后下一次地心金星凌日。
venusTransit := venus.NextTransit(time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC))
fmt.Println(venusTransit.Valid)
fmt.Println(venusTransit.Start)
fmt.Println(venusTransit.InternalStart)
fmt.Println(venusTransit.Greatest)
fmt.Println(venusTransit.InternalEnd)
fmt.Println(venusTransit.End)
fmt.Println(venusTransit.Duration)
}
```
输出结果:
```text
true // 找到一次有效的地心水星凌日
2019-11-11 12:35:31.567597389 +0000 UTC // 一触:水星外切进入太阳圆面
2019-11-11 12:37:12.817581295 +0000 UTC // 二触:水星完全进入太阳圆面
2019-11-11 15:19:48.36056292 +0000 UTC // 凌甚:水星中心最接近太阳中心
2019-11-11 18:02:29.176982045 +0000 UTC // 三触:水星开始离开太阳圆面
2019-11-11 18:04:10.637948513 +0000 UTC // 四触:水星外切离开太阳圆面
5h28m39.070351124s // 一触到四触的地心凌日持续时间
75.92400059923187 // 凌甚时水星中心与太阳中心的最小角距离,单位角秒
968.8881519533047 // 凌甚时太阳视半径,单位角秒
4.978442871670873 // 凌甚时水星视半径,单位角秒
true // 找到一次有效的地心金星凌日
2012-06-05 22:09:47.466886639 +0000 UTC // 一触:金星外切进入太阳圆面
2012-06-05 22:27:35.865356326 +0000 UTC // 二触:金星完全进入太阳圆面
2012-06-06 01:29:35.572371482 +0000 UTC // 凌甚:金星中心最接近太阳中心
2012-06-06 04:31:35.068444311 +0000 UTC // 三触:金星开始离开太阳圆面
2012-06-06 04:49:23.25597167 +0000 UTC // 四触:金星外切离开太阳圆面
6h39m35.789085031s // 一触到四触的地心凌日持续时间
```
### 外行星
```go
package main
import (
"b612.me/astro/jupiter"
"b612.me/astro/mars"
"b612.me/astro/neptune"
"b612.me/astro/saturn"
"b612.me/astro/uranus"
"fmt"
"time"
)
func main() {
// 以陕西省西安市为例,设置西安市经纬度,设置地平高度为0米
var lon, lat, height float64 = 108.93, 34.27, 0
cst := time.FixedZone("CST", 8*3600)
// 指定观测时刻。
date := time.Date(2020, 1, 1, 8, 8, 8, 8, cst)
//火星下次冲日时间
fmt.Println(mars.NextOpposition(date))
//木星下次合日时间
fmt.Println(jupiter.NextConjunction(date))
//土星上次留(顺转逆)时间(土逆)
fmt.Println(saturn.LastProgradeToRetrograde(date))
//土星环观测参数
ring := saturn.Ring(date)
fmt.Printf("saturn B=%.6f Bp=%.6f P=%.6f dU=%.6f major=%.6f minor=%.6f\n",
ring.EarthLatitude,
ring.SunLatitude,
ring.PositionAngle,
ring.DeltaU,
ring.MajorAxis,
ring.MinorAxis,
)
//天王星下次留(逆转顺)时间
fmt.Println(uranus.NextRetrogradeToPrograde(date))
//海王星上次东方照时间
fmt.Println(neptune.LastEasternQuadrature(date))
//火星下次西方照时间
fmt.Println(mars.NextWesternQuadrature(date))
//西安市今日火星升起,降落时间
fmt.Println(mars.RiseTime(date, lon, lat, height, true))
fmt.Println(mars.SetTime(date, lon, lat, height, true))
//火星当前视星等
fmt.Println(mars.ApparentMagnitude(date))
//地火距离
fmt.Println(mars.EarthDistance(date))
//日火距离
fmt.Println(mars.SunDistance(date))
}
```
输出结果:
```
2020-10-14 07:25:50.441412627 +0800 CST // 火星下次冲日
2021-01-29 09:39:33.697994649 +0800 CST // 木星下次合日
2019-04-30 10:28:00.187439918 +0800 CST // 土星上次由顺行转逆行的留
saturn B=23.577025 Bp=23.266930 P=6.629811 dU=1.171016 major=34.133852 minor=13.652911 // 土星环 B、B'、P、dU、长轴、短轴
2020-01-11 15:23:23.360308706 +0800 CST // 天王星下次由逆行转顺行的留
2019-12-08 17:00:15.517960488 +0800 CST // 海王星上次东方照
2020-06-07 03:11:00.026179254 +0800 CST // 火星下次西方照
2020-01-01 04:41:29.621566236 +0800 CST <nil> // 西安当天火星升起时刻;无错误
2020-01-01 14:55:32.963508367 +0800 CST <nil> // 西安当天火星落下时刻;无错误
1.57 // 火星视星等
2.1844284956325937 // 地火距离,单位 AU
1.5897860004265403 // 日火距离,单位 AU
```
`saturn.Ring` 返回 `RingInfo`:`EarthLatitude` 是土星环张角 B,`SunLatitude` 是 B',`PositionAngle` 是北半短轴位置角,`DeltaU` 是太阳与地球在环面内的土星心黄经差,`MajorAxis` / `MinorAxis` 是土星环外缘长短轴,单位为角秒。
## 分主题示例
下面按主题给出短片段,每段都接得上本手册的公共变量 `date`、`lon`、`lat`、`height`;完整可运行版本见前面的基础示例。
### 位置与坐标
`ApparentLo` / `ApparentBo` / `ApparentRa` / `ApparentDec` / `ApparentRaDec` 给的是**地心视位置**:几何地心位置经光行时、光行差与章动改正,再换算到当日真赤道与真春分点。这些包不提供 J2000 或平位置输出;要对 J2000 口径时,用 `coord.Precess` 做岁差归算、用 `coord.Nutation2000B` 处理章动,站心量用 `coord.TopocentricEquatorial` 与 `coord.EquatorialToHorizontal`,详见[坐标工具](coord.md)。
```go
// 当日视位置:视黄经/视黄纬与视赤经/视赤纬,单位度。
lo, bo := venus.ApparentLo(date), venus.ApparentBo(date)
ra, dec := venus.ApparentRaDec(date)
fmt.Println(lo, bo, venus.ApparentRa(date), venus.ApparentDec(date), ra, dec)
// 地心距与日心距,单位 AU。
fmt.Println(venus.EarthDistance(date), venus.SunDistance(date))
```
### 升落与中天
`RiseTime` / `SetTime` / `DownTime` 按**当地民用日**搜索:`date` 用于确定当地日期与输出时区(当地小时数大于 12 时内部先回退 12 小时),`height` 是椭球高(米),`aero` 为 `true` 时加入标准大气折射(几何地平线降到约 `-0.5667°`)。极昼、极夜或当天没有过零时返回[哨兵错误](#参数与返回值约定)而不是时刻。`CulminationTime` 给上中天;`Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` 是站心瞬时量族,几何公式见[坐标工具](coord.md)。
```go
// 西安市当地民用日内的升起、落下与中天;aero=true 含标准大气折射。
rise, err := mars.RiseTime(date, lon, lat, height, true)
set, err := mars.SetTime(date, lon, lat, height, true)
fmt.Println(rise, set, err)
fmt.Println(mars.CulminationTime(date, lon))
```
```go
// 站心地平量:经度东正西负、纬度北正南负,返回值单位度。
fmt.Println(mars.Altitude(date, lon, lat), mars.Azimuth(date, lon, lat))
fmt.Println(mars.Zenith(date, lon, lat), mars.HourAngle(date, lon))
fmt.Println(mars.ParallacticAngle(date, lon, lat))
```
```go
// DownTime 是 SetTime 的兼容别名;N 版按截断项求值。
set, err := mars.DownTime(date, lon, lat, height, true)
fmt.Println(set, err)
fmt.Println(mars.CulminationTimeN(date, lon, 12))
```
### 合冲留与方照
事件搜索一律取"当前或之前/之后最近一次"(含端点),返回时区与输入一致。内行星有 `LastConjunction` / `NextConjunction` 与上合下合族;外行星有 `LastConjunction` / `NextConjunction`、`LastOpposition` / `NextOpposition` 与东西方照族。
留分两个方向:`LastProgradeToRetrograde` / `NextProgradeToRetrograde`(顺转逆)与 `LastRetrogradeToPrograde` / `NextRetrogradeToPrograde`(逆转顺);水星、金星另有不区分方向的 `LastRetrograde` / `NextRetrograde`,外行星没有这两个名字。
合日对内行星是太阳同侧,对外行星还额外分冲日与方照:只有地球轨道之外的这五颗行星会出现冲日(太阳–地球–行星成一线)与东西方照(行星与太阳黄经相差约 90°),水星和金星在地球轨道以内,所以这两族接口只出现在外行星包里。
```go
// 内行星:上合/下合,以及不区分方向的留。
fmt.Println(mercury.LastSuperiorConjunction(date), mercury.NextInferiorConjunction(date))
fmt.Println(mercury.LastRetrograde(date), mercury.NextRetrograde(date))
```
```go
// 外行星:合日、冲日与东西方照。
fmt.Println(jupiter.NextConjunction(date), mars.NextOpposition(date))
fmt.Println(mars.NextEasternQuadrature(date), neptune.LastWesternQuadrature(date))
```
```go
// 留的两个方向分别有 Last/Next 两版。
fmt.Println(saturn.LastProgradeToRetrograde(date), saturn.NextProgradeToRetrograde(date))
fmt.Println(saturn.LastRetrogradeToPrograde(date), saturn.NextRetrogradeToPrograde(date))
```
### 大距与地心凌日
大距只对水星、金星有意义:`LastGreatestElongation` / `NextGreatestElongation` 不区分东西,`LastGreatestElongationEast` / `NextGreatestElongationEast` 与 `...West` 区分。
地心凌日的公开入口同样只在 `mercury` / `venus`:`LastTransit` / `NextTransit` / `ClosestTransit` 返回 `TransitInfo`。`Valid` 为假表示搜索窗口内没有凌日,其余字段都是零值;偏凌日没有内切,此时 `HasInternal` 为假、`InternalStart` / `InternalEnd` 是零值。凌日只判断地心几何,不判断某地当时太阳是否在地平线上。
```go
// 大距:区分东西用 ...East / ...West,不区分时用 NextGreatestElongation。
fmt.Println(mercury.NextGreatestElongationEast(date), venus.LastGreatestElongationWest(date))
fmt.Println(venus.NextGreatestElongation(date))
```
```go
// 地心凌日:Valid 为假时其余字段为零值。
transit := mercury.NextTransit(date)
if transit.Valid {
fmt.Println(transit.Start, transit.InternalStart, transit.Greatest, transit.InternalEnd, transit.End)
fmt.Println(transit.Duration, transit.MinimumSeparationArcsec, transit.SunSemidiameterArcsec)
}
```
```go
// 凌日结果的其余字段;无内切时 InternalDuration 为 0。
transit := venus.ClosestTransit(date)
fmt.Println(transit.HasInternal, transit.InternalDuration, transit.MinimumSeparationArcsec)
fmt.Println(transit.SunSemidiameterArcsec, transit.PlanetSemidiameterArcsec)
```
### 节点、相位、视星等、视直径与视差角
`AscendingNode` / `DescendingNode` 是行星轨道面与黄道面两个交点的黄经,单位度,同一时刻两者相差约 `180°`。`PhaseAngle` 是太阳–行星–地球夹角(度);`IlluminatedFraction`(别名 `Phase`)是 `0–1` 的被照亮比例;`BrightLimbPositionAngle` 是亮面中心位置角(度)。`Diameter` / `Semidiameter` 返回地心视直径/视半径,单位角秒。
`ParallacticAngle` 返回站心视差角(天顶方向角,度),站心坐标入口见[坐标工具](coord.md)。
```go
fmt.Println(mars.AscendingNode(date), mars.DescendingNode(date)) // 升降交点黄经,度
fmt.Println(mars.PhaseAngle(date), mars.IlluminatedFraction(date), mars.Phase(date)) // 相位角,度;照亮比例
fmt.Println(mars.ApparentMagnitude(date), mars.BrightLimbPositionAngle(date)) // 视星等、亮面位置角
```
```go
fmt.Println(mars.Diameter(date), mars.Semidiameter(date)) // 视直径、视半径,单位角秒
fmt.Println(mars.ParallacticAngle(date, lon, lat)) // 视差角,度
```
```go
// 交点与视直径同样有截断版。
fmt.Println(mars.AscendingNodeN(date, 12), mars.DescendingNodeN(date, 12))
fmt.Println(mars.DiameterN(date, 12), mars.SemidiameterN(date, 12))
```
### 与其他手册的分工
- 恒星时、岁差章动、站心与地平坐标换算见[坐标工具](coord.md)。
- 太阳与月亮的位置、月相、月出月落、朔望弦见[日月手册](sun-moon.md)。
- 行星月掩、掩带与月面视圆图见[月掩手册](occultation.md#月掩出图)。
- 小行星、彗星等按轨道根数计算的天体见[通用轨道](orbit.md)。
- 时标声明、UT1 口径与 GeoJSON 输出见[天象地图与 GeoJSON](map-geojson.md);时标本身的约定见[时标声明](map-geojson.md#时标声明)。
- 权威能力清单、依赖矩阵与精度汇总见根目录 [README](../../README.md)。
### 物理星历
七大行星都提供 `Physical` / `PhysicalN`,用于查看盘面朝向、子地/子日经纬度和北极位置角等物理观测参数。木星额外提供 System I/II/III 中央经线,土星额外提供土星环参数。
```go
package main
import (
"fmt"
"time"
"b612.me/astro/jupiter"
"b612.me/astro/saturn"
)
func main() {
date := time.Date(2025, 11, 1, 0, 0, 0, 0, time.UTC)
// 木星:DS/DE 分别是太阳、地球相对木星赤道的行星中心赤纬。
// CMI/CMII/CMIII 是木星 System I/II/III 中央经线,单位度。
j := jupiter.Physical(date)
fmt.Printf("jupiter DS=%.6f DE=%.6f CMI=%.6f CMII=%.6f CMIII=%.6f\n",
j.DS,
j.DE,
j.CentralMeridianSystemI,
j.CentralMeridianSystemII,
j.CentralMeridianSystemIII,
)
// 土星环:B/B' 是地球、太阳看到的环面纬度,P 是环面短轴位置角。
ring := saturn.Ring(date)
fmt.Printf("saturn B=%.6f Bp=%.6f P=%.6f major=%.6f minor=%.6f\n",
ring.EarthLatitude,
ring.SunLatitude,
ring.PositionAngle,
ring.MajorAxis,
ring.MinorAxis,
)
}
```
输出结果:
```text
jupiter DS=54.342153 DE=1.436485 CMI=292.712909 CMII=276.309048 CMIII=147.241811 // 木星子日/子地赤纬,System I/II/III 中央经线,单位度
saturn B=-0.608048 Bp=-2.675677 P=4.480276 major=42.709920 minor=0.453248 // 土星环 B、B'、短轴位置角、外缘长短轴,角度单位度,长短轴单位角秒
```
只需要中央经线时,可以单独调用 `CentralMeridians`:
```go
cm := jupiter.CentralMeridians(date)
fmt.Printf("CMI=%.6f CMII=%.6f CMIII=%.6f\n", cm.SystemI, cm.SystemII, cm.SystemIII) // 木星 System I/II/III 中央经线
```
土星和天王星则额外保留了显式的 `System III` 语义别名,便于按行星自转系统来写调用代码:
```go
sat3 := saturn.PhysicalSystemIII(date)
ura3 := uranus.PhysicalSystemIII(date)
fmt.Printf("saturn systemIII lon=%.6f lat=%.6f P=%.6f\n", sat3.SubEarthLongitude, sat3.SubEarthLatitude, sat3.NorthPolePositionAngle) // 土星子地经纬度与北极位置角
fmt.Printf("uranus systemIII lon=%.6f lat=%.6f P=%.6f\n", ura3.SubEarthLongitude, ura3.SubEarthLatitude, ura3.NorthPolePositionAngle) // 天王星子地经纬度与北极位置角
```
七个包的 `Physical` 都返回各自的 `PhysicalInfo`,字段与 `basic.PlanetPhysicalInfo` 一一对应;`SubEarthLongitude` / `SubSolarLongitude` 的正方向按各天体当前 IAU/Horizons 制图约定,水星、火星、木星、土星、海王星取西经为正,金星、天王星取东经为正。土星环参数只用于盘面与掩带表达,不参与月掩接触计算,出图见[月掩手册](occultation.md#月掩出图)。
```go
p := uranus.Physical(date) // 天王星子地/子日经纬度与北极位置角,单位度
fmt.Println(p.SubEarthLongitude, p.SubEarthLatitude, p.SubSolarLongitude, p.SubSolarLatitude, p.NorthPolePositionAngle)
```
```go
// 土星环与木星中央经线的截断版。
fmt.Println(saturn.RingN(date, 12).MinorAxis, jupiter.CentralMeridiansN(date, 12).SystemIII)
```
### 木星伽利略卫星
这组接口的公开入口在 **`jupiter` 包**(`jupiter.Satellites`、`jupiter.SatellitePhenomena`、`jupiter.NextGalileanPhenomenonEvent` 等),接收 `time.Time` 并返回 `jupiter` 自己的类型。
`basic` 里的 `JupiterGalilean*`(如 `basic.JupiterGalileanSatelliteObservations`、`basic.NextJupiterGalileanPhenomenonEvent`)是同一实现的低层入口,接收儒略日并返回 `basic` 类型;写应用时用 `jupiter` 这一层即可。
```go
// 入口在 jupiter 包;卫星编号用 jupiter.GalileanSatelliteIo 等常量。
sats := jupiter.Satellites(date)
fmt.Println(sats.Io.OffsetXJupiterR, sats.Io.OffsetYJupiterR, sats.Io.InFrontOfJupiter)
```
卫星编号与现象类型都有具名常量,不必手写数字或字符串:
- 卫星编号:`GalileanSatelliteIo`、`GalileanSatelliteEuropa`、`GalileanSatelliteGanymede`、`GalileanSatelliteCallisto`
- 现象类型(`GalileanPhenomenonType`):`GalileanPhenomenonTransit`、`GalileanPhenomenonOccultation`、`GalileanPhenomenonEclipse`、`GalileanPhenomenonShadowTransit`
- 接触阶段(`GalileanPhenomenonContactPhase`):`GalileanPhenomenonContactDisappearance`、`GalileanPhenomenonContactReappearance`
```go
// 卫星编号与现象类型都用常量,避免手写数字与字符串。
event := jupiter.NextGalileanPhenomenonEvent(date, jupiter.GalileanSatelliteCallisto, jupiter.GalileanPhenomenonShadowTransit)
fmt.Println(event.Type == jupiter.GalileanPhenomenonShadowTransit)
```
`jupiter` 包提供四颗伽利略卫星的视位置、瞬时现象和事件搜索。
常用接口:
- `Satellites`:四颗卫星相对木星盘面的瞬时视位置
- `SatellitePhenomena`:瞬时凌日、掩蔽、食、影凌状态
- `LastGalileanPhenomenonEvent` / `NextGalileanPhenomenonEvent` / `ClosestGalileanPhenomenonEvent`:搜索整场现象区间
- `LastGalileanPhenomenonContactEvent` / `NextGalileanPhenomenonContactEvent` / `ClosestGalileanPhenomenonContactEvent`:搜索 IMCCE 风格的 D/F 接触事件
两个口径的区别如下,以木卫一凌日为例:
- `GalileanPhenomenonEvent` 把卫星看作一个点,判断“卫星圆心是否进入/离开木星圆面”。它返回整段凌日的起止区间,适合快速搜索现象和程序内部状态判断。
- `GalileanPhenomenonContactEvent` 把卫星自身的有限圆盘考虑进去,区分初亏到复圆的完整接触过程。它返回消失阶段(D)和再现阶段(R)各自的接触起止与模型中心穿越时刻,适合和 IMCCE 年表中的 `TR.D/TR.F/OC.D/OC.F/EC.D/EC.F/SH.D/SH.F` 逐项对照。
两个口径的差异在持续时间上最多约 7 分钟,差异来自模型定义不同。用于观测预报或与公开年表逐项核对时,取 `GalileanPhenomenonContactEvent`。
#### 代码示例
```go
package main
import (
"fmt"
"time"
"b612.me/astro/jupiter"
)
func main() {
date := time.Date(2026, 1, 15, 0, 0, 0, 0, time.UTC)
// 四颗卫星相对木星中心的瞬时位置。
sats := jupiter.Satellites(date)
fmt.Printf("io x=%.6f y=%.6f front=%v\n", sats.Io.OffsetXJupiterR, sats.Io.OffsetYJupiterR, sats.Io.InFrontOfJupiter)
fmt.Printf("europa ra=%.6f dec=%.6f\n", sats.Europa.ApparentRA, sats.Europa.ApparentDec)
// 瞬时现象标志。
ph := jupiter.SatellitePhenomena(date)
fmt.Printf("io transit=%v occultation=%v eclipse=%v shadow=%v\n", ph.Io.Transit, ph.Io.Occultation, ph.Io.Eclipse, ph.Io.ShadowTransit)
fmt.Printf("europa transit=%v occultation=%v eclipse=%v shadow=%v\n", ph.Europa.Transit, ph.Europa.Occultation, ph.Europa.Eclipse, ph.Europa.ShadowTransit)
// 下一次木卫一凌日整场事件。
event := jupiter.NextGalileanPhenomenonEvent(date, jupiter.GalileanSatelliteIo, jupiter.GalileanPhenomenonTransit)
fmt.Printf("event valid=%v sat=%d type=%s\n", event.Valid, event.Satellite, event.Type)
fmt.Println(event.Start)
fmt.Println(event.Greatest)
fmt.Println(event.End)
fmt.Println(event.Duration)
// 下一次木卫二掩蔽的 IMCCE 风格接触窗口。
contact := jupiter.NextGalileanPhenomenonContactEvent(date, jupiter.GalileanSatelliteEuropa, jupiter.GalileanPhenomenonOccultation)
fmt.Printf("contact valid=%v sat=%d type=%s\n", contact.Valid, contact.Satellite, contact.Type)
fmt.Println(contact.Disappearance.Start)
fmt.Println(contact.Disappearance.ModelCrossing)
fmt.Println(contact.Disappearance.End)
fmt.Println(contact.Greatest)
fmt.Println(contact.Reappearance.Start)
fmt.Println(contact.Reappearance.ModelCrossing)
fmt.Println(contact.Reappearance.End)
}
```
输出结果:
```text
io x=-0.675026 y=-0.032798 front=true // 木卫一相对木星中心的 X/Y 偏移,单位木星半径;位于木星盘面前方
europa ra=110.769133 dec=22.335828 // 木卫二视赤经、视赤纬,单位度
io transit=true occultation=false eclipse=false shadow=true // 木卫一正在凌日,且影子正在凌日
europa transit=false occultation=false eclipse=false shadow=false // 木卫二此刻无凌日、掩蔽、木星食或影凌
event valid=true sat=1 type=transit // 下一次有效事件为木卫一凌日
2026-01-16 16:32:47.552742362 +0000 UTC // 木卫一凌日开始
2026-01-16 17:40:44.189371168 +0000 UTC // 木卫一凌日中点
2026-01-16 18:48:40.287077128 +0000 UTC // 木卫一凌日结束
2h15m52.734334766s // 木卫一凌日持续时间
contact valid=true sat=2 type=occultation // 下一次有效接触事件为木卫二掩蔽
2026-01-17 01:00:34.99533087 +0000 UTC // 木卫二掩蔽消失阶段开始
2026-01-17 01:02:31.714070141 +0000 UTC // 木卫二掩蔽消失阶段模型中心穿越
2026-01-17 01:04:28.432809412 +0000 UTC // 木卫二掩蔽消失阶段结束
2026-01-17 02:27:37.807798683 +0000 UTC // 木卫二掩蔽最深时刻
2026-01-17 03:50:48.120300471 +0000 UTC // 木卫二掩蔽再现阶段开始
2026-01-17 03:52:43.901527225 +0000 UTC // 木卫二掩蔽再现阶段模型中心穿越
2026-01-17 03:54:39.68275398 +0000 UTC // 木卫二掩蔽再现阶段结束
```
#### 与外部资料对照
木卫能力主要对照了两类外部基线:
- **JPL Horizons**:用于四颗卫星相对木星中心的视位置,以及影凌时影心相对木星盘面的偏移。
- **IMCCE 2026 年表**:用于凌日、掩蔽、木星食、影凌等事件和 D/F 接触窗口。
对照结果:
- `Satellites` 相对木星中心的位置,对 JPL Horizons 的样例最大偏差约为 `X=0.054"`、`Y=0.048"`。
- `SatellitePhenomena` 的影凌影心偏移,对 JPL Horizons 的样例最大偏差约为 `X=0.051"`、`Y=0.016"`,现象布尔标志在样例中一致。
- `GalileanPhenomenonContactEvent` 与 IMCCE 2026 年表的 D/F 接触时刻最大偏差约 `79 s`,接触持续时间最大偏差约 `17 s`。
- `GalileanPhenomenonEvent` 与 IMCCE 的 D/F 接触定义不同,起止时刻的差异可达约 `7` 分钟。
### 与 `planet` 包共用的类型与常量
`planet` 包是低层解析级数入口,被七个行星包与 `sun` / `moon` 共用。它只导出函数,**没有导出类型**,所以行星包之间真正共用的是同一套数值口径与截断语义,而不是共享类型:各包的 `PhysicalInfo` 是 `basic.PlanetPhysicalInfo` 的镜面结构,`TransitInfo` 是 `basic.PlanetTransitResult` 的镜面结构,字段一一对应,类型本身仍属于各自的包。
| 入口 | 作用 | 单位 |
| --- | --- | --- |
| `planet.WherePlanet` / `planet.WherePlanetN` | VSOP87 结果:`xt` 取 `1..7` 依次为水星到海王星、`-1` 或 `0` 为地球,`zn` 取 `0` 黄经、`1` 黄纬、`2` 日心距;`xt` / `zn` 越界返回 `NaN` 而不 panic | 度 / AU |
| `planet.Distance` | 日地距离 | AU |
| `planet.SunLo` / `planet.SunM` / `planet.SunMidFun` / `planet.SunTrueLo` / `planet.SunApparentLo` | 太阳几何黄经、平近点角、中心差、真黄经、视黄经 | 度 |
| `planet.Earthe` / `planet.EarthPI` | 地球轨道偏心率、地球近日点黄经 | 无量纲 / 度 |
| `planet.MoonLo` / `planet.MoonM` / `planet.MoonLonX` / `planet.SunMoonAngle` | 月球平黄经、平近点角、到升交点的平角距、日月距角 | 度 |
| `planet.MoonI` / `planet.MoonB` / `planet.MoonR` | 月球黄经、黄纬、距离周期项(ELP2000/82 风格截断级数) | `10⁻⁶` 度 / `10⁻⁶` 度 / `10⁻³ km` |
| `planet.MoonTrueLo` / `planet.MoonTrueBo` / `planet.MoonAway` | 月球真黄经、真黄纬、地心距 | 度 / 度 / km |
```go
// xt=1..7 对应水星..海王星;zn=0 黄经、1 黄纬、2 日心距(AU)。
fmt.Println(planet.WherePlanet(4, 2, 2460000.5)) // 木星日心距,AU
fmt.Println(planet.WherePlanetN(4, 2, 2460000.5, 12)) // 截断版,保留约 12 个主项
fmt.Println(planet.WherePlanet(8, 0, 2460000.5)) // xt 越界:NaN
```
```go
// 地球日心黄经(xt=-1)与行星日心黄经可放在同一口径下比较。
fmt.Println(planet.WherePlanet(-1, 0, 2460000.5), planet.WherePlanet(4, 0, 2460000.5))
```
## 参数与返回值约定
下面几条是七个包一致的口径;按能力汇总的返回值单位另见[通用能力与单位](#通用能力与单位)。
### 时标与民用时刻
公开 API 一律把 `time.Time` 当**民用时刻**(UTC 标签)使用:位置与物理接口内部先取 `date.UTC()` 再换算到 TT 求星历;升落、中天与站心地平量族额外读取 `date.Zone()` 参与地方时计算。
本库将 1972-01-01 之前的民用时间按 UT1 处理;1972 年以后用内置闰秒表,窗口末端之后按当前的 UTC 跟随政策处理。需要显式换算时用根包的 `astro.UT1FromUTC`、`astro.TTFromUTC` 与 `astro.DUT1`;图内/图注的时标声明与 UT1 口径见[时标声明](map-geojson.md#时标声明)。
### 单位与口径
角度一律为度;视直径与视半径为角秒;距离按函数名区分——`EarthDistance` / `SunDistance` 与 `planet.WherePlanet` 的 `zn=2` 用 AU,`planet.MoonAway` 用 km。
`PhaseAngle` 为度,`IlluminatedFraction` 与别名 `Phase` 为 `0–1`;`ApparentMagnitude` 为星等(无量纲);升落、中天与所有事件搜索返回 `time.Time`,时区与输入一致。
事件结构里的历时字段(`TransitInfo.Duration`、`TransitInfo.InternalDuration`、`GalileanPhenomenonEvent.Duration`、`GalileanPhenomenonContact.Duration`)是 Go 的 `time.Duration`,不是儒略日或天数;`TransitInfo` 的 `Start` / `Greatest` / `End` / `InternalStart` / `InternalEnd` 保持调用者输入的时区。
地心量、站心量与距离是三个不同口径:`ApparentLo` / `ApparentBo` / `ApparentRa` / `ApparentDec` / `ApparentRaDec` 是地心视位置,`Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` 是站心量,`EarthDistance` / `SunDistance` 是地心几何距离。
### 零值、越界与哨兵错误
事件搜索在窗口内没有事件时返回零值或 `Valid=false` 的结构(`TransitInfo.Valid`、`GalileanPhenomenonEvent.Valid`、`GalileanPhenomenonContactEvent.Valid`),不返回错误;`TransitInfo` 在 `HasInternal` 为假时 `InternalStart` / `InternalEnd` 为零值,偏凌日没有内切。
`planet.WherePlanet` / `planet.WherePlanetN` 的 `xt` / `zn` 越界返回 `NaN` 而不 panic;`...N` 截断族的 `n < 0` 用全部内置项、`n >= 0` 截断。`RiseTime` / `SetTime` / `DownTime`(含 `N` 版)是唯一返回 `error` 的一族:当天没有几何升/落时返回下面的哨兵错误,时刻为零值。
每个行星包各有一套极昼/极夜错误,名字里的 `NEVER_RISE` 指"当天永不升起"(极夜),`NEVER_SET` 指"当天永不落下"(极昼),`NEVER_DOWN` 是 `NEVER_SET` 的兼容别名。
| 包 | 永不升起 | 永不落下 | 落下别名 |
| --- | --- | --- | --- |
| `mercury` | `ERR_MERCURY_NEVER_RISE` | `ERR_MERCURY_NEVER_SET` | `ERR_MERCURY_NEVER_DOWN` |
| `venus` | `ERR_VENUS_NEVER_RISE` | `ERR_VENUS_NEVER_SET` | `ERR_VENUS_NEVER_DOWN` |
| `mars` | `ERR_MARS_NEVER_RISE` | `ERR_MARS_NEVER_SET` | `ERR_MARS_NEVER_DOWN` |
| `jupiter` | `ERR_JUPITER_NEVER_RISE` | `ERR_JUPITER_NEVER_SET` | `ERR_JUPITER_NEVER_DOWN` |
| `saturn` | `ERR_SATURN_NEVER_RISE` | `ERR_SATURN_NEVER_SET` | `ERR_SATURN_NEVER_DOWN` |
| `uranus` | `ERR_URANUS_NEVER_RISE` | `ERR_URANUS_NEVER_SET` | `ERR_URANUS_NEVER_DOWN` |
| `neptune` | `ERR_NEPTUNE_NEVER_RISE` | `ERR_NEPTUNE_NEVER_SET` | `ERR_NEPTUNE_NEVER_DOWN` |
```go
// 极昼/极夜:升落接口返回哨兵错误,时刻是 time.Time 零值。
rise, err := mercury.RiseTime(date, lon, lat, height, true)
switch {
case errors.Is(err, mercury.ERR_MERCURY_NEVER_RISE):
fmt.Println("极夜:当天永不升起", rise.IsZero())
case errors.Is(err, mercury.ERR_MERCURY_NEVER_SET):
fmt.Println("极昼:当天永不落下", rise.IsZero())
}
```
### 站心与地心
`Altitude` / `Azimuth` / `Zenith` / `HourAngle` / `ParallacticAngle` 使用 `date` 的时区做地方时计算,经度东正西负、纬度北正南负,`height` 是椭球高(米,不是海拔正高)。它们与 `ApparentRa` / `ApparentDec` 的地心视位置不是一个口径,跨口径使用前先经[坐标工具](coord.md)换算。
### 精度与适用范围
行星包使用内置 VSOP87 截断级数,覆盖 J2000 前后约 4000 年;相对完整 VSOP87 的截断误差量级见[太阳与行星](accuracy.md#太阳与行星),整体适用范围见[适用范围与精度](accuracy.md)。`...N` 截断版会在这条基线之上继续放宽,适合批量扫描或前端实时刷新。
`saturn.Ring` 与物理星历只影响盘面与掩带表达:土星环既不参与月掩接触计算、也不作为圆盘边界绘制。行星没有独立出图入口,月掩与土星环的出图见[月掩手册](occultation.md#月掩出图)。