我只是想确保我了解 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 以弧度形式处理所有角度,因此我应该将 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°?
最佳答案
您对高度和方位角的理解听起来是正确的!对于南纬 30° 的人来说,南天极确实位于南方地平线上方 30°,正如您所描述的那样。
但是我们可以对您的代码进行一两个修复。
首先,拼写错误。您正在寻找的将度数转换为弧度的函数名为 ephem.degrees()
(注意复数)——如果您尝试将 ephem.degree
作为函数调用,则你会得到异常(exception):
TypeError: 'float' object is not callable
因为 ephem.degree
实际上是 float 0.0174532925199 因为这是度数的弧度数。而且您不能像调用函数一样调用 float !解决这个问题后,我们会为您的示例获取正确且有效的代码:
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 ,所以调用它的float()
实际上是没有必要的;你可以说:
az = ephem.degrees('180')
alt = ephem.degrees('30')
这两个值可以作为 radec_of()
的参数。事实上,您可以做得更好:因为 radec_of()
函数知道方位角和高度通常以度为单位给出,您可以将字符串传递给函数本身,它会假定数字你的字符串里面是用度数写的。因此,如果我们愿意,我们可以完全消除 az
和 alt
变量,只需说:
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°,但我必须在早上看它们,那时我可以更好地观察角度!
关于python - PyEphem 角度说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11161028/