Определение данных горизонтальной системы координат (азимут, высота) для географических местоположений

Я хотел бы, в частности, определить данные азимута и высоты для любого заданного местоположения на поверхности земли относительно другого места на поверхности земли (для моих целей последним будет Лондон, Великобритания).

Данные и API легко доступны для некоторых небесных объектов, но мне не удалось найти нужные данные.

Может ли кто-нибудь просветить меня относительно метода расчета таких данных?

Большое спасибо.

Ответы (1)

Это можно сделать с помощью Python-пакета Skyfield довольно легко.

Вот оболочка скрипта; Я использовал некоторые словари для хранения данных, вы можете сделать что-то еще. Я сохранил много вкусностей, но распечатал только азимут, высоту и расстояние в километрах.

По умолчанию метод Скайфилда .altaz()рассчитывает атмосферную рефракцию для всего, что выше -1 градуса ( геометрически на 1 градус ниже горизонта ). Вы можете отключить это, заменив его на .altaz(pressure_mbar=0).

ВЫХОД:

 place     altitude  azimuth     distance (km)
Caracas    -33.67   258.26         7075.28
Edinburgh  -2.39    338.98          533.65
Canberra  -76.25     64.93        12377.25

Вот скрипт Python:

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

load        = Loader('~/Documents/fishing/SkyData')  # avoids multiple copies of large files
data        = load('de421.bsp')
ts          = load.timescale()

Earth       = data['earth']

London      = Earth + Topos(latitude_degrees  = 51.51,
                            longitude_degrees = -0.1275,
                            elevation_m = 11.)

places      = {'Caracas':(10.48, -66.90, 900), 'Edinburgh':(55.95, -3.19, 47.),
               'Canberra':(-35.29, 149.13, 578.)}

now         = ts.now()

answer_dict = dict()

for name, (lat, lon, elev) in places.items():
    place     = Earth + Topos(latitude_degrees  = lat,
                              longitude_degrees = lon,
                              elevation_m       = elev)
    vector_km            = place.at(now).position.km - London.at(now).position.km
    distance_km          = np.sqrt((vector_km**2).sum())
    dic                  = dict()
    answer_dict[name]  = dic
    dic['lat']  = lat
    dic['lon']  = lon
    dic['elev'] = elev
    dic['vector_km'] = vector_km
    dic['vector_distance_km'] = distance_km
    alt, az, d    = London.at(now).observe(place).apparent().altaz()
    dic['altaz']  = alt._degrees, az._degrees
    dic['dist']   = d.km

for name, dic in answer_dict.items():
    print(name, dic['altaz'], dic['dist'])
угу, спасибо, это здорово. Я только что просматривал ephem, который привел меня в Skyfield, для получения данных alt/az для МКС. Я новичок в Python (и астрономии). Могу ли я поэкспериментировать с вашим скриптом и вернуться к вам?
@TimAllan конечно, это здорово! Я большой фанат Скайфилда. Пожалуйста, не стесняйтесь экспериментировать и комментировать здесь позже. Эти ссылки будут искать мое имя пользователя и слово «Skyfield» здесь, в Astronomy и в Space Exploration , чтобы вы могли посмотреть другие короткие сценарии для сравнения.