系统间转换#

astropy.coordinates 支持将坐标从一个帧转换到另一个帧的丰富系统。当普通的天文学框架被构建成Astropy时,转换基础设施是动态的。这意味着它允许用户定义新的坐标系及其变换。有关编写自己的坐标系或变换的主题,请参见 定义新框架 ,本节重点介绍如何 use 转变。

内置坐标系的完整列表、包含的变换和帧名称在中显示为(可单击)图形 coordinates API文档。

实例#

推荐的转换方法如下:

>>> import astropy.units as u
>>> from astropy.coordinates import SkyCoord
>>> gc = SkyCoord(l=0*u.degree, b=45*u.degree, frame='galactic')
>>> gc.fk5  
<SkyCoord (FK5: equinox=J2000.000): (ra, dec) in deg
    ( 229.27251463, -1.12844288)>

虽然这看起来是普通的属性样式访问,但它实际上是更一般的语法糖 transform_to() 方法,它可以接受框架名称、类或实例::

>>> from astropy.coordinates import FK5
>>> gc.transform_to('fk5')  
<SkyCoord (FK5: equinox=J2000.000): (ra, dec) in deg
    ( 229.27251463, -1.12844288)>
>>> gc.transform_to(FK5)  
<SkyCoord (FK5: equinox=J2000.000): (ra, dec) in deg
    ( 229.27251463, -1.12844288)>
>>> gc.transform_to(FK5(equinox='J1980.0'))  
<SkyCoord (FK5: equinox=J1980.000): (ra, dec) in deg
    ( 229.0146935, -1.05560349)>

为了方便起见,也可以使用 SkyCoord 对象作为框架 transform_to() . 这允许将一个坐标对象放入另一个坐标对象的帧中:

>>> sc = SkyCoord(ra=1.0, dec=2.0, unit='deg', frame=FK5, equinox='J1980.0')
>>> gc.transform_to(sc)  
<SkyCoord (FK5: equinox=J1980.000): (ra, dec) in deg
    ( 229.0146935, -1.05560349)>

一些坐标框架(包括 FK5FK4 ,以及 FK4NoETerms )支持“自我改造”,意思是 type 帧的数量不会更改,但帧属性会更改。一个例子是在赤道坐标系中将一个坐标从一个分点进动到另一个分点。这是通过传递 transform_to 具有相关属性的Frame类,如下所示。请注意,如果您不指定一个:

>>> fk5c = SkyCoord('02h31m49.09s', '+89d15m50.8s', frame=FK5)
>>> fk5c.equinox
<Time object: scale='tt' format='jyear_str' value=J2000.000>
>>> fk5c  
<SkyCoord (FK5: equinox=J2000.000): (ra, dec) in deg
    ( 37.95454167,  89.26411111)>
>>> fk5_2005 = FK5(equinox='J2005')  # String initializes an astropy.time.Time object
>>> fk5c.transform_to(fk5_2005)  
<SkyCoord (FK5: equinox=J2005.000): (ra, dec) in deg
    ( 39.39317639,  89.28584422)>

也可以在使用 Time 对象:

>>> from astropy.time import Time
>>> fk5c = SkyCoord('02h31m49.09s', '+89d15m50.8s',
...                 frame=FK5(equinox=Time('J1970')))
>>> fk5_2000 = FK5(equinox=Time(2000, format='jyear'))
>>> fk5c.transform_to(fk5_2000)  
<SkyCoord (FK5: equinox=2000.0): (ra, dec) in deg
    ( 48.023171,  89.38672485)>

相同的较低级别的Frame类也具有 transform_to() 方法的工作原理与上述相同,但它们不支持属性样式访问。它们也有细微的不同,因为它们只使用出现在初始或最终帧中的帧属性,而 SkyCoord 对于所有变换步骤,对象都使用它们拥有的任何帧属性。所以 SkyCoord 可以始终在不变的情况下从一个帧转换到另一个帧,然后再转换回来,而低级类可能会丢失信息,因此通常不会往返。

转换与太阳系星历#

一些转换(例如 ICRS and GCRS) require the use of a Solar System ephemeris to calculate the position and velocity of the Earth and Sun. By default, transformations are calculated using built-in ERFA 程序,但他们也可以使用更精确的使用JPL星历表(从动力学模型派生)。

例子#

要使用JPL星历,请使用 solar_system_ephemeris 上下文管理器,如下所示:

>>> from astropy.coordinates import solar_system_ephemeris
>>> from astropy.coordinates import GCRS
>>> with solar_system_ephemeris.set('jpl'): 
...     fk5c.transform_to(GCRS(obstime=Time("J2000"))) 

对于距离太阳系很远的地方,使用JPL星历表在微秒级上的差别可以忽略不计。对于附近的物体,如月球,其差别可能是毫秒级的。有关可用星历的更多详细信息,包括使用JPL星历的要求,请参阅 太阳系星历 .