常见错误#

以下是使用时的一些常见困难来源 coordinates

对象分离#

计算对象之间的间隔时,重要的是要记住 separation() 可以根据使用顺序给出不同的答案。例如::

>>> import numpy as np
>>> from astropy import units as u
>>> from astropy.coordinates import SkyCoord, GCRS
>>> from astropy.time import Time
>>> t = Time("2010-05-22T00:00")
>>> moon = SkyCoord(104.29*u.deg, 23.51*u.deg, 359367.3*u.km, frame=GCRS(obstime=t))
>>> star = SkyCoord(101.4*u.deg, 23.02*u.deg, frame='icrs')
>>> star.separation(moon) 
<Angle 139.84211884 deg>
NonRotationTransformationWarning: transforming other coordinates from
<GCRS Frame (obstime=2010-05-22T00:00:00.000, obsgeoloc=(0., 0., 0.) m,
obsgeovel=(0., 0., 0.) m / s)> to <ICRS Frame>. Angular separation can
depend on the direction of the transformation.
>>> moon.separation(star) 
<Angle 2.70390995 deg>
NonRotationTransformationWarning: transforming other coordinates from...

为什么这些人给出了如此不同的答案呢?

原因是 separation() 框架中测量的间隔。 SkyCoord 对象。所以 star.separation(moon) 给出了ICRS框架中的角度间隔。这是从太阳系重心分离出来的。对于一个地心观测者来说, moon.separation(star) 给出了正确答案,因为 moon 位于地心框架内。从上面的示例可以看出,默认情况下,如果坐标变换可能导致角度分隔值依赖于顺序,则会发出相应的警告。可以始终取消显示警告::

>>> moon.separation(star, origin_mismatch="ignore") 
<Angle 2.70390995 deg>

还可以禁止非纯旋转的坐标变换:

>>> moon.separation(star, origin_mismatch="error")
Traceback (most recent call last):
    ...
astropy.coordinates.errors.NonRotationTransformationError: refusing to
transform other coordinates from <ICRS Frame> to <GCRS Frame
(obstime=2010-05-22T00:00:00.000, obsgeoloc=(0., 0., 0.) m,
obsgeovel=(0., 0., 0.) m / s)> because angular separation can depend on
the direction of the transformation

地面物体的AltAz计算#

您可能会认为以下代码片断将生成恰好为90度的高度:

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

>>> t = Time('J2010')
>>> obj = EarthLocation(-1*u.deg, 52*u.deg, height=10.*u.km)
>>> home = EarthLocation(-1*u.deg, 52*u.deg, height=0.*u.km)
>>> aa = obj.get_itrs(t).transform_to(AltAz(obstime=t, location=home))
>>> aa.alt 
<Latitude 86.32878441 deg>

为什么结果离天顶有三度多的距离呢?只有非常仔细地看一看是什么,才有可能理解 obj.get_itrs(t) 返回。此调用提供源的ITRS位置 obj 。ITRS是一个地心坐标系,它包含了光的像差。因此,上面的代码提供了直接出现在头顶上的信号源的ITRS位置 对于地球中心的观测者来说

由于像差的原因,该光源的实际位置将偏离其表观位置约20.5角秒。因为这个震源距离地球半径大约一个地球半径,所以它的实际位置距离它看起来的位置大约600米。对于离地球表面10公里的一个物体来说,这个600米的位移是略高于3度的角度差-这就是为什么这个物体不会出现在头顶上的地心观测者的头上-一个在地球表面的观测者。

正确的方法来构造 SkyCoord 直接作为地心观测者开销的源的对象如下:

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

>>> t = Time('J2010')
>>> obj = EarthLocation(-1*u.deg, 52*u.deg, height=10.*u.km)
>>> home = EarthLocation(-1*u.deg, 52*u.deg, height=0.*u.km)

>>> # convert to AltAz
>>> aa = obj.get_itrs(t, location=home).transform_to(AltAz(obstime=t, location=home))
>>> aa.alt 
<Latitude 90. deg>