我已使用Python中的Skyfield实现了sgp4算法。
我需要得到1天时间间隔内,每秒周期的位置向量。为此,我必须重复计算sgp4,每次加上1秒。
有没有一种方法可以返回一个包含所有位置的向量?
我需要得到1天时间间隔内,每秒周期的位置向量。为此,我必须重复计算sgp4,每次加上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)
目前这段代码并不特别快,因为地球卫星计算尚未优化,但应该比在循环中手动构建多个时间对象要快。
skyfield.EarthSatellite
对象,然后为时间列表中的每个时间生成astrometric
对象来实现此操作。您需要将时区感知日期时间对象指定为时间列表。您可以使用以下方式创建时间列表(可能有很多提高效率的空间):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)
my_earthsat.at()
,您可以获得更优化的循环。我不确定它是否会转移到C中的某些内容。 - Engineerotimes
,会看到什么? - Engineeroskyfield.EarthSatellite
对象时加速,我已经在Skyfield Github上发布了一些思路。请参考链接:https://github.com/skyfielders/python-skyfield/issues/188 - dsholes