Расчет зенита и углов места для спутника при взгляде с земли

У меня есть широта, долгота и высота для спутника и наземного наблюдателя. Я пытаюсь рассчитать зенитный угол спутника и угол азимута спутника для спутника, если смотреть с земли.

В настоящее время я пытаюсь решить эту проблему с помощью astropy, Документация описывает, как рассчитать зенитный и азимутальный угол для Солнца.

Я попытался разместить спутник прямо над наблюдателем, чтобы зенитный угол был равен 0° (или угол места 90°).

In [41]: ground = astropy.coordinates.EarthLocation(lat=3*u.deg, lon=5*u.deg)

In [42]: sat = astropy.coordinates.EarthLocation.from_geodetic(3*u.deg, 5*u.deg, 700*u.km)

Однако ясно .transform_to(AltAz(...)) не означает, что я думаю, что означает, потому что ответ не то, что я хочу

In [43]: print(sat.get_itrs().transform_to(AltAz(location=ground)))
<AltAz Coordinate (obstime=None, location=(6345216.684243768, 555134.5274868822, 331574.3153428908) m, pressure=0.0 hPa, temperature=0.0 deg_C, relative_humidity=0, obswl=1.0 micron): (az, alt, distance) in (deg, deg, m)
    (314.96287134, 63.2970069, 773970.24385554)>

Я ожидал, что угол возвышения будет близок к 90°, а не к 63°.

Есть также некоторые подпрограммы в пиорбитале, но он, кажется, не содержит то, что я ищу.

Я считаю, что это также должно быть возможно с помощью pyephem за исключением того, что это, кажется, ожидает, что я получаю спутниковую информацию из каталога. У меня уже есть широта, долгота, высота.

Я также посмотрел на pyproj но я думаю, что это только для объектов на геоиде.

Как я могу рассчитать высоту и азимут спутника, наблюдаемого с земли?

1 ответ

Немного очистим ваши входы:

from astropy import units as u
from astropy.coordinates import AltAz, EarthLocation

ground = EarthLocation.from_geodetic(lat=3*u.deg, lon=5*u.deg, height=0*u.km)
sat    = EarthLocation.from_geodetic(lat=3*u.deg, lon=5*u.deg, height=700*u.km)

result = sat.get_itrs().transform_to(AltAz(location=ground))
print(result)

Что дает ожидаемые 90 градусов:

<AltAz Coordinate (obstime=None, location=(6345.21668424, 555.13452749, 331.57431534) km, pressure=0.0 hPa, temperature=0.0 deg_C, relative_humidity=0.0, obswl=1.0 micron): (az, alt, distance) in (deg, deg, km)
    (89.99999672, 89.99991123, 700.)>

Вы можете получить это от pyorbital, Соответствующая функция get_observer_look, По какой-то причине ему нужно время, и, очевидно, он требует, чтобы все входные данные были объектами ndarray. Он предупреждает, когда азимут плохо определен (например, когда зенитный угол равен нулю). Но это работает:

In [50]: import pyorbital.orbital

In [51]: print(pyorbital.orbital.get_observer_look(atleast_1d(1), atleast_1d(1), atleast_1d(700), datetime.datetime.now(), atleast_1d(1), atleast_1d(1), atleast_1d(1)))
(array([261.11934085]), array([89.99999915]))

In [53]: print(pyorbital.orbital.get_observer_look(atleast_1d(10), atleast_1d(0), atleast_1d(700), datetime.datetime.now(), atleast_1d(0), atleast_1d(0), atleast_1d(0.1)))
/home/zmaw/u237009/.conda/envs/FCDR37a/lib/python3.7/site-packages/pyorbital/orbital.py:112: RuntimeWarning: divide by zero encountered in true_divide
  az_ = np.arctan(-top_e / top_s)
(array([270.]), array([25.73173269]))

In [54]: print(pyorbital.orbital.get_observer_look(atleast_1d(10), atleast_1d(0), atleast_1d(700), datetime.datetime.now(), atleast_1d(0.1), atleast_1d(0.1), atleast_1d(0.1)))
(array([90.56944651]), array([26.03504444]))
Другие вопросы по тегам