使用ephem计算的月球方位角/高度与Stellarium等工具不符问题
问题:ephem计算月球方位角/高度与Stellarium、Heavens Above结果差异显著
我尝试用ephem的Observer获取2016年6月17日某观测点的月球天空位置,但计算出的Azimuth(方位角)和Altitude(高度)与Stellarium、Heavens Above工具的结果存在明显差异。
我的代码如下:
import ephem observer = ephem.Observer() observer.name = "Observation Point" observer.lat = '41.39858935189999' observer.lon = '2.1853450576007365' observer.elevation = 18 # meters observer.pressure = 0 d = ephem.Date('2016/06/17 00:00') observer.date = d for _ in range(24): moon = ephem.Moon(observer) print('%s, az: %s alt: %s' % (observer.date, moon.az, moon.alt)) observer.date += ephem.hour
输出结果与其他工具的对比如下:
| 工具 | az | alt |
|---|---|---|
| ephem | 225:14:04.3 (225º 14' 4.3") | 22:39:57.1 (22º 39' 57.1") |
| Stellarium | 195º 15' 25.0" | 34º 03' 31.0" |
| Heavens Above | 195.3º | 34.1º |
我最初以为是时区问题,尝试设置Europe/Madrid时区后结果还是没变,而且已经确认观测点经纬度是字符串格式。请问我还漏掉了什么?
解决方法
问题核心是时间时区的解析差异:
你传入的'2016/06/17 00:00'被ephem默认解析为UTC时间,但Stellarium和Heavens Above默认使用观测点的本地时间(马德里2016年6月处于夏令时,本地时间比UTC快2小时)。本地时间2016/06/17 00:00对应UTC时间2016/06/16 22:00,2小时的时间差直接导致月球位置计算出现显著偏差。
ephem不支持直接设置时区名称,需要手动将本地时间转换为UTC时间传入,或者通过ephem.localtime()做格式转换。
修改后的代码示例
import ephem observer = ephem.Observer() observer.name = "Observation Point" observer.lat = '41.39858935189999' observer.lon = '2.1853450576007365' observer.elevation = 18 # meters observer.pressure = 0 # 马德里夏令时(UTC+2)的2016/06/17 00:00 对应UTC时间2016/06/16 22:00 d = ephem.Date('2016/06/16 22:00') observer.date = d for _ in range(24): moon = ephem.Moon(observer) # 将UTC时间转回本地时间,方便和其他工具对比 local_time = ephem.localtime(observer.date) # 把弧度值转换为十进制角度,和其他工具的输出格式统一 az_degrees = float(moon.az) * 180 / ephem.pi alt_degrees = float(moon.alt) * 180 / ephem.pi print(f'{local_time}, az: {az_degrees:.1f}° alt: {alt_degrees:.1f}°') observer.date += ephem.hour
额外注意事项
- ephem返回的
moon.az和moon.alt是弧度值,直接打印会显示为时分秒格式,转换为十进制角度更便于和其他工具对比; - 你设置了
observer.pressure = 0关闭了大气折射修正,若要完全匹配其他工具结果,需检查Stellarium/Heavens Above的折射设置是否一致。
内容的提问来源于stack exchange,提问作者Adir
相关产品推荐
相关产品推荐

