AstroPy:如何将GCRS框架中的SkyCoord对象转换为垂直轴框架?

时间:2018-12-14 03:56:09

标签: coordinates transform astropy

AstroPy 中,get_sun()方法将太阳的赤道坐标作为GCRS坐标系中的SkyCoord对象返回。如何将这些坐标转换为 topocentric 框架以获取太阳的地心赤道坐标?

我已经看过transform_to()方法,但是它似乎没有提供垂直轴框架。我在文档中的某个地方看到了这样的说法:“内置到天花的帧类是ICRS,FK5,FK4,FK4NoETerms,Galactic和AltAz。”这是否意味着要转换成垂心框架,我必须定义一个新类作为BaseCoordinateFrame类的子集?

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

我想知道这是否已经在AstroPy中作为现成的功能实现了?

编辑2:在我看来,如果我仍然保留GCRS框架,但从[...]更改obsgeolocobsgeovel参数,我应该得到期望的结果默认值(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)>

2 个答案:

答案 0 :(得分:3)

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

在这种情况下,您可以使用get_sun而不是使用astropy.coordinates.get_body来始终使用地心原点返回坐标,而使用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)>

答案 1 :(得分:0)

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

因此,您可以通过设置Earth Location对象并转换为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)>