我想确保我理解PyEphem在角度方面所做的事情。
假设我有一个观察者在30°S,60°W今天中午看着天空。 所以我这样做:
obs = ephem.Observer()
obs.lat, obs.lon = '-30', '-60'
obs.date = '2012/6/22 12:00:00'
现在我想找到观察者在观察某个方位角和高度时看到的天球的哪一部分(在RA和赤纬中)。我能做到:
obs.radec_of(az,alt)
这是我困惑的地方。根据我的理解,PyEphem以各种角度作为弧度,所以我应该将az
和alt
作为弧度。那么,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°?
答案 0 :(得分: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()
函数知道方位角和高度传统上以度为单位,你可以将字符串交给函数本身,它会假设你的字符串里面的数字是用学位写的。因此,如果我们愿意,我们可以完全删除az
和alt
变量,并且只说:
ra, dec = obs.radec_of('180', '30')
最后,你可能想知道为什么我们回来的RA和赤纬在南极并不完全完全,即使它们很接近。
第一个原因是PyEphem考虑了大气折射,它提升了低海拔地平线以上物体的视在高度。如果我们告诉Observer
物体忽略大气效应(告诉它我们居住的地方没有空气 - 大气压力为零),那么返回值将更接近南极:
obs.pressure = 0
ra, dec = obs.radec_of('180', '30')
print ra, dec
→ 12:24:25.48 -89:55:15.9
显然,这让我们更接近了。还有一两个问题涉及岁差,甚至可能是章动,我们需要解决这个问题才能真正将赤纬降低到-90°,但是我必须在早上看到它们才能更好地可视化角度!
答案 1 :(得分:4)
要回答你的另一个问题:像95°这样的高度只被认为与85°相同,和 PyEphem认为它低于我们的在-85°高度的最低点附近的脚。相反,它认为95°意思是“沿着你正在跟随的方位线上行 - 向上,向上,向上,直到最后你到达天顶并且是90° - 然后继续前进< / em>在天空的另一边五度,向你带来完全相反的方位角五度。“
因此,如果你询问方位角和海拔高度(15°,95°)的点,那么PyEphem会认为它会一直向上走15°线然后再往前走以便你开始回归向下天顶另一侧的195°方位角线。所以你所说的方位角和高度的“标准化”名称是(195°,90° - 5°)=(195°,85°)。