PyEphem角度澄清

4

我希望确保我理解PyEphem在处理角度方面的工作。

假设我有一个观察者在南纬30°,西经60°,今天正午观察天空。

所以我这样做:

obs = ephem.Observer()
obs.lat, obs.lon = '-30', '-60'
obs.date = '2012/6/22 12:00:00'

现在我想找出观察者在特定方位角和高度时所看到的天球(以赤经和赤纬表示)的哪一部分。 我可以这样做:

obs.radec_of(az,alt)

这里是我困惑的地方。据我了解,PyEphem适用于所有角度为弧度值,因此我应该将azalt作为弧度输入。那么,0°高度是否为地平线,90°高度是否直接在头顶上,-90°是否指向地面?如果是这样的话,PyEphem是否认为95°高度与85°相同,还是会滚动到-85°?
此外,如果观测者想看南天极,这是正确的代码吗?
az = float( ephem.degree('180') )
alt = float( ephem.degree('30') )
ra, dec = obs.radec_of(az,alt)

或者高度应该是-30°吗?

UTC的12:00并不对应于30° S,60° W的中午。 - jfs
2个回答

4
你对高度和方位角的理解是正确的!对于南纬30度的人来说,南天极确实位于南方地平线上方30度,正如你所描述的那样。
但是,有一两个问题需要修复你的代码。
首先,一个拼写错误。将角度转换为弧度的函数应该命名为ephem.degrees()(注意复数形式)——如果你尝试调用ephem.degree作为函数,你会得到异常:
TypeError: 'float' object is not callable

因为 ephem.degree 实际上是浮点数0.0174532925199,因为这是一度中有多少弧度。而你不能像调用函数一样调用一个浮点数!修复这个问题,我们可以得到你的示例的正确和可用代码:

az = float(ephem.degrees('180'))
alt = float(ephem.degrees('30'))
ra, dec = obs.radec_of(az,alt)
print ra, dec

→ 12:30:10.05 -89:53:54.7

我们可以让代码变得更加简单!

首先, ephem.degrees() 的返回值已经是浮点数了,所以不需要使用 float() 函数;你只需要这样写:

az = ephem.degrees('180')
alt = ephem.degrees('30')

这两个值可以作为radec_of()函数的参数。实际上,你可以做得更好:因为radec_of()函数知道方位角和高度角通常以度数给出,所以你可以直接将字符串交给函数,它会假定你的字符串中的数字是以度数写的。所以如果需要,我们甚至可以完全省略azalt变量,只需这样写:

ra, dec = obs.radec_of('180', '30')

最后,你可能会想知道为什么我们得到的赤经和赤纬虽然很接近南极,但并不是完全精确。第一个原因是PyEphem考虑了大气折射,这会提高物体在低海拔角度下相对于地平线的表观高度。如果我们让Observer对象忽略大气效应(通过告诉它我们所处的地方没有空气——大气压力为零),那么返回值将更接近南极:
obs.pressure = 0
ra, dec = obs.radec_of('180', '30')
print ra, dec

→ 12:24:25.48 -89:55:15.9

显然,这使我们更接近目标。还有一两个问题涉及进动和甚至章动,我们需要解决才能将赤纬实际下降到完整的-90度,但我必须在早上看角度更清晰时再去处理它们!


4
回答你的另一个问题:像95°这样的高度既不被简单地认为是与85°相同,也不被PyEphem认为是在我们脚下的-85°高度以下。相反,它认为95°的意思是“沿着你正在追踪的方位线一直往上走——一直往上走,直到最后到达天顶并处于90°——然后继续向另一侧的天空前进5度,将您带到完全相反的方位线下的五度处。”
因此,如果您询问方位和高度(15°,95°)的点,则PyEphem会认为它是沿着15°线一直向上走,然后再向远处走,以便您开始沿着天顶另一侧的195°方位线向后走。因此,您谈论的方位和高度的“标准化”名称为(195°,90°-5°)=(195°,85°)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接