0

在日出时,太阳应该在地平线上(即东部海拔 0 度)。但如果我检查黄道经度:

  1. 日出时的太阳和
  2. from_altaz() 东零度

我对两者都有不同的价值。但它不应该是一样的吗?

from skyfield import almanac, api
from pytz import timezone
from datetime import datetime, timedelta


ts = api.load.timescale(builtin=True)
eph = api.load('de421.bsp')
earth = eph['EARTH']
sun = eph['SUN']
tz = timezone('UTC')

# 2019-12-23 01:23:58.273000+00:00
testTime = datetime(year=2019, month=12, day=23, hour=1,
                    minute=23, second=58)
testTime = tz.localize(testTime)

lat = '33.775867N'
lon = '84.39733E'
observer = api.Topos(lat, lon)

t0 = ts.utc(testTime)
t1 = ts.utc(testTime + timedelta(days=1))
t, y = almanac.find_discrete(t0, t1, almanac.sunrise_sunset(eph, observer))
for i, j in zip(t, y):
    if j:
        print('Sunrise : ', i.utc_datetime().astimezone(tz), j)

observer = earth + api.Topos(lat, lon)

zeroDegreeEast = observer.at(t0).from_altaz(alt_degrees=0, az_degrees=90)
_, lonAtHorizon, _ = zeroDegreeEast.ecliptic_latlon(epoch=t0)

sunAtSunRise = observer.at(t0).observe(sun).apparent()
_, lonSun, _ = sunAtSunRise.ecliptic_latlon(epoch=t0)
print('TestDate: ', testTime.isoformat())
print(lonAtHorizon)
print(lonSun)
Sunrise :  2019-12-23 01:23:58.273000+00:00 True
TestDate:  2019-12-23T01:23:58+00:00
288deg 05' 48.3"
270deg 53' 48.0"

我错过了什么?

我能做些什么来获得相同的值吗?

4

1 回答 1

1

您的脚本没有考虑两个额外的影响。

  1. 根据定义,日出是指太阳的中心在地平线以下 0.8333 度时,因为它有半度宽,另外它的图像向上折射并且由于大气的原因提前可见。
  2. 由于季节的关系,太阳从不直接从东方升起。

您可以询问您计算出的日出时刻太阳在地平线上的位置,以解释第二个效应:

alt, az, distance = ((observer + eph['earth']).at(t[0])
                     .observe(eph['sun']).apparent().altaz())
print(alt, az)
print(az.degrees)

哪个打印:

-00deg 49' 59.9" 117deg 57' 17.6"
117.95487601490409

或正东以南约 27°。然后,您可以通过调整您正在计算的 altaz 来解释第一个效果:

zeroDegreeEast = observer.at(t0).from_altaz(alt_degrees=-0.8333, az_degrees=117.954)

结果应该非常接近您的预期。

于 2019-12-06T21:24:33.923 回答