我只是想确保我了解 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 适用于所有角度作为弧度,所以我应该将 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°?

最佳答案

您对高度和方位角的理解听起来是正确的!对于南纬 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°,但是我必须在早上看到它们,因为我可以更好地想象角度!

关于python - PyEphem 角度说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11161028/

10-12 23:05