У меня есть широта, долгота и высота для спутника и для наземного наблюдателя. Я пытаюсь рассчитать зенитный угол спутника и азимутальный угол спутника для спутника, как видно из земли.
В настоящее время я пытаюсь решить эту проблему с помощью 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 °.
Там также некоторые процедуры в pyorbital, но, похоже, не содержат того, что я ищу.
Я считаю, что это также должно быть возможно с помощью pyephem
, за исключением того, что, похоже, я получаю спутниковые данные из каталога. У меня уже есть лат, лон, высота.
Я также посмотрел на pyproj
но я думаю, что это только для объектов в геоиде.
Как я могу рассчитать высоту и азимут для спутника, наблюдаемый с земли?
Вы можете получить это от 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]))