- 新增时标、ΔT 模型、质心时间与 UT1 支持 - 改进日月食、月掩、行星事件及路径边界计算 - 完善恒星三维自行与动态距离传播 - 扩展 SVG、GeoJSON、KML 输出与底层距离换算工具 - 整理中英文手册、示例资源及回归测试
23 KiB
坐标工具
coord 提供天球坐标转换与观测辅助计算。没有特殊说明时,角度单位为度;恒星时单位为小时;time.Time 按绝对时刻使用,内部转换为 UTC 后计算。
高度角、天顶距与地平可见性的语义沿用观测角语义;站心几何的完整应用见月掩·站心事件图与日月位置;站心日食的初亏、食甚、复圆见日食。时标、观测点高度与整体精度的约定见时标约定、观测点高度约定与适用范围与精度。
目录
黄道坐标转赤道与地平坐标
package main
import (
"fmt"
"time"
"b612.me/astro/coord"
)
func main() {
cst := time.FixedZone("CST", 8*3600)
date := time.Date(2026, 4, 27, 10, 30, 45, 0, cst)
eq := coord.EclipticToEquatorial(date, 139.686111, 4.875278)
hz := coord.EquatorialToHorizontal(date, eq.RA, eq.Dec, 115, 40)
fmt.Printf("RA=%.6f Dec=%.6f deg\n", eq.RA, eq.Dec)
fmt.Printf("azimuth=%.6f altitude=%.6f deg\n", hz.Azimuth, hz.Altitude)
fmt.Printf("GAST=%.6f h\n", coord.ApparentSiderealTime(date))
}
赤经、赤纬和地平角均为度,恒星时为小时。这里的赤道坐标属于观测日期;银道转换要求 ICRS 坐标,不能直接混用。
API 参考
下面按计算内容列出接口、单位和返回值。
片段沿用首例中的 date、cst 与 eq。恒星时示例还需导入标准库 math。
黄道 ↔ 赤道
| 名称 | 用途 | 单位与口径 |
|---|---|---|
EclipticToEquatorial |
黄道 → 赤道 | 黄经、黄纬、赤经、赤纬均为度;交角取该时刻的瞬时真交角,RA ∈ [0,360) |
EquatorialToEcliptic |
赤道 → 黄道 | 同一交角的反变换;Lon ∈ [0,360)、Lat ∈ [−90,90] |
EclipticToEquatorialByObliquity |
黄道 → 赤道(手工交角) | 三个参数均为度;面向不同自转轴倾角的研究推演,不做日期换算 |
EquatorialToEclipticByObliquity |
赤道 → 黄道(手工交角) | 同上;Lon ∈ [0,360)、Lat ∈ [−90,90] |
Ecliptic |
黄道坐标结果 | 字段 Lon、Lat,单位度 |
Equatorial |
赤道坐标结果 | 字段 RA、Dec,单位度 |
// date 见公共前置;先取该时刻的瞬时黄赤交角,再与按日期的接口对照。
obliquity := coord.EclipticObliquity(date, true)
auto := coord.EclipticToEquatorial(date, 139.686111, 4.875278)
manual := coord.EclipticToEquatorialByObliquity(139.686111, 4.875278, obliquity)
back := coord.EquatorialToEclipticByObliquity(manual.RA, manual.Dec, obliquity)
fmt.Printf("auto=(%.9f, %.9f) manual=(%.9f, %.9f)\n",
auto.RA, auto.Dec, manual.RA, manual.Dec)
fmt.Printf("back=(%.9f, %.9f)\n", back.Lon, back.Lat)
赤道 ↔ 地平
| 名称 | 用途 | 单位与口径 |
|---|---|---|
EquatorialToHorizontal |
瞬时赤道 → 地平 | 经纬度东正西负、北正南负,单位度;用视恒星时(含章动);Azimuth ∈ [0,360)、Altitude ∈ [−90,90]、Zenith = 90 − Altitude |
EquatorialToHorizontalByLocalSiderealTime |
赤道 → 地平(手工恒星时) | 恒星时单位为小时,内部 ×15 转度;不查日期,适合手工推演 |
HourAngleDeclinationToHorizontal |
时角 + 赤纬 → 地平 | 时角输入转 [0,360) 后归一输出;Azimuth ∈ [0,360) |
HorizontalToHourAngleDeclination |
地平 → 时角 + 赤纬 | 返回时角归一到 [0,360)(不是 [−180,180]),赤纬 [−90,90] |
HorizontalToEquatorialByLocalSiderealTime |
地平 → 赤道(手工恒星时) | 恒星时小时;RA ∈ [0,360) |
Horizontal |
地平坐标结果 | 字段 Azimuth、Altitude、Zenith、HourAngle,均度 |
// 观测点取 115°E, 40°N;eq 见公共前置。
hz := coord.EquatorialToHorizontal(date, eq.RA, eq.Dec, 115, 40)
manual := coord.EquatorialToHorizontalByLocalSiderealTime(10.5, eq.RA, eq.Dec, 40)
hz2 := coord.HourAngleDeclinationToHorizontal(hz.HourAngle, eq.Dec, 40)
ha, dec := coord.HorizontalToHourAngleDeclination(hz2.Azimuth, hz2.Altitude, 40)
eq2 := coord.HorizontalToEquatorialByLocalSiderealTime(10.5, hz2.Azimuth, hz2.Altitude, 40)
fmt.Printf("auto=(%.6f, %.6f, %.6f) manual=(%.6f, %.6f)\n",
hz.Azimuth, hz.Altitude, hz.Zenith, manual.Azimuth, manual.Altitude)
fmt.Printf("roundtrip ha=%.6f dec=%.6f ra=%.6f\n", ha, dec, eq2.RA)
站心坐标
| 名称 | 用途 | 单位与口径 |
|---|---|---|
TopocentricEquatorial |
地心赤道 → 站心赤道 | distanceAU 为地心距、AU;height 为椭球高、米;RA 只加视差小改正、不做 360° 归一 |
TopocentricEcliptic |
地心黄道 → 站心黄道 | 同上;内部先解站心赤道坐标再转黄道,Lon 归一到 [0,360)、Lat 落在 [−90,90] |
Ecliptic / Equatorial |
返回值类型 | 字段口径同黄道 ↔ 赤道分组 |
// 目标地心距 0.00257 AU(约月球),观测点 115°E, 40°N,椭球高 53 m。
top := coord.TopocentricEquatorial(date, eq.RA, eq.Dec, 115, 40, 0.00257, 53)
topEcl := coord.TopocentricEcliptic(date, 139.686111, 4.875278, 115, 40, 0.00257, 53)
fmt.Printf("top=(%.9f, %.9f) dRA=%.9f dDec=%.9f\n",
top.RA, top.Dec, top.RA-eq.RA, top.Dec-eq.Dec)
fmt.Printf("topEcl=(%.9f, %.9f)\n", topEcl.Lon, topEcl.Lat)
站心几何在月掩里用于逐地点接触时刻,见站心事件图;sun、moon 的站心物理量见日月位置。
恒星时
| 名称 | 用途 | 单位与口径 |
|---|---|---|
MeanSiderealTime |
格林尼治平恒星时 | 小时;先把民用时刻换成 UT1,模型为 IAU 2006(ERA 路线) |
ApparentSiderealTime |
格林尼治视恒星时 | 小时;平恒星时叠加 IAU 2000B 黄经章动的投影 |
HourAngle |
由瞬时赤经与站经求时角 | 经度东正西负、度;时角 [0,360);基于视恒星时 |
// 本地恒星时 = 格林尼治恒星时 + 东经/15,再折回 [0,24) 小时;math 仅用于这一步。
gmst := coord.MeanSiderealTime(date)
gast := coord.ApparentSiderealTime(date)
lst := math.Mod(gmst+115.0/15, 24)
fmt.Printf("GMST=%.9f h GAST=%.9f h LST=%.9f h\n", gmst, gast, lst)
fmt.Printf("HA=%.6f deg\n", coord.HourAngle(date, eq.RA, 115))
岁差与章动
| 名称 | 用途 | 单位与口径 |
|---|---|---|
Precess |
赤道坐标从一个日期岁差到另一个日期 | RA/Dec 单位度;两个日期都是民用时刻;只做岁差旋转,不含自行 |
EclipticObliquity |
黄赤交角 | 度;nutation=false 给 IAU 1980 平交角,true 再叠加 IAU 2000B 交角章动 |
Nutation2000B |
IAU 2000B 章动 | 返回 (黄经章动, 交角章动),度 |
Nutation1980 |
IAU 1980 章动 | 返回 (黄经章动, 交角章动),度 |
// 把 J2000 的赤道坐标岁差到 date,并列出两套章动供对照。
j2000 := time.Date(2000, 1, 1, 12, 0, 0, 0, time.UTC)
p := coord.Precess(j2000, date, 83.6331, 22.0145)
dLon2000B, dObl2000B := coord.Nutation2000B(date)
dLon1980, dObl1980 := coord.Nutation1980(date)
fmt.Printf("precessed=(%.9f, %.9f)\n", p.RA, p.Dec)
fmt.Printf("eps mean=%.9f true=%.9f\n",
coord.EclipticObliquity(date, false), coord.EclipticObliquity(date, true))
fmt.Printf("nut 2000B=(%.9f, %.9f) 1980=(%.9f, %.9f)\n",
dLon2000B, dObl2000B, dLon1980, dObl1980)
银道坐标
| 名称 | 用途 | 单位与口径 |
|---|---|---|
EquatorialToGalactic |
ICRS 赤道 → 银道 | 输入 ICRS 度;Lon ∈ [0,360)、Lat ∈ [−90,90];固定旋转矩阵,不做岁差与自行 |
GalacticToEquatorial |
银道 → ICRS 赤道 | 同一矩阵的转置;RA ∈ [0,360) |
Galactic |
银道坐标结果 | 字段 Lon、Lat,单位度 |
// 银心方向 ICRS (266.4051, -28.936175) 应回到银经 0、银纬 0 附近。
gal := coord.EquatorialToGalactic(266.4051, -28.936175)
back := coord.GalacticToEquatorial(gal.Lon, gal.Lat)
fmt.Printf("gal=(%.6f, %.6f) back=(%.9f, %.9f)\n", gal.Lon, gal.Lat, back.RA, back.Dec)
角距离
| 名称 | 用途 | 单位与口径 |
|---|---|---|
AngularSeparation |
两组赤道坐标的角距离 | 输入、输出均为度;大圆角距,与输入顺序无关 |
// 蟹状星云脉冲星方向与银心方向的角距。
sep := coord.AngularSeparation(83.6331, 22.0145, 266.4051, -28.936175)
fmt.Printf("sep=%.9f deg = %.6f arcsec\n", sep, sep*3600)
大气折射
| 名称 | 用途 | 单位与口径 |
|---|---|---|
ApparentAltitude |
真高度 → 视高度 | 高度角与返回值均为度;气压 hPa、气温 ℃ |
TrueAltitude |
视高度 → 真高度 | 对 Saemundsson 模型做数值逆解;无解返回 NaN |
AtmosphericRefractionFromTrueAltitude |
真高度处的折射量 | 度;加到真高度上得视高度 |
AtmosphericRefractionFromApparentAltitude |
视高度处的折射量 | 度;从视高度减去得真高度 |
EquatorialToApparentHorizontal |
赤道 → 视地平 | 在 EquatorialToHorizontal 结果上叠加折射,只改 Altitude/Zenith,不动 Azimuth/HourAngle |
// 真高度 10°,标准气压 1010 hPa、气温 0 ℃。
apparent := coord.ApparentAltitude(10, 1010, 0)
ref := coord.AtmosphericRefractionFromTrueAltitude(10, 1010, 0)
appHz := coord.EquatorialToApparentHorizontal(date, eq.RA, eq.Dec, 115, 40, 1010, 0)
fmt.Printf("true=10 apparent=%.9f ref=%.9f\n", apparent, ref)
fmt.Printf("back=%.9f appHz alt=%.6f zen=%.6f\n",
coord.TrueAltitude(apparent, 1010, 0), appHz.Altitude, appHz.Zenith)
大气质量
| 名称 | 用途 | 单位与口径 |
|---|---|---|
AirmassPlaneParallelFromTrueAltitude |
平行平板模型 | 输入真高度、度;等价 sec(z),中高空适用,近地平发散 |
AirmassKastenYoungFromApparentAltitude |
Kasten-Young 1989 | 输入视高度、度;不自动做折射修正 |
AirmassPickeringFromApparentAltitude |
Pickering 2002 | 输入视高度、度;面向低空观测 |
AirmassKastenYoungFromTrueAltitude |
先折射再 Kasten-Young | 真高度、度;气压 hPa、气温 ℃ |
AirmassPickeringFromTrueAltitude |
先折射再 Pickering | 同上 |
// 真高度 10°,标准气压 1010 hPa、气温 0 ℃;FromTrueAltitude 内部先做折射。
apparent := coord.ApparentAltitude(10, 1010, 0)
fmt.Printf("plane=%.9f\n", coord.AirmassPlaneParallelFromTrueAltitude(10))
fmt.Printf("ky true=%.9f apparent=%.9f\n",
coord.AirmassKastenYoungFromTrueAltitude(10, 1010, 0),
coord.AirmassKastenYoungFromApparentAltitude(apparent))
fmt.Printf("pickering true=%.9f apparent=%.9f\n",
coord.AirmassPickeringFromTrueAltitude(10, 1010, 0),
coord.AirmassPickeringFromApparentAltitude(apparent))
只剩纯公式、不需要坐标层折射时,用 formula 的大气质量模型三模型。
视差角
| 名称 | 用途 | 单位与口径 |
|---|---|---|
ParallacticAngle |
由瞬时赤经赤纬求视差角 | 经纬度单位度;内部走时角 + 赤纬,返回 (−180,180] |
ParallacticAngleByHourAngle |
由时角求视差角 | 时角、赤纬、纬度单位度;返回 (−180,180] |
// 视差角用于相机旋转、光谱缝方向和视场姿态判断。
q := coord.ParallacticAngle(date, eq.RA, eq.Dec, 115, 40)
q2 := coord.ParallacticAngleByHourAngle(coord.HourAngle(date, eq.RA, 115), eq.Dec, 40)
fmt.Printf("q=%.9f qByHA=%.9f\n", q, q2)
视差角的方向定义沿用观测角语义。
常用场景
黄道与地平坐标的往返转换
eq := coord.EclipticToEquatorial(date, 139.686111, 4.875278)
hz := coord.EquatorialToHorizontal(date, eq.RA, eq.Dec, 115, 40)
back := coord.EquatorialToEcliptic(date, eq.RA, eq.Dec)
fmt.Println(eq.RA, eq.Dec, hz.Altitude, back.Lon)
143.72223158223719 19.53512536790277 -17.686511328302952 139.68611100000000
只给时刻与坐标就够,库内部按当日视黄赤交角换算;要自己指定交角用 EclipticToEquatorialByObliquity / EquatorialToEclipticByObliquity 研究入口。往返自洽:EquatorialToEcliptic(EclipticToEquatorial(...)) 在同口径下回到原值。
站心改正与恒星时
top := coord.TopocentricEquatorial(date, eq.RA, eq.Dec, 115, 40, 0.00257, 53)
fmt.Println(top.RA, top.Dec)
fmt.Println(coord.MeanSiderealTime(date), coord.ApparentSiderealTime(date))
// 已有地方恒星时时可直接用它,不必让库重算:
manual := coord.EquatorialToHorizontalByLocalSiderealTime(10.5, 83.6331, 22.0145, 31.2)
fmt.Println(manual.Azimuth, manual.Altitude, manual.HourAngle)
144.25512626944376 18.79025523004319
16.852455700085 16.852556781127
281.869347 24.489608 73.8669
distanceAU 必须给真实地心距(月球约 0.00257 AU);较远天体是否可以忽略视差,取决于所需精度。height 是椭球高(米),恒星时单位是小时。
蒙气差、大气质量与视差角
fmt.Println(coord.ApparentAltitude(10, 1010, 0)) // 真高 10° -> 视高
fmt.Println(coord.TrueAltitude(10.093428, 1010, 0)) // 视高 -> 真高(逆解)
fmt.Println(coord.AirmassKastenYoungFromTrueAltitude(10, 1010, 0)) // 真高 10° 的大气质量
fmt.Println(coord.ParallacticAngle(date, eq.RA, eq.Dec, 115, 40)) // 相机/光谱缝旋转角
10.093427592862
10.000000410649
5.537933369472
-34.000957202636
蒙气差只在真高度角 (-5°, 90°) 内生效,区间外不修正;大气质量族另有只按视高度角的简化入口(...FromApparentAltitude)。
岁差章动与交角口径
fmt.Println(coord.EclipticObliquity(date, true)) // 真交角;false 给平交角
lon, obl := coord.Nutation2000B(date) // IAU 2000B 黄经/交角章动
pre := coord.Precess(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC), date, eq.RA, eq.Dec)
fmt.Println(lon, obl, pre.RA, pre.Dec)
23.438261476424
0.001652570533 0.002392788113 144.089973153762 19.416731576422
Nutation1980 与 Nutation2000B 都可显式调用,便于逐项对表;Precess 只做岁差,不含自行、章动与光行差。手动恒星时、手动交角这类研究入口集中在研究型接口与观测辅助。
研究型接口与观测辅助
coord 里的研究型接口不会自动代入当前日期的黄赤交角或恒星时,适合做“不同自转轴倾角”“手工指定时角”这类推演。常规计算可用 EclipticToEquatorial、EquatorialToHorizontal 等带 time.Time 的接口。
观测辅助接口包括:
ParallacticAngle/ParallacticAngleByHourAngle:视差角(天顶方向角)Airmass...FromApparentAltitude:已经有视高度角时,直接套经验式Airmass...FromTrueAltitude:先按给定气压/气温估算折射,把真高度角换成视高度角后再算
// 目标的视差角,常用于旋转相机、光谱缝方向和视场姿态判断。
q := coord.ParallacticAngle(date, eq.RA, eq.Dec, 115, 40)
// 已知真高度角时,可先估算折射,再按经验模型求大气质量。
x := coord.AirmassKastenYoungFromTrueAltitude(10, 1010, 0)
fmt.Printf("q=%.6f airmass=%.6f\n", q, x)
同样的观测辅助接口在 sun、moon、star 以及七大行星包中都有提供。已有视高度角且只需要纯公式时,formula.Airmass... 更直接。
参数与返回值约定
单位约定
- 角度一律为度:黄经/黄纬、赤经/赤纬、方位/高度/天顶距/时角、视差角、角距离。需要角秒时自行 ×3600(如
AngularSeparation的返回值)。 - 恒星时一律为小时:
MeanSiderealTime、ApparentSiderealTime的返回值和*ByLocalSiderealTime的localSiderealTimeHours参数都是小时;内部按 ×15 换成度,不要与赤经的小时表示混用。 Equatorial.RA、Galactic.Lon、Horizontal.Azimuth、Horizontal.HourAngle都是度,不是小时;Equatorial类型不区分 J2000、日期平坐标还是瞬时真坐标,由调用者保证输入口径一致。- 距离用 AU(
TopocentricEquatorial、TopocentricEcliptic的distanceAU);观测点高度用椭球高(大地高),单位米,不建模大地水准面差距,详见观测点高度约定。 - 气压 hPa、气温 ℃;折射按标准状态
1010 hPa、10 ℃定标。 - 本包不产生视直径/视半径;日月与日食手册里的视半径字段以角秒计,不要与本包的“度”互换。
时标
- 所有公开接口的
time.Time按绝对时刻(民用时刻)使用,内部先date.UTC()再转儒略日;数值本身一律按 UTC 标签解释,1972-01-01之前它等于 UT1。完整约定见时标约定。 - 恒星时链路显式做 UT1 换算:
MeanSiderealTime/ApparentSiderealTime走UTC2UT1后的 IAU 2006 模型;HourAngle、EquatorialToHorizontal、TopocentricEquatorial内部的视恒星时同样基于 UT1。 Precess(from, to)的from、to都是民用时刻,按各自的绝对时刻取岁差历元。- 折射与大气质量不涉及时刻,只依赖高度角与气象参数。
角度象限与归一
- 内部
normalize360把所有需要展示的角归一到[0,360):赤经、黄经、银经、方位角、时角都落在这个区间。 - 赤纬、黄纬、银纬、高度角经
Asin(部分路径额外做[−1,1]夹取)后落[−90,90]。 ParallacticAngle/ParallacticAngleByHourAngle用Atan2,返回(−180,180],是本包唯一带符号的角。- 站心族是例外:
TopocentricEquatorial.RA是输入赤经加一个小改正,不做 360° 归一,目标靠近0°/360°边界时结果可能略越界;TopocentricEcliptic的Lon归一到[0,360)、Lat经Asin落在[−90,90](内部先解站心赤道坐标再转黄道)。 HourAngleDeclinationToHorizontal与HorizontalToHourAngleDeclination的时角都归一到[0,360),所以子午线以西的负时角在这里表现为360−|HA|;要带符号时角请自行减 360。EquatorialToHorizontal与HourAngleDeclinationToHorizontal给出的都是几何高度角,不含蒙气差;需要视高度用EquatorialToApparentHorizontal或ApparentAltitude。
零值与无效输入
- 折射族要求
pressureHPa > 0、temperatureC > −273.15,任一参数为 NaN/Inf 或越界即返回 NaN。 - 真高度
≤ −5°或≥ 90°时折射量按 0 处理:ApparentAltitude原样返回真高度,TrueAltitude与AtmosphericRefractionFromApparentAltitude原样返回输入视高度;TrueAltitude只在(−5°, 90°)内做数值逆解,逆解失败返回 NaN。 - 大气质量族把高度角(或天顶距)限制在
[0,90],越界或非有限返回 NaN;平行平板在高度角恰为0°(天顶距恰为90°)时返回+Inf,Kasten-Young 与 Pickering 在0°处仍是有限值。 EquatorialToApparentHorizontal把气压/气温直接透传给折射函数:非法气象参数会让Altitude变 NaN、Zenith随之为 NaN,而Azimuth、HourAngle仍是几何值。- 站心族对
distanceAU与height不做校验,distanceAU填0或负值会得到无意义结果;必须传真实地心距(月球约0.00257 AU)。 - 银道、角距离等纯几何接口不做参数校验,非有限输入会传播成 NaN,黄纬超出
[−90,90]也不会被夹取,而是按球面方向重新解释。 - 四个坐标类型没有
Valid字段:Ecliptic{}、Equatorial{}、Horizontal{}、Galactic{}表示“全 0 角”而不是“未设置”,不能用零值做缺省判断。
精度与适用范围
- 黄赤交角:平均项取 IAU 1980 模型,
EclipticObliquity(date, true)在其上叠加 IAU 2000B 交角章动;Nutation1980与Nutation2000B都可用,需要逐项对照时显式调用。 - 恒星时:走 IAU 2006 的 ERA 路线,视恒星时叠加 IAU 2000B 黄经章动;同一儒略日的视恒星时做了有界记忆化,注入 ΔT 覆盖会按世代失效。
- 岁差:
Precess在赤道坐标上做长期岁差旋转(赤道极/黄极向量含周期项),不含自行、章动与光行差;它适合把一个历元的平坐标转到另一个历元,不能代替完整的“J2000 → 当日视位置”链路。 - 银道:使用固定的 ICRS ↔ Galactic 旋转矩阵,等价于 SOFA 的
iauIcrs2g/iauG2icrs,只适用于 ICRS 口径的输入。 - 站心改正:周日视差量级随
distanceAU反比变化,月球最大(约 1°),较远天体是否可忽略应按精度要求判断;height只影响视差项的幅度,量级为米级高程对应的角秒级差异。 - 站心黄道坐标由站心赤道坐标换算(
basic.TopocentricLoBo一次求值给出黄经与黄纬):TopocentricEcliptic.Lat保证落在[−90,90],并与EquatorialToEcliptic(TopocentricEquatorial(...))这条独立路径一致。 - 折射:Saemundsson 公式,有效真高度窗口
(−5°, 90°),窗口外不修正;低空(< 5°)折射变化剧烈,气压 ±1 hPa、气温 ±1 ℃ 都会带来可见误差。 - 大气质量:三种经验模型在中高空接近,低空差异最大;平行平板只是几何近似,接近地平线发散,低空精细估算用 Kasten-Young 或 Pickering,纯公式见
formula的大气质量模型。 - 视差角:
ParallacticAngle用瞬时赤经赤纬与站点经纬度,ParallacticAngleByHourAngle用同一几何的时角形式,两者对同一几何应给出一致结果。
观测点高度
站心坐标、升落、地方日月食与月掩接口的高度参数均为椭球高,单位米。正高(海拔)H 与椭球高的关系是 height = H + N,其中 N 为当地大地水准面差距。
库内不提供大地水准面模型,所以 height=0 表示参考椭球面,不一定是当地平均海面。需要这一级精度时,应从外部模型取得 N;与外部预报对照时也应统一高度定义。
作为量级估算,30 米高差在高度角 30° 的光线方向上对应约 52 米水平位移,即 |Δh|·cot(高度角)。接触时刻的差异还取决于当地影子速度和接触几何,不能视为固定秒数的修正。