<p><strong>最佳答案:</strong></p>
<p>我刚刚注意到,2011年6月,海军天文台发布了一个强大的NOVAS参考软件的Python接口,使用该接口可以执行最高精度的天文计算:</p>
<p><a href="http://aa.usno.navy.mil/software/novas/novas_py/novaspy_intro.php" rel="nofollow">http://aa.usno.navy.mil/software/novas/novas_py/novaspy_intro.php</a></p>
<p>有了这个库,你可以得到你正在寻找的答案,其精度远远高于毕节所提供的:</p>
<pre><code>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)
</code></pre>
<p>在我的机器上,这给出了答案:</p>
<p>(-3.5081406460494928e-06、3.135277713623258e-05、2.858239912567112e-05),
(-0.00019753847060164693,-2.232994271278055E-05,2.4885824275734915e-07)</p>
<p>你自己试试看这是否能给你所需要的结果!</p>
<hr/>
<p><strong>较新的答案:</strong></p>
<p>似乎答案是“不”—令我惊讶的是,皮埃芬并没有给出一个简单的方法来回答这个问题:“在<em>x,y,z</em>坐标系中,波士顿在时间<em>t</em>?“。”</p>
<p>这是一个惊喜,因为“libastro”,即PyEphem后面的库,当然必须在内部计算这个,以便找出其他对象相对于观察者的位置。似乎有两个地方是这样。在<code>parallax.c</code>中,它定义了<code>ta_par()</code>,它只讨论外部的角度,但在内部,您可以看到它临时计算观察者的<em>x,y,z</em>。你甚至可以看到隐藏在里面的重要常数<code>298.257</code>,它测量地球有多平坦,因为地球不是一个完美的球体。</p>
<p>另一个地方在<code>earthsat.c</code>中,它看起来与“libastro”的其余部分完全不同,因此它复制了一些逻辑。它的<code>EarthFlat</code>常数<code>298.25</code>有点不太精确,但做的是相同的工作。它的函数<code>GetSitPosition()</code>实际上公开了<em>x,y,z</em>坐标,而不是隐藏它们。但是它被声明为<code>static</code>,所以没有办法从外部调用这个有用的函数!</p>
<p>所以目前,PyEphem无法直接计算x,y,z</em>。但它确实提供了一个重要的信息:当前的恒星时间,你(我认为)可以用它来计算波士顿(或任何地方)在地球周围经过的时间有多远,这对计算你的坐标很重要。</p>
<p>我将看看能否用Python编写一个快速的解决方案,将PyEphem中的小时角与一些显式三角法结合起来,得到一个答案。但是,就目前而言,不:不幸的是,PyEphem没有直接公开这些信息;我将把它放在未来版本的清单上!</p>
<hr/>
<p><strong>较老的答案,从问题是关于月球的位置时起:</strong></p>
<p>遗憾的是,PyEphem没有内置的功能,可以将业余天文学中使用的极坐标转换为x/y/z坐标,这样就可以绘制出地球周围空间中物体的分布情况。但是你自己很容易转换:</p>
<pre><code>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)
</code></pre>
<p>此脚本的输出为:</p>
<pre><code>12:58:51.20 -6:24:05.6
-0.961178016954 -0.252399543786 -0.111495695074
sanity check: vector length = 1.0
</code></pre>
<p>我在这里使用的随机日期的火星位置是相当合理的值:一个在大圆的一半以上几乎一个小时的RA(因为12小时正好是一半),以及一个将位置推向南边一点的偏斜。因此,我们得到的<code>x</code>、<code>y</code>和<code>z</code>:由于-6°确实在赤道以南,<code>x</code>和<code>y</code>都是负数,因为在一个24小时的圆上绕13小时会使你处于一个正常单位圆的负/负象限。</p>
<p>请注意,尽管J2000有一个北和南-因此我们可以如实地说,稍负的<code>z</code>是一个向南的方向-它确实有一个东和西,因为它下面的地球在不断地向东和西摆动。相反,RA从“Ares的第一点”开始测量,即春分时太阳所在的方向。所以<code>x</code>和<code>y</code>不是东方或西方;它们是指向太阳系的坐标,在一个固定的轴上,由地球每年春天所在的方向来定义。</p>
<p>我创建的这个<code>x</code><code>y</code><code>z</code>向量是一个“单位向量”——一个大小为1.0的小向量,我在脚本中验证了这一点,以确保公式正确无误。如果你在计算距离地球的物体的<code>x</code>{<cd11>}和<code>z</code>坐标,那么你就可以得到一个真正的向量,其大小是距离,而不是1的分数,将三个<code>x</code><code>y</code>和<code>z</code>乘以到物体的距离。</p>
<p>这对你有帮助吗?从你的描述——还有你关于东西方的问题——我不知道你是想让RA和dec变成<code>x</code><code>y</code><code>z</code>,还是你真的想转换方位角和高度(但两者的数学公式都是一样的)。看起来像是:</p>
<pre><code>x = math.cos(m.alt) * math.cos(m.az)
y = math.cos(m.alt) * math.sin(m.az)
z = math.sin(m.alt)
</code></pre>
<p>你想用这些坐标来完成什么?这将有助于我们确保以一种有用的格式将它们提供给您。</p>