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

Coordinates AstroPy:如何将GCRS框架中的SkyCoord对象转换为地心框架?,coordinates,transform,astropy,Coordinates,Transform,Astropy,在AstroPy中,get_sun()方法将太阳的赤道坐标作为GCRS坐标框中的SkyCoord对象返回。如何将这些坐标转换为地心坐标帧以获得太阳的地心赤道坐标 我已经研究了transform\u to()方法,但它似乎没有提供以拓扑为中心的框架。在文档中的某个地方,我看到了这样一句话:“astropy中内置的框架类是ICRS、FK5、FK4、FK4NoETerms、Galactic和AltAz。”这是否意味着,对于向地心框架的转换,我必须将一个新类定义为baseCoordinateName类的

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

我已经研究了
transform\u to()
方法,但它似乎没有提供以拓扑为中心的框架。在文档中的某个地方,我看到了这样一句话:“astropy中内置的框架类是ICRS、FK5、FK4、FK4NoETerms、Galactic和AltAz。”这是否意味着,对于向地心框架的转换,我必须将一个新类定义为
baseCoordinateName
类的子类

编辑:可以在这里看到数学背景(Dieudonné的答案):

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

编辑2:在我看来,如果我仍然保留GCRS帧,但将
obsgeoloc
obsgeovel
参数从默认值(0,0,0)更改为实际位置的值,我应该会得到所需的结果。但是我该怎么做呢

编辑3:我已经设法至少更改了
obsgeoloc
,但这没有什么区别,我得到了相同的赤道坐标,除非我做错了什么,或者只是误解了整件事,或者可能差异不明显,因为坐标值的精度是8位小数?(我仍然不知道obsgevel的值是多少,但即使我使用了一些任意值,我也会得到相同的坐标。)


根据我对维基百科文章的阅读,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)>
>>从astropy.coordinates导入地球定位、SkyCoord、get_sun、AltAz
>>>从astropy.time导入时间
>>>将astropy.units导入为u
>>>萨姆纳堡=地球位置(纬度=34.4900*u.deg,经度=104.221800*u.deg,高度=40*u.km)
>>>获取太阳(时间(“2018-12-01T00:00:00”)。将太阳转换为(阿尔塔兹(地点=萨姆纳堡))

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

在这种情况下,您可以使用
astropy.coordinates.get_body
,而不是使用
get_sun
(始终返回以地心为原点的坐标),它允许使用
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)>
>>从astropy.coordinates导入地球定位,获取身体
>>>从astropy.time导入时间
>>>位置=_站点('lapalma')的地球位置
>>>t=Time.now()
>>>太阳=获取物体(“太阳”,t,位置)
>>>太阳=获取物体(“太阳”,t)

AltAz框架产生地心高度和方位角,但我需要地心直角上升和下降。我对我的问题添加了两个编辑,也许它们会有所帮助。你在这一点上有点超出我的专业领域,我的直觉是你需要一个新框架。我会问更多的人。地心说的是从地球表面的某个地方(与地心说相反)。坐标的选择不受地形中心位置的限制;可以有地心坐标(RA,Dec),(HA,Dec),(Alt,Az),(ZD,Az)-大多数坐标对都可以在地心坐标系或地心坐标系中使用。
>>> 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)>