与Stellarium/Heavens Above比较时,方位角和高度角不正确

编程语言 2026-07-08

我正在尝试使用Observer在十年前获取月球在天空中的位置。

然而,当我把得到的结果和在其他工具中看到的结果进行比较时(如 StellariumHeavens 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

这是它返回的结果:

2016/6/17 00:00:00, az: 225:14:04.3 alt: 22:39:57.1
2016/6/17 01:00:00, az: 237:11:35.0 alt: 14:01:20.4
2016/6/17 02:00:00, az: 247:39:16.9 alt: 4:14:48.0
2016/6/17 03:00:00, az: 257:12:44.1 alt: -6:13:14.5
2016/6/17 04:00:00, az: 266:28:32.6 alt: -17:02:50.8
2016/6/17 05:00:00, az: 276:07:35.3 alt: -27:56:50.5
2016/6/17 06:00:00, az: 287:04:21.1 alt: -38:36:14.4
2016/6/17 07:00:00, az: 300:43:43.3 alt: -48:32:48.9
2016/6/17 08:00:00, az: 319:19:51.6 alt: -56:54:34.2
2016/6/17 09:00:00, az: 345:03:43.4 alt: -62:05:11.4
2016/6/17 10:00:00, az: 15:06:48.5 alt: -62:10:44.3
2016/6/17 11:00:00, az: 41:03:48.1 alt: -57:09:22.3
2016/6/17 12:00:00, az: 59:52:41.1 alt: -48:54:30.6
2016/6/17 13:00:00, az: 73:41:17.7 alt: -39:04:13.6
2016/6/17 14:00:00, az: 84:45:15.3 alt: -28:31:50.2
2016/6/17 15:00:00, az: 94:30:40.2 alt: -17:46:22.8
2016/6/17 16:00:00, az: 103:52:30.5 alt: -7:07:28.7
2016/6/17 17:00:00, az: 113:31:23.2 alt: 3:07:06.5
2016/6/17 18:00:00, az: 124:02:35.1 alt: 12:36:56.6
2016/6/17 19:00:00, az: 135:58:38.9 alt: 20:55:31.1
2016/6/17 20:00:00, az: 149:43:57.4 alt: 27:28:19.0
2016/6/17 21:00:00, az: 165:18:32.5 alt: 31:35:23.2
2016/6/17 22:00:00, az: 181:59:17.9 alt: 32:42:46.6
2016/6/17 23:00:00, az: 198:27:00.7 alt: 30:39:37.3

以00:00:00h为例,结果如下:

工具 方位角 高度角
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º

显然,ephem的结果似乎与Stellarium和 Heavens Above的说法不一致。

我的第一反应是这与时区有关,因为结果似乎有点偏移(例如如果我把Stellarium的模拟向上移动03:42:00h,我会得到与ephem的 00:00:00h相似的结果)。然而,我尝试实现我的本地时区(以下片段)但没有成功,输出中没有任何变化:

import ephem
from zoneinfo import ZoneInfo

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')
zone = ZoneInfo("Europe/Madrid")
observer.date = ephem.to_timezone(d, zone)

for _ in range(24):
    moon = ephem.Moon(observer)
    print('%s, az: %s alt: %s' % (observer.date, moon.az, moon.alt))
    observer.date += ephem.hour

我查阅了关于同一主题的其他问题,大多数都在设置观测点的纬度和经度时出错,但我已经以字符串格式进行设置,所以那不可能是原因。

我到底错在哪儿?

解决方案

在文档中我找到了 Time zones

PyEphem的 Date类型本身不支持时区。所有PyEphem日期都以世界时(UTC)表示,这与英国格林威治的标准时间相似。

以及 Dates

日期始终使用世界时,永远不使用本地时区。

所以看起来你必须把本地时间转换为UTC。

如果你住在 UTC+2,那么你可以使用

observer.date -= 2*ephem.hour

将日期/时间换算为用于计算的 UTC


如果你想对你当前的本地时间进行计算,那么命令 ephem.now() 已经把这段时间转换为 UTC(作为 epham.Date)。

observer.date = ephem.now()

而命令 ephem.localtime(ephem.now()) 给出你的本地时间
但以 datetime.DateTime 对象的形式,而不是 ephem.Date


顺便说一句:

你可以使用城市名来获取位置

observer = ephem.city("Barcelona")
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章