【问题标题】:Getting J2000 XYZ coordinates for a location on earth in Python在 Python 中获取地球上某个位置的 J2000 XYZ 坐标
【发布时间】:2012-08-14 17:29:29
【问题描述】:

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

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

***************** 旧(忽略)******************

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

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

X 指向北

Y 点西

Z 指向天空

【问题讨论】:

  • X-Y-Z 在什么坐标系中?例如你的出身在哪里?你如何确定 X 和 Y 轴指向什么?例如,我可以定义一个 [非惯性] 坐标系,其中 X 轴指向月球中心,原点位于地球中心。那么月球的坐标是 (384,400km, 0, 0),但我怀疑这就是你想要的。
  • 请在我的原始帖子中查看我的版本。
  • 我不确定 J2000 参考框架的约定。为了清楚起见,我们假设 x 指向北方,Y 指向西方,Z 指向上方。
  • 感谢您的澄清!在我去编辑我的答案之前,你能看看这个链接并确认维基百科定义的 X-Y-Z 是你需要的那个吗?我必须承认:在你问这个问题之前,我一直以为 J2000 的所有活动都是在极坐标中完成的!所以我从你的问题中学到了一些东西。 :) 链接:en.wikipedia.org/wiki/Earth-centered_inertial#J2000
  • 是的,这正是我想要获得的坐标系。 AERONET @ NASA 主要使用 XYZ 格式的 J2000 坐标。再次感谢您的帮助。

标签: python coordinate-transformation astronomy pyephem


【解决方案1】:

最佳答案:

我刚刚注意到,在 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 小时正好是一半),以及推动位置的偏角有点南。因此,我们得出的xyzz 是一个略微负数,因为-6° 确实在赤道以南,而xy 都是负数因为绕 24 小时圆走 13 小时会使您处于正常单位圆的负/负象限。

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

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

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

【讨论】:

  • 哦:而且,请注意,这段代码效率稍低,因为它计算了两次余弦——我这样写只是为了让想法更简单,但在生产代码中你可能想做cos_alt = math.cos(m.alt)首先在 xy 方程中使用该值两次!
  • 感谢您的解释。简而言之,我将月球光度计指向月球以测量辐照度、AOD 等。我正在使用 MICA 查找表来获取月球位置(天顶角和方位角)。我必须将这些月亮角度转换为 J2000 坐标。在此之后,我假设我使用的 m.ra 和 me.dec 角度是 J2000 极坐标(请验证我的假设是否正确)。然后我只是将这些极坐标转换为 J2000 x,y z 坐标。我正在使用这些来生成 ROLO 文件。
  • 现在,我正在使用(由您提供)的转换是我描述的转换吗?我对这一切都不熟悉。
  • 什么是 ROLO 文件——你能给我指出一些他们的文档吗?这将帮助我了解我计算的 XYZ 坐标是否真的是你需要的。 :)
  • 我刚刚发现我真的不需要这些月球转换。相反,我需要将地球上的纬度和经度位置转换为 J2000 (GEI) 坐标。 ROLO 文件基本上只是 txt 文件,在三个不同的列中带有 x y z 坐标,并带有日期戳。请查看我对原始问题的编辑。
【解决方案2】:

我建议您查看PyEphem documentationcoordinate conversion

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

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

编辑:您的“X-Y-Z”坐标似乎是左手黄道坐标。

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

【讨论】:

  • 请查看我在我的问题中制作的版本。基本上,我没有在坐标系之间进行转换。 Ra/Dec 均在赤道 (J2000) 坐标系中。我只想将 ra/dec 转换为 X Y Z。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2015-04-06
相关资源
最近更新 更多