Как создать интерактивную 3D-карту спутников в браузере на основе орбитальных данных
Визуализация объектов в околоземном пространстве
Intro
Вы тоже стали чаще замечать скользящие по ночному небу световые точки? За последние годы околоземная орбита кардинально преобразилась. Имея за плечами более семи лет разработки и около трех лет работы в ракетно-космической сфере, я все равно поражаюсь масштабам этих изменений.
Если в конце 2018 года на орбите насчитывалось около 1957 действующих спутников, то сегодня их уже порядка 16 тысяч. Общее же число искусственных тел, находящихся под постоянным контролем, превысило 47 тысяч — сюда входят не только рабочие аппараты, но и отслужившие свой срок конструкции, разгонные блоки и фрагменты космического мусора.
Однако по мере того, как околоземное пространство стремительно заполняется объектами, я почему-то не наблюдаю соразмерного всплеска интереса к этой теме у широкой аудитории. Ну летают там какие-то спутники — и что с того?
Полагаю, дело во многом кроется в форме подачи информации. Одно дело — изучать сухие строки таблиц с NORAD ID, высотой и наклонением орбиты, и совсем другое — вращать трехмерную модель Земли, наблюдать за тысячами окружающих её тел, приближаться к конкретному аппарату или рассматривать устройство сети Starlink вместе с перспективной отечественной группировкой «Рассвет».
Меня захватила идея сделать подобную визуализацию доступной и понятной каждому. И тут началось самое увлекательное: как технически воплотить это на экране и, главное, как по-настоящему увлечь пользователя.
Так родился проект Above Us. И довольно быстро стало очевидно, что отрисовка красивой планеты — далеко не самая сложная задача во всей этой истории.
Первый шаг
Что требуется для такой задачи? Разумеется, актуальные данные о пространственном положении каждого спутника в любой момент симуляции. В профессиональной среде для этого используют эфемериды — массивы точных координат на конкретные временные метки. Это надежно и технологично, но крайне громоздко, к тому же подобных массивов в свободном доступе я не обнаружил. К счастью, благодаря законам Кеплера в этом нет острой необходимости, ведь состояние орбиты на заданную эпоху можно полностью описать всего шестью параметрами.
Как это устроено? Все предельно элегантно — 5 значений задают саму орбиту:
большая полуось. Определяет размер орбиты. Это половина большой оси эллипса, от которой напрямую зависит период обращения: чем она короче, тем больше витков за сутки совершает аппарат.
эксцентриситет. Отвечает за форму. Характеризует степень вытянутости эллипса по сравнению с идеальной окружностью.
наклонение. Задает угол наклона орбиты относительно плоскости экватора.
долгота восходящего узла. Определяет пространственную ориентацию. Показывает положение орбитальной плоскости в системе экваториальных координат (отсчитывается от точки весеннего равноденствия до узла, где аппарат пересекает экватор, двигаясь с юга на север).
аргумент перигея. Задает ориентацию в плоскости. Определяет положение перигея (ближайшей к планете точки) внутри самой орбиты.
И лишь одно число — средняя аномалия — указывает на текущее положение аппарата на этой траектории (к нему всегда прилагается эпоха, то есть момент фиксации измерений).

Однако на практике все сложнее. Будь Земля идеальным шаром без атмосферы, а Солнце с Луной лишенными гравитационного влияния, нам хватило бы единожды зафиксировать параметры орбиты, чтобы безошибочно предсказывать положение объекта в любую эпоху.
В действительности же траектории подвержены постоянным деформациям. На них влияют гравитационные аномалии геоида, сопротивление атмосферы на низких высотах, притяжение светил, давление солнечного света и прочие возмущения.
Именно поэтому нельзя взять пятилетней давности параметры, экстраполировать их по чистым законам Кеплера и рассчитывать на точность. Существуют специализированные модели вроде SGP4, умеющие корректно прогнозировать движение с учетом возмущающих факторов, однако для этого требуются регулярно обновляемые орбитальные параметры.
Исторически сложилось так, что с 1950-х годов основным стандартом для таких данных стал TLE (Two-Line Element Set) — двухстрочный формат. Первая строка содержит служебные метаданные и эпоху, а вторая — ключевые орбитальные характеристики, адаптированные под алгоритм SGP4. Тем не менее к 2026 году идентификаторы NORAD перестали помещаться в отведенные для них пятизначные рамки. Поэтому для современных проектов гораздо лучше подходит формат OMM (2009 года), позволяющий свободно передавать все необходимые величины в привычном XML или компактном тексте KVN. Самое приятное во всей этой истории заключается в том, что подобные массивы данных энтузиасты могут получать абсолютно легально и безвозмездно.
CelesTrak
Свой выбор я изначально остановил на CelesTrak по ряду причин: во-первых, сервис отдает OMM-данные в удобных JSON и CSV; во-вторых, он бесплатен; в-третьих, там собрана исчерпывающая актуальная информация обо всех действующих космических аппаратах. За эти возможности я искренне признателен доктору Т. С. Келсо — известному астродинамику и создателю этого некоммерческого ресурса. С удовольствием выразил бы ему благодарность через кнопку доната, но российские карты там не проходят, да и сами суммы пожертвований кусаются, учитывая, что мой проект носит еще более некоммерческий характер.
Тем не менее возникло три нюанса. Первый — для получения исчерпывающих сведений приходится выкачивать дополнительные каталоги. Второй — в данных отсутствует привязка к конкретным государствам. Третий — в последнее время из-за возросшего трафика ресурс начал жестко фильтровать запросы и банить пользователей, даже при соблюдении регламентов. Мой российский IP-адрес, например, и вовсе был бессрочно ограничен до смешных значений скорости в несколько килобайт в секунду. И все же это отличный источник первоклассных данных, агрегирующий сырую информацию с space-track.org (куда она поступает напрямую от 18-й эскадрильи космических сил США), после чего очищает её, структурирует и переформатирует.
В результате мне пришлось задействовать альтернативный ресурс.
Space‑Track
Вернее, совместить оба подхода. В Space-Track нет разделения на активные и неактивные аппараты, а это принципиально для фильтрации космического мусора. Поэтому базовый список функционирующих спутников, их наименования и международные индексы я беру из CelesTrak. Поскольку эти параметры меняются нечасто, я запрашиваю данный каталог раз в неделю. С другой стороны, запуски новых аппаратов происходят регулярно, так что в будущем при внедрении трекинга пусков я планирую сократить этот интервал или задействовать точечную дозагрузку.
Итоговая архитектура выглядит следующим образом:
-
Состав и наименования. Загружаются из CelesTrak.
-
Орбитальные параметры и государственная принадлежность. Берутся из Space-Track.
-
Новые аппараты. Объекты, запущенные после формирования среза CelesTrak, подтягиваются из Space-Track.
-
Отказоустойчивость. При недоступности Space-Track система переключается на чистый CelesTrak (информация о странах скрывается, а слой мусора сообщает об отсутствии актуальных данных).
Прокрутка времени: модель SGP4
Как отмечалось ранее, параметры жестко привязаны к эпохе измерений. Чтобы узнать актуальное или прогнозируемое положение аппарата, применяется стандартная модель распространения орбит SGP4.
Она позволяет смещать временную шкалу вперед или назад. Будь орбита идеальным эллипсом, тело двигалось бы по нему вечно. Но реальность вносит коррективы, которые SGP4 успешно компенсирует:
-
Несферичность земного шара вызывает медленную прецессию орбитальной плоскости.
-
Остаточные слои атмосферы тормозят аппараты на низких высотах.
-
Гравитационное воздействие Луны и Солнца возмущает траекторию.
По этой причине орбитальные элементы требуют регулярного обновления. Чем сильнее временной сдвиг относительно эпохи измерения, тем выше погрешность накопления, зависящая от специфики конкретной орбиты.
На выходе SGP4 выдает декартовы координаты (x, y, z) в километрах относительно центра Земли, а также вектором скорости. Эта система называется TEME.
Поправка на вращение Земли
Полученные координаты привязаны к инерциальной системе координат, зафиксированной относительно звезд (землецентрическая квазиинерциальная система). Сама же планета под спутником непрерывно вращается, совершая полный оборот за 23 часа 56 минут.
Для пересчета мы вычисляем угол поворота планеты на текущий момент симуляции с помощью звездного времени. После этого мы синхронизируем систему координат с вращением Земли, что позволяет легко определить географические широту и долготу под спутником.
Возникает резонный вопрос: зачем переводить координаты во вращающуюся систему, если уже есть инерциальная? Ответ прост: так значительно проще и эффективнее для рендеринга трехмерной сцены.
Почему расчёт в браузере и в отдельном потоке
Как уже упоминалось, хранить массив готовых эфемерид локально нецелесообразно из-за их быстрой актуализации и огромного объема. Все вычисления производятся на стороне клиента, а сервер передает исключительно компактные орбитальные элементы. Чтобы интерфейс не зависал от нагрузок, вся математика вынесена в фоновый поток (Web Worker).
Подробнее
При загрузке страницы браузер запрашивает у сервера каталог спутников, содержащий не готовые координаты, а лишь базовые орбитальные паспорта.
Чтобы преобразовать их в пространственное положение в реальном времени, задействуется фоновый Web Worker с библиотекой satellite.js, реализующей модель SGP4. Она рассчитывает положение аппарата с учетом гравитационных возмущений, атмосферного торможения и влияния светил.
Поскольку расчеты выполняются в звездной системе координат, worker производит поворот осей на угол суточного вращения планеты, привязывая координаты к поверхности Земли.
Вычисления не выполняются на каждый кадр анимации. Главный поток отправляет запросы воркеров не чаще раза в 75 миллисекунд и исключительно после получения предыдущего ответа. Передавая список активных объектов и время симуляции, воркер пакетно обрабатывает данные, упаковывая координаты в единый массив. Получив его, основной поток обновляет геометрию сцены, смещая точки на экране. Промежуточной интерполяции нет — между ответами объекты зафиксированы на месте. При этом камера и вращение глобуса рендерятся в реальном времени на каждом кадре, обеспечивая общую плавность визуализации.
На моем ноутбуке выполнение одного расчета SGP4 занимает порядка 0,6–0,7 микросекунды. Обработка 30 000 объектов укладывается примерно в 18 миллисекунд, оставляя солидный запас до следующего запроса.
Фундамент заложен, теперь можно переходить к визуальной магии.
Немного о процессе создания

Конечно, за спиной не стояла команда разнопрофильных специалистов — в роли полноценного штата помощников выступил искусственный интеллект. Кто-то отнесется к этому скептически, но те, кто уже создавал масштабные продукты с помощью современных ИИ-инструментов, знают: нейросети не заменяют разработчика, а лишь берут на себя рутину, освобождая ресурс для решения сложных архитектурных задач. По сути, я вел этот проект в одиночку, совмещая роли программиста, проджекта, тимлида, тестировщика и бизнес-аналитика. Позади почти месяц интенсивной работы и гигабайты обработанных токенов. В моей виртуальной команде трудились Astra, Opus 5.5, Soul 6, Sonnet 5.5 и DeepSeek Flash 4.1 (проявивший себя с лучшей стороны). Особенно хочется отметить вклад Astra: именно благодаря ей удалось добиться потрясающей реалистичности планеты. Мы отказались от банального натягивания текстуры на шар или использования стандартных средств Cesium. Вместо этого был написан кастомный GLSL-шейдер для Three.js, который комбинирует несколько текстурных слоев, динамически рассчитывает освещение в зависимости от времени суток и формирует не просто голубую дымку атмосферы, но и красивейшие закатные эффекты с покраснением солнечного диска. Разумеется, всё это потребовало глубокой оптимизации с применением геймдев-хитростей, чтобы проект не превращался в слайд-шоу.
Впрочем, эта статья вовсе не об искусственном интеллекте, но обойти стороной данный аспект было бы несправедливо.
Технологический стек проекта выглядит так: CelesTrak/Space-Track — Fastify/SQLite — React — Web Workers с SGP4 — Three.js/WebGL-сцена.
Так что получилось?
На выходе у нас есть интерактивная сцена с двумя ключевыми режимами: схема, где акцент сделан на наглядности орбит, и реалистичный режим, позволяющий прочувствовать масштабы космоса глазами астронавта. Здесь легко изучить геостационарные, низкие, средние и эллиптические орбиты (пока геосинхронные и геостационарные объединены в категорию GEO, но в планах их разделение). Предусмотрены быстрые фильтры по типам орбит, подсвечивающие их разными цветами.
Фильтрация по странам позволяет наглядно оценить, какой вклад внесло то или иное государство в загрязнение орбиты, а также оценить общую долю его спутниковой группировки.
Параллельно реализована детальная демонстрация крупных спутниковых созвездий — GPS, ГЛОНАСС, Starlink, OneWeb, «Рассвет» и других. Для каждого из них доступны справки, принципы работы, траектории, слои и зоны покрытия.

Отдельная гордость — функция «Что надо мной?», выступающая визитной карточкой сайта. По координатам геолокации или ручному вводу города система вычисляет аппараты, находящиеся в зоне прямой видимости (на высоте более 10 градусов над горизонтом в радиусе 2,5 тыс. км — вполне рабочая дистанция для крупных низкоорбитальных спутников). Отображение фильтруется с учетом времени суток: для успешного наблюдения солнце должно опуститься ниже горизонт минимум на 6 градусов, а сам аппарат не должен находиться в земной тени (хотя этот фильтр можно отключить).
Не обошлось и без системы уведомлений. Пользователь выбирает спутник, указывает точку (или разрешает геолокацию) и задает тайминг предупреждения. Сервер рассчитывает точное время пролета и ставит задачу в очередь. Перед самым пролетом отправляется push-уведомление прямо в браузер, даже если вкладка свернута. Плюс — полная анонимность без обязательной регистрации; минус — при смене устройства настройки придется повторить.

Куда же без подробной визуализации орбит и кеплеровых элементов — это базис.
Кроме того, добавлена наглядная анимация «Почему спутники не падают?» и полноценная мини-игра «Орбитальные миссии», в которой игроку предстоит пилотировать космический аппарат для перевода на целевую орбиту. Управление и устройство корабля максимально приближены к реальности (простые аркадные схемы «как самолетиком» отпали сразу): здесь учитывается реальная физика полета, тяга и типы двигателей, маневрирование, расход топлива и прочие параметры. За прохождение начисляются звезды, хотя признаюсь — сам я до сих пор не смог пройти все миссии на высший балл.

Сейчас я также тружусь над созданием миссии повышенной сложности, вдохновленной полетом корабля «Артемида-2».
А вот что делать с мобильной версией — пока вопрос открытый. Уместить такой массив данных и элементов управления на крошечном экране смартфона крайне сложно. Будем думать.
Долгий путь к финалу статьи, который должен оставить только заинтересованных
Безусловно, делясь результатами своей работы, я рассчитываю получить заслуженную порцию дофамина, которая придаст сил для дальнейшего развития. Ведь простая мысль «почему бы не попробовать?» незаметно превратилась в проект, за который чувствуешь огромную личную ответственность.
Но главная причина моего появления здесь — поиск обратной связи и помощи.
Меня не покидает ощущение, что несмотря на все усилия, мне пока не удалось создать действительно массовый инструмент популяризации. Цель «дать каждому прикоснуться к космосу» еще не достигнута в полной мере. Я явно упускаю что-то важное. Если у вас выдалась свободная минута, зайдите на Above Us и напишите в комментариях: что вы сделали в первую очередь; что осталось непонятным; ради чего захотелось бы вернуться во второй раз; чего проекту отчаянно не хватает; что выглядит банальной игрушкой.
Эволюция киберпанка: от истоков до истинной сути
Как учились программировать гики из соцлагеря?
Борьба за качество в Factorio с помощью матриц
Кризис научного рецензирования: как искусственный интеллект усугубляет проблемы пир-ревью
Физика пламени и векторы познания
Искусственный интеллект научился создавать ДНК
Блокнот: программа, которую Microsoft не решалась менять сорок лет
Время на исходе: что означает загадочная фраза о фотонах?