Лучший способ получить приблизительный наземный трек для спутника с помощью Skyfield?

Я хотел сделать быстрый наземный график, поэтому я использовал пакет Python Skyfield для распространения TLE и возврата геоцентрических инерциальных координат. Затем я создал Topos()объект, закрепленный на поверхности Земли на широте/долготе = 0, 0, и использовал его для генерации вращения Земли, чтобы «раскрутить» положение МКС на поверхности.

примечание: это не лучший способ сделать это, но он дает достаточно хорошие результаты, чтобы сделать небольшую карту для иллюстрации. Проблемы включают в себя предположение, что земная ось все еще находится в направлении z, и, конечно же, рассмотрение земной поверхности как сферической.

Есть ли лучший способ сделать это в Skyfield, не используя метод, начинающийся с подчеркивания, другими словами, используя методы, предназначенные для того, чтобы быть полностью общедоступными для пользователя? Кроме того, есть ли способ отцентровать Землю, фиксированные (т.е. вращающиеся) координаты Земли непосредственно в Skyfield без раскручивания таким образом?

РЕДАКТИРОВАТЬ: Я изменил сценарий, так как прошло больше года, и Skyfield v 1.0 был выпущен.

ISS_TLE = """1 25544U 98067A   16341.96974289  .00003303  00000-0  57769-4 0  9996
2 25544  51.6456 276.4739 0005937 300.1004 104.8148 15.53811586 31866"""
L1, L2 = ISS_TLE.splitlines()

import numpy as np
import matplotlib.pyplot as plt
from skyfield.api import Loader, EarthSatellite, Topos

degs     = 180./np.pi

r_earth  = 6371.  # for ROUGH approx. ground track, just use a spherical Earth

load    = Loader('~/Documents/YourNameHere/SkyData')
data    = load('de421.bsp')
earth   = data['earth']
topoZZ  = Topos(latitude_degrees=0.0, longitude_degrees=0.0)

location = earth + topoZZ

ISS      = earth + EarthSatellite(L1, L2)

ts       = load.timescale()

minutes  = np.arange(0, 140, 0.5)
time     = ts.utc(2016, 12, 7, 12, minutes)

Epos     = earth.at(time).position.km
ZZpos    = topoZZ.at(time).position.km    ## Position of (0.0N, 0.0E) to get rotation
ISSpos   = ISS.at(time).position.km - Epos

theta_ZZ = np.arctan2(ZZpos[1], ZZpos[0])   # calculate Earth's rotaion

sth, cth         = np.sin(-theta_ZZ), np.cos(-theta_ZZ) # unwind
xISS, yISS, zISS = ISSpos
xISSnew, yISSnew = xISS*cth - yISS*sth, xISS*sth + yISS*cth # rotate ISS data to match Earth
ISSnew           = np.vstack((xISSnew, yISSnew, zISS))

x, y, z = ISSnew
r       = np.sqrt((ISSpos**2).sum(axis=0))
rxy     = np.sqrt(x**2 + y**2)
ISSlat, ISSlon   = np.arctan2(z, rxy), np.arctan2(y, x)

plt.figure()
plt.plot(degs*ISSlon, degs*ISSlat, 'ok')
plt.show()

введите описание изображения здесь

Об этом также спрашивали здесь: github.com/skyfielders/python-skyfield/issues/121

Ответы (1)

Я знаю, что это старый вопрос, но для забавы вот быстрый сценарий.

Этот вопрос был задан, когда .subpoint()в Skyfield не поддерживалась функция захвата долготы/широты для спутниковой орбиты, спроецированной на Землю.

Вот краткий сценарий, который показывает, как использовать встроенные функции Skyfield с построением графиков с помощью cartopy для построения карты и проекций.

from skyfield.api import load, EarthSatellite
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

ts = load.timescale(builtin=True)


TLE = """ISS (ZARYA)             
1 25544U 98067A   19203.81086311  .00000606  00000-0  18099-4 0  9996
2 25544  51.6423 184.5274 0006740 168.1171 264.4057 15.50995519180787"""

name, L1, L2 = TLE.splitlines()

sat = EarthSatellite(L1, L2)

minutes = np.arange(0, 200, 0.1) # about two orbits
times   = ts.utc(2019, 7, 23, 0, minutes)

geocentric = sat.at(times)
subsat = geocentric.subpoint()

fig = plt.figure(figsize=(20, 10))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())

ax.stock_img()

plt.scatter(subsat.longitude.degrees, subsat.latitude.degrees, transform=ccrs.PlateCarree(),
            color='red')
plt.show()
Отличный! Для дополнительных шуток, как насчет способа построить земную подточку для другого объекта? Комментарии под этим вопросом , а также в этом чате предполагают, что ОП в конечном итоге захочет проследить точки субпланет на поверхности Земли. Я могу думать о двух путях; 1) использовать reverse_terra()в этом ответе (продолжение)
...или 2) построить геоцентрический объект в Skyfield на основе положения планеты, а затем применить .subpoint()к нему. К сожалению, текст этого вопроса еще не обновлен, чтобы отразить намерение ОП. (примечание: связанный вопрос находится в Astronomy SE, а не здесь, в Space SE], их часто путают)
К вашему сведению, теперь, когда вы набрали более 50 очков репутации, вы можете оставлять комментарии к любым понравившимся сообщениям!
Я обнаружил, что строка «ax.stock_img() приводит к следующей ошибке Python: FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/usr/lib/python3/dist-packages/cartopy/data/raster/ natural_earth/50-natural-earth-1-downsampled.png' - кажется, структура папок изменилась и это изображение перемещено. Где еще доступен тот же файл?