AstroPy:如何将 GCRS 框架中的 SkyCoord 对象转换为地心框架?

AstroPy: how to transform a SkyCoord object in the GCRS frame to the topocentric frame?

AstroPyget_sun()方法returns太阳的赤道坐标作为GCRS坐标系中的SkyCoord对象。如何将这些坐标转换为 topocentric 坐标系以获得太阳的 topocentric equatorial 坐标?

我看过 transform_to() 方法,但它似乎没有提供以地心为中心的框架。在文档的某个地方我看到了这个声明: "The frame classes that are built in to astropy are ICRS, FK5, FK4, FK4NoETerms, Galactic, and AltAz." 这是否意味着,为了转换为 topocentric 框架,我必须定义一个新的 class 作为 BaseCoordinateFrame 的子类class?

编辑: 可以看到数学背景,例如此处(Dieudonné 的回答):https://astronomy.stackexchange.com/questions/19170/transformation-from-geocentric-coordinates-into-equatorial-coordinates

我想知道这是否已经在 AstroPy 中实现为一个随时可用的函数?

编辑 2: 在我看来,如果我仍然保留 GCRS 框架,但更改 obsgeoloc 和 [=16,我应该会得到想要的结果=]参数从默认值(0,0,0)到我的实际位置。但是我该怎么做呢?

编辑 3: 我至少更改了 obsgeoloc 但这没有区别,我得到相同的赤道坐标,除非我做错了什么或只是误解了整个事情,或者可能区别并不明显,因为坐标值的精度是 8 位小数? (而且我仍然不知道要为 obsgeovel 取哪些值,但即使我使用一些任意值,我也会再次获得相同的坐标。)

<SkyCoord (GCRS: obstime=2018-12-01T00:00:00.000, obsgeoloc=(0., 0., 0.) m, obsgeovel=(0., 0., 0.) m / s): (ra, dec, distance) in (deg, deg, AU)
    (246.72726607, -21.71360187, 0.98613747)>

<GCRS Coordinate (obstime=2018-12-01T00:00:00.000, obsgeoloc=(4659791.10339651, 1289069.45080985, 4147935.86909442) m, obsgeovel=(0., 0., 0.) m / s): (ra, dec) in deg
    (246.72726607, -21.71360187)>

根据我阅读 this 维基百科文章 Topocentric 是已经在 Astropy 中实现的 AltAz 框架的另一个名称。

因此,您可以通过设置地球位置对象并转换为 AltAz 来做您想做的事:

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

>>> Fort_Sumner = EarthLocation(lat=34.4900*u.deg, lon=-104.221800*u.deg, height=40*u.km)                                                                                                                          

>>> get_sun(Time("2018-12-01T00:00:00")).transform_to(AltAz(location=Fort_Sumner))                                                                                                                                 
<SkyCoord (AltAz: obstime=2018-12-01T00:00:00.000, location=(-1301.01298069, -5133.33948381, 3614.02816719) km, pressure=0.0 hPa, temperature=0.0 deg_C, relative_humidity=0.0, obswl=1.0 micron): (az, alt, distance) in (deg, deg, km)
(245.77428805, -3.34077928, 1.47524431e+08)>

如果我正确理解了你的问题,那么你想要的是太阳的赤道坐标(即与 ICRS 轴对齐的轴),但对于给定原点(地心)的观察者。

在这种情况下,您可以使用 astropy.coordinates.get_body,而不是使用 get_sun,它始终 returns 以地心原点为坐标,它允许指定观察者的位置EarthLocation 对象。

>>> from astropy.coordinates import EarthLocation, get_body
>>> from astropy.time import Time
>>> location = EarthLocation.of_site('lapalma')
>>> t = Time.now()
>>> sun = get_body('sun', t, location)
<SkyCoord (GCRS: obstime=2018-12-17 11:12:59.165352, obsgeoloc=(-3111752.92801233, -4649601.13172555, 3057088.20910137) m, obsgeovel=(339.04768621, -227.31606521, -0.62038673) m / s): (ra, dec, distance) in (deg, deg, AU)
(264.76635166, -23.35141062, 0.98401329)>
>>> sun = get_body('sun', t)
<SkyCoord (GCRS: obstime=2018-12-17 11:12:59.165352, obsgeoloc=(0., 0., 0.) m, obsgeovel=(0., 0., 0.) m / s): (ra, dec, distance) in (deg, deg, AU)
(264.76514306, -23.34957481, 0.98403534)>