Я пытаюсь написать код на 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)
Есть ли лучший способ сделать это?Например, преобразовать все в декартово, а затем просто иметь горизонт в виде идеального круга?Любой совет будет принят во внимание!Заранее спасибо