2

编辑:刚刚发现我需要将地球上某个位置的纬度、经度和海拔转换为 J2000 坐标,与 ra/dec 或月球无关。非常遗憾。你的回答确实给了我很多见解。请参阅下面的编辑问题。

问题:如何将纬度、经度和海拔转换为 J2000 坐标 (XYZ)。ehem 中是否存在转换?我检查了文档,但找不到我需要的东西(或者由于我缺乏该领域的知识而可能忽略了一些东西)。谢谢

** * ** * ** * ** * ** * **旧(无视)** * ** * ** * ** * ** * ***

我在赤经 (RA) 和赤纬 (Dec) 中有月亮位置,我想将它们转换为 XYZ 坐标。是否有内置的 PyEphem 函数?另外,它背后的数学原理是什么?谢谢。

编辑:我正在使用 J2000 坐标系(我认为这是赤道的,这是我第一次使用天文学)。我有到月球的距离可用。ra/dec 值已经在 J​​2000(赤道)坐标中。

X 指向北方

Y 点西

Z指向天空

4

2 回答 2

2

最佳答案:

我刚刚注意到,在 2011 年 6 月,海军天文台发布了一个 Python 接口,用于连接强大的 NOVAS 参考软件,使用该软件执行最高精度的天文计算:

http://aa.usno.navy.mil/software/novas/novas_py/novaspy_intro.php

使用这个库,您可以获得您正在寻找的答案,其精度远高于 PyEphem 提供的精度:

from novas import compat as novas
jd_tt = novas.julian_date(2012, 9, 8, 12.00)
delta_t = 66.603  # from http://maia.usno.navy.mil/ser7/deltat.preds
lat = 42.3583     # positive is north
lon = -71.0603    # negative is west
observer = novas.make_observer_on_surface(lat, lon, 0, 0, 0)
print novas.geo_posvel(jd_tt, delta_t, observer)

在我的机器上,这给出了答案:

((-3.5081406460494928e-06, 3.135277713623258e-05, 2.858239912567112e-05), (-0.00019753847060164693, -2.23299422712780555e-05, 72.48)555e-05, 72.48)

自己尝试一下,看看这是否能给你带来你需要的结果!


较新的答案:

答案似乎是“不”——令我惊讶的是,PyEphem 没有简单的方法来回答“在x、y、z坐标中,波士顿在时间t在哪里?”</ p>

这是一个惊喜,因为 PyEphem 背后的库“libastro”当然必须在内部进行计算,以便确定其他对象相对于观察者的位置。它似乎在两个地方这样做。在parallax.c它定义ta_par()which 只谈论外部的角度,但在它的内部你可以看到它临时计算观察者的x、y、z。你甚至可以看到298.257隐藏在其中的重要常数,它衡量地球的平坦程度,因为它不是一个完美的球体。

另一个地方是earthsat.c看起来与“libastro”的其余部分完全不同的代码库,因此它复制了一些逻辑。它的EarthFlat常数 of298.25不太精确,但做同样的工作。它的功能,GetSitPosition()实际上是暴露x,y,z坐标而不是隐藏它们。但是它被声明static了,所以没有办法从外部调用这个有用的函数!

所以目前,PyEphem 无法让您直接计算x,y,z。但它确实提供了一条重要的信息:当前的恒星时,你将(我认为)能够使用它来计算波士顿(或任何地方)按时间绕地球走了多远t,这对于弄清楚你的坐标。

我会看看我是否可以在 Python 中找到一个快速的解决方案,将 PyEphem 的小时角与一些明确的三角函数结合起来,为您提供答案。但是,目前还没有:PyEphem 并没有直接公开这些信息,这很可悲。我会把它放在未来版本的清单上!


较早的答案,从问题是关于月球的x,y,z位置开始:

唉,PyEphem 没有内置函数来将业余天文学中使用的极坐标转换为 x/y/z 坐标,这将使您能够绘制出物体在地球周围空间中的分布情况。但是转换很容易自己完成:

import ephem
import math

m = ephem.Mars('2012/8/1')
print m.ra, m.dec

x = math.cos(m.dec) * math.cos(m.ra)
y = math.cos(m.dec) * math.sin(m.ra)
z = math.sin(m.dec)

print x, y, z
print 'sanity check: vector length =', math.sqrt(x*x + y*y + z*z)

这个脚本的输出是:

12:58:51.20 -6:24:05.6
-0.961178016954 -0.252399543786 -0.111495695074
sanity check: vector length = 1.0

我在这里使用的随机日期的火星位置是相当合理的值:RA 几乎比大圆的一半多一个小时(因为 12 小时正好是一半),以及将位置推向南一点的赤纬. 因此,我们得出的x,和 :y是一个略微负数,因为 -6° 确实在赤道以南,并且和都是负数,因为绕 24 小时圆走 13 小时会使您处于负/负象限 a正常单位圆。zzxy

请注意,虽然 J2000 有南北——所以我们可以如实说,稍微负z一点的方向是向南——它没有东西,因为在它下方转动的地球在各个方向不断地向东和向西摆动。相反,RA 从“阿瑞斯的第一点”开始测量,这是春分期间太阳所在的方向。so xandy不是东方或西方;它们是指向太阳系的坐标,位于固定轴上,该轴由地球在每个春天所处的方向定义。

我创建的这个x y z向量是一个“单位向量”——一个大小为 1.0 的小向量,正如我在脚本中验证的那样,以确保我的公式正确。如果您正在计算已知与地球距离的物体的坐标x y和坐标,那么您可以通过将三个中的每一个乘以到物体的距离来获得一个实数向量——其大小是距离,而不是 1 的分数。zx yz

这对你有帮助吗?从你的描述——以及你关于东西方的问题——我无法判断你是否想要 RA 和 dec 转换x y z,或者你是否真的想要转换方位角和高度(但无论哪种方式,数学都是相同的)。这看起来像:

x = math.cos(m.alt) * math.cos(m.az)
y = math.cos(m.alt) * math.sin(m.az)
z = math.sin(m.alt)

你想用这些坐标完成什么?这可以帮助我们确保以有用的格式将它们提供给您。

于 2012-08-15T02:40:50.450 回答
0

我建议您查看PyEphem 文档以进行坐标转换

基本上,PyEphem 只处理三个坐标系——赤道、黄道和银河——每个坐标系由两个角度和一个纪元(极坐标调整偏移)定义。

根据您的坐标方案的外观,如果您也有对象的距离,您应该能够使用三角函数来转换它。

编辑:您的“XYZ”坐标似乎是左手黄道坐标。

from ephem import Equatorial, Ecliptic, degree

def convert_equatorial_to_XYZ(ra, dec, dist=1.0, epoch='2000'):
    """
    Given
        ra     right ascension (in hours)
        dec    declination     (in degrees)
        dist   distance        (optional, defaults to 1.0)
        epoch  epoch           (optional, assumes J2000)
    Return
        degrees North, degrees West, distance
    """
    eq = Equatorial(ra, dec, epoch=epoch)
    ec = Ecliptic(eq)
    return ec.lat/degree, 360.0 - ec.lon/degree, dist
于 2012-08-14T17:55:49.143 回答