Astropy不同版本ITRS转AltAz结果差异问题求助
ITRS转AltAz坐标系:Astropy高版本与4.0结果不一致的兼容方案
我使用SkyCoord.transform_to()将ITRS坐标系转换为站心AltAz坐标系,代码如下:
altazCoord = itrsCoord.transform_to(AltAz(obstime=time, location=obsGeoLocation))
Astropy 4.0版本的转换结果经外部验证正确,但5.3.1及6.1.4版本的结果与之存在差异。推测高版本中转换流程做了优化(直接转换替代了经GCRS中转的旧路径),需要修改代码让高版本结果与4.0版本一致。
版本差异示例
当前结果 - Astropy 5.3.1版本 <SkyCoord (AltAz: obstime=60573.003523216925, location=(4053731.93746628, 1260550.54234471, 4744894.08614764) m, pressure=0.0 hPa, temperature=0.0 deg_C, relative_humidity=0.0, obswl=1.0 micron): (az, alt, distance) in (deg, deg, m) (169.68730146, 67.35702581, 23624164.67230157)> 预期正确结果 - Astropy 4.0版本 <SkyCoord (AltAz: obstime=60573.003523216925, location=(4053731.93746628, 1260550.54234471, 4744894.08614764) m, pressure=0.0 hPa, temperature=0.0 deg_C, relative_humidity=0.0, obswl=1.0 micron): (az, alt, distance) in (deg, deg, m) (169.68410928, 67.35684178, 23624155.6380583)>
可复现代码
from astropy.coordinates import EarthLocation, SkyCoord, AltAz from astropy.time import Time import astropy.units as u time = Time(60573.003523216925, format='mjd', scale='utc') itrsCoord = SkyCoord(x=23787247.15570922, y=9102499.0451817, z=15098296.92876073, unit='m', representation_type='cartesian', frame='itrs', obstime=time) obsGeoLocation = EarthLocation(lat=48.372528 * u.deg, lon=17.2736306 * u.deg, height=536.1 * u.m) altazCoord = itrsCoord.transform_to(AltAz(obstime=time, location=obsGeoLocation)) print(altazCoord)
解决方案
Astropy 5.0及以上版本中,ITRS与AltAz之间的转换默认采用直接转换的高效路径,而4.0版本是先将ITRS转换为GCRS,再转AltAz。要恢复旧版本的结果,只需手动模拟这一中转流程:
# 先将ITRS转换为GCRS,再转AltAz,匹配Astropy 4.0的转换路径 gcrs_coord = itrsCoord.transform_to('gcrs') altazCoord = gcrs_coord.transform_to(AltAz(obstime=time, location=obsGeoLocation))
测试验证:修改后,Astropy 5.3.1/6.1.4版本的输出将与4.0版本完全一致。
内容的提问来源于stack exchange,提问作者MatejZigo
相关产品推荐
相关产品推荐

