使用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度,请问我忽略了什么问题?
问题分析与解决
核心错误是使用了格林尼治恒星时而非本地恒星时,天顶的赤经严格等于观测点的本地恒星时,而非格林尼治恒星时。
修正点说明
- 天顶赤经的正确计算逻辑:本地恒星时 = 格林尼治恒星时 + 观测点经度(需统一单位),直接调用
obs_time.sidereal_time('mean')会自动使用绑定的观测点位置计算本地恒星时,无需指定'greenwich'。 - 你对天顶赤纬的计算是正确的:天顶赤纬等于观测点的纬度。
修正后的代码
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
相关产品推荐
相关产品推荐

