Рассчитать, когда горизонт спутника перекрывает целевую область на земле - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь написать код на Python, чтобы он работал, когда горизонт Международной космической станции перекрывается с целевой областью на земле.В моем случае я выбрал Китай.У меня есть некоторый код, который работает, но я не уверен, правильно ли я математически подхожу к этой проблеме и могу ли я дать какой-нибудь совет.

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

Следующая идея заключается в создании кругового многоугольника (.buffer(1)) с Международной космической станцией в центре и просто посмотрите, пересекается ли она с многоугольником Китая, используя правильно построенные функции.

Но это становится немного сложнее, потому что многоугольник Китая находится в полярных координатах и ​​горизонтеРасстояние в метрах.Итак, чтобы учесть тот факт, что линии долготы широкие на экваторе и узкие на полюсах, я должен выполнить расчет, чтобы сначала определить расстояние между линиями долготы на текущей широте, а затем использовать его, чтобы выяснить, какво многих полярных градусах круг должен находиться в направлениях x и y.Затем я делаю эллипс этих измерений и смотрю, есть ли пересечение.

import time
import ephem
import math
from shapely.geometry import Polygon, Point
import shapely.affinity
import datetime

R = 6371 * 1000.0

dist_1_deg_long_equator = 111321
dist_1_deg_lat_equator = 111000

def get_dist_to_horizon(elevation_meters):
    eye = R + elevation_meters
    return R * math.acos(R / eye)

china = Polygon([
    (48.74, 87.17),
    (39.09, 74.05),
    (33.25, 79.13),
    (28.24, 86.44),
    (29.58, 95.74),
    (26.33, 98.82),
    (24.29, 97.89),
    (21.85, 100.82),
    (23.57, 105.32),
    (21.65, 108.14),
    (23.04, 116.23),
    (27.10, 120.31),
    (30.63, 122.08),
    (39.81, 124.09),
    (46.87, 133.90),
    (53.37, 121.73),
    (46.57, 119.57),
    (41.64, 105.26),
    (42.75, 96.28),
    (45.30, 90.76)])

name = "ISS (ZARYA)             "
line1 = "1 25544U 98067A   19094.21920345  .00002412  00000-0  46183-4 0  9994"
line2 = "2 25544  51.6444   8.9214 0002426 147.8175  11.8704 15.52483300163762"

iss = ephem.readtle(name, line1, line2)

while True:
    iss.compute()
    iss_horizon_radius = get_dist_to_horizon(iss.elevation)    

    dist_1_deg_long_current = math.cos(iss.sublat) * dist_1_deg_long_equator

    x_fact = iss_horizon_radius / dist_1_deg_long_current  # include more lines of longitude further from equator
    y_fact = iss_horizon_radius / dist_1_deg_lat_equator  # latitude lines are approx equal distant

    iss_horizon_circle = Point(math.degrees(iss.sublat), math.degrees(iss.sublong)).buffer(1)
    iss_horizon_ellipse = shapely.affinity.scale(iss_horizon_circle, x_fact, y_fact, origin='center')

    if iss_horizon_ellipse.intersects(china):
        print("ISS horizon is over China! %s" % datetime.datetime.utcnow())

    time.sleep(30)

Есть ли лучший способ сделать это?Например, преобразовать все в декартово, а затем просто иметь горизонт в виде идеального круга?Любой совет будет принят во внимание!Заранее спасибо

...