You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Astropy计算天顶赤道坐标异常:反向转换高度非90度求助

问题描述

我尝试使用Python的Astropy库,根据给定的纬度、经度和观测时间计算天顶的赤道坐标(赤经RA & 赤纬DEC),编写了如下代码:

from datetime import datetime
from astropy.coordinates import EarthLocation, SkyCoord, AltAz
from astropy.time import Time
from astropy.io import fits
from astropy import units as u


# coordinates on Earth
lat, long = 40, 120
lat, long = lat * u.deg, long * u.deg
altitude = 14756 * u.m

# location of obervations
obs_location = EarthLocation.from_geodetic(lat=lat, lon=long, height=altitude)

# observation time, corresponding to 2022-12-08 at 03:22:37.000969
obs_time = Time(datetime([2022,12,8,3,22,37,969]),scale='utc',location=obs_location)

# RIGHT ASCENSION AND DECLINATION at zenith for given lat, long
right_ascension_z = obs_time.sidereal_time('mean','greenwich').to('deg')
declination_z = lat

# 输出结果
# right_ascension_z = <Longitude 127.52856085 deg>, declination_z = <Quantity 40. deg>

按预期,计算得到的RA和DEC反向转换后,应对应该观测时间和地点下高度为90度(指向天顶)的地平坐标,但实际执行反向转换代码:

aa = AltAz(location=obs_location, obstime=obs_time)
coord_zenith = SkyCoord(ra=right_ascension_z,dec=declination_z,frame='icrs',unit=u.deg)
altaz_coord = coord_zenith.transform_to(aa)

print(altaz_coord)
# 输出结果
# <SkyCoord (AltAz: obstime=2022-12-08 03:22:37.000969, location=(-2452005.67593768, 4246998.41117133, 4087470.54616891) m, pressure=0.0 hPa, temperature=0.0 deg_C, relative_humidity=0.0, obswl=1.0 micron): (az, alt) in deg
# (317.79729856, 7.01695887)>

得到的高度并非90度,请问我忽略了什么问题?

问题分析与解决

核心错误是使用了格林尼治恒星时而非本地恒星时,天顶的赤经严格等于观测点的本地恒星时,而非格林尼治恒星时。

修正点说明

  1. 天顶赤经的正确计算逻辑:本地恒星时 = 格林尼治恒星时 + 观测点经度(需统一单位),直接调用obs_time.sidereal_time('mean')会自动使用绑定的观测点位置计算本地恒星时,无需指定'greenwich'。
  2. 你对天顶赤纬的计算是正确的:天顶赤纬等于观测点的纬度。

修正后的代码

from datetime import datetime
from astropy.coordinates import EarthLocation, SkyCoord, AltAz
from astropy.time import Time
from astropy import units as u

# 地球坐标
lat, long = 40, 120
lat, long = lat * u.deg, long * u.deg
altitude = 14756 * u.m

# 观测位置
obs_location = EarthLocation.from_geodetic(lat=lat, lon=long, height=altitude)

# 观测时间
obs_time = Time(datetime(2022,12,8,3,22,37,969), scale='utc', location=obs_location)

# 计算本地恒星时(默认使用观测点位置,无需指定greenwich)
local_sidereal_time = obs_time.sidereal_time('mean').to('deg')
# 天顶的赤经=本地恒星时,赤纬=本地纬度
right_ascension_z = local_sidereal_time
declination_z = lat

# 反向验证
aa = AltAz(location=obs_location, obstime=obs_time)
coord_zenith = SkyCoord(ra=right_ascension_z, dec=declination_z, frame='icrs', unit=u.deg)
altaz_coord = coord_zenith.transform_to(aa)

print(altaz_coord)
# 输出将接近 (任意方位角, 90 deg),天顶方位角无固定值,但高度必然为90度

内容的提问来源于stack exchange,提问作者anakha272

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:42:48