我在python中使用Skyfield实现了sgp4算法。
我需要1天时间间隔的位置向量,周期为1秒。为此,我必须反复计算sgp4,每次增加1秒。
有没有办法返回一个包含所有位置的向量?
答案 0 :(得分:1)
幸运的是,Skyfield是为NumPy数组的时间对象设计的,它将生成与数组中的对象一样多的位置。这是文档中描述此功能的部分:
http://rhodesmill.org/skyfield/time.html#date-arrays
这是一个完成您描述的任务的示例:
from numpy import arange
from skyfield.api import load, EarthSatellite
iss_tle0 = """\
1 25544U 98067A 18184.80969102 .00001614 00000-0 31745-4 0 9993
2 25544 51.6414 295.8524 0003435 262.6267 204.2868 15.54005638121106
"""
my_earthsat = EarthSatellite(*iss_tle0.splitlines())
tz_offset = -4
ts = load.timescale()
t = ts.utc(2018, 6, 21, tz_offset, 0, arange(24 * 60 * 60))
astrometrics = my_earthsat.at(t)
此代码目前还不是特别快,因为尚未对地球卫星的计算进行优化,但是比手动循环构造多个时间对象要快。
答案 1 :(得分:0)
您可以通过创建一个skyfield.EarthSatellite
对象(来自TLE)的方式,然后每次生成astrometric
对象的方式来做到这一点。您需要将时间列表指定为可识别时区的datetime对象。您可以使用类似的方式创建时间列表(可能有很多空间可以提高效率)
from datetime import timezone, timedelta, datetime
from skyfield.api import load
ts = load.timescale() # create skyfield timescale object
tz = timezone(timedelta(hours=-4)) # whatever your timezone offset from UTC is
start = datetime(2018, 06, 21, 0, 0, 0, tzinfo=tz) # timezone-aware start time
end = start + timedelta(hours=24) # one day's worth of times
delta = timedelta(minutes=1) # your interval over which you evaluate
times = [start]
now = start
while now <= end:
now += delta
times.append(now)
并使用以下方法进行评估:
astrometrics = my_earthsat.at(ts.utc(times))
这将在您每次指定时为您提供一个天文测量列表。您可以使用这些对象以几乎任何您喜欢的单位或参考系来获取对象的位置(我认为是速度)。例如,您可以使用以下内容获取列表中每个元素的高度和以弧度为单位的弧度:
alt_az = []
for ast in astrometrics:
alt_az.append(ast.altaz().radians