最佳答案:
我刚刚注意到,在 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.2329942271278055e-05, 2.4885824275734915e-07))
自己尝试一下,看看这是否能给你带来你需要的结果!
较新的答案:
答案似乎是“否”——令我惊讶的是,PyEphem 没有给出简单的方法来回答“在 x,y,z 坐标中的位置是 (比如说)波士顿在 t 时间?”
这是一个惊喜,因为 PyEphem 背后的库“libastro”当然必须在内部进行计算,以便确定其他对象相对于观察者的位置。它似乎在两个地方这样做。在parallax.c 中,它定义了ta_par(),它只讨论外部的角度,但在其内部你可以看到它临时计算观察者的x, y, z。你甚至可以看到隐藏在其中的重要常数298.257,它衡量地球的平坦程度,因为它不是一个完美的球体。
另一个地方是earthsat.c,它看起来与“libastro”的其余部分完全不同,因此它复制了一些逻辑。其EarthFlat 常量298.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 比大圆的一半多出近 1 小时(因为 12 小时正好是一半),以及推动位置的偏角有点南。因此,我们得出的x、y 和z:z 是一个略微负数,因为-6° 确实在赤道以南,而x 和y 都是负数因为绕 24 小时圆走 13 小时会使您处于正常单位圆的负/负象限。
请注意,虽然 J2000 有一个南北方向——所以我们可以如实说略负的z 是一个南方向——它确实没有有东西方向,因为地球在它下方转动,它不断向各个方向东向和西向摆动。相反,RA 从“阿瑞斯的第一点”开始测量,即春分期间太阳所在的方向。所以x 和y 不是东也不是西;它们是指向太阳系的坐标,位于固定轴上,该轴由地球在每个春天所处的方向定义。
我创建的这个 x y z 向量是一个“单位向量”——一个大小为 1.0 的小向量,正如我在脚本中验证的那样,以确保我的公式正确。如果您正在计算您知道与地球距离的物体的 x y 和 z 坐标,那么您可以通过将这三个中的每一个相乘得到一个实向量——其大小是距离,而不是 1 的分数x y 和 z 到对象的距离。
这对你有帮助吗?从你的描述——以及你关于东西方的问题——我无法判断你是否想要 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)
你想用这些坐标完成什么?这可以帮助我们确保以有用的格式提供给您。