О самолётах и данных: ADS-B, часть 2

Я визуализировал данные со своего радара и мне понравилось.
В этой части я не улучшаю карту, но рисую красивые картинки.

Исходные данные

Как все давно в курсе, у меня есть ADS-B приёмник, с которым я время от времени играюсь. В этот раз мне показалось, что было бы интересно собрать в одну кучу все пролетавшие самолёты и посмотреть, как это выглядит.

Есть разные способы изъять нужные данные из dump1090, из них наиболее подходящим для меня стал формат SBS-3. Сервер включается опцией --net-sbs-port port, где port — это номер tcp-порта, куда надо будет подключаться. Любому, кто туда подключится, будет сливаться поток в виде строк с полями, разделёнными запятыми, что, несомненно, очень удобно для разбора. Формат позволяет передавать много различной информации, dump1090 отдаёт довольно много её видов (хоть и не все), но нам нужны только сообщения с координатами и высотой. Пытливый читатель без труда найдёт описание формата и всё поймёт самостоятельно (там не трудно), не пытливый скопирует строчку в терминал, не забыв подправить адрес и порт (ну, и имя файла, ежели угодно):

nc <ip-address> <port> | \
grep --line-buffered MSG,3 | \
cut -d ',' -f 12,15,16 | \
tee -a points.txt

Пережёвываем и визуализируем

Когда пачка команд, что выше, поработает достаточно долго, у нас будет приличных размеров файл формата CSV, содержащий, очевидно, высоту в футах (авиаторы — они такие, да) и координаты в виде градусов с десятичными долями. Почти всё хорошо, но есть два момента: иногда в сообщении есть только высота, но нет координат, а ещё высота и координаты имеют слишком разную размерность: первое запросто дойдёт до 40000, второе не бывает больше 180. Поэтому надо, во-первых, пофильтровать битые строки, а во-вторых немного сконвертировать цифры. Если заморочиться, то можно даже расчитать коэффициенты, чтобы пропорции соблюдались. У меня это делает стрёмный скриптик на Ruby, который я тут не буду показывать. Наверняка всё то же самое можно было сделать на python и pandas, но мне пока недосуг в это въезжать. В общем, непостижимым образом у нас получился всё тот же CSV, но подчищенный и причёсанный. Пора делать картинки.

Делать картинки мне помог чудесный инструмент PPTK, который делает ровно то, что мне надо: получает массив точек и отрисовывает их в 3D, и всё это можно приближать, отдалять и вертеть. Как-то так оно и происходит:

import numpy as np 
import pandas as pd
import pptk

points = pd.read_csv('points.txt', header=None)
points.rename(inplace=True, columns={0: 'alt', 1: 'lat', 2: 'lon'})
P = np.c_[points['lon'], points['lat'], points['alt']]     
v = pptk.viewer(P)
v.attributes(points['alt'])

В двух словах: подключаем нужные библиотеки, загружаем предварительно причёсанный CSV, переименовываем колонки, чтобы жилось проще и скармливаем в PPTK, последней строчкой наводя красоту. А теперь картинки.

Картинки

Транзитные рейсы
Транзитные рейсы

Эта картинка показывает транзитные рейсы: жёлто-красные прямые линии в верхней части — это оно и есть. Большая часть летит с запада на восток и с востока на запад, их-то лучше всего и видно. Кое-где их пересекают линии в других направлениях — это, соответственно, с юга на сервер и наоборот. Между линиями одинаковое расстояние, потому что вертикальное эшелонирование.

Аэропорты
Аэропорты

Тут я отрезал всё выше FL100, чтобы показать трафик около аэропортов. Самый большой пучок слева сверху — это, конечно же, Шереметьево. Маленький кудрявый куст чуть ниже — это Хелипорт Москва, вертолётики. Ещё ниже — это Внуково, их тут плохо слышно, поэтому так невзрачно. Правее Внуково — соответственно, Домодедово, а рядом с ним — Жуковский.

Шереметьево, вид сбоку
Шереметьево, вид сбоку

Это Шереметьево, две ровных горки — это самолёты, садящиеся на полосы 24L и 24C. Отдельная горка — это новая ВПП 24R. У взлетающих бортов чуть больше свободы, чем у садящихся, поэтому горка в противоположном направлении заметно более лохматая. Кстати, с новой полосы за целый день никто не взлетел, только садились. Полосатость — это потому что вертикальное разрешение 25 футов.

Шереметьево, вид сверху
Шереметьево, вид сверху

Всё то же Шереметьево, сверху. Трафик прямо таки повторяет схемы.

МАУ до FL100
МАУ до FL100

А тут весь (сильное утверждение: на самом деле только то, что слышно моему приёмнику) Московский авиаузел (по-прежнему, ниже FL100). Сразу видно, кто куда и как летит.

Шереметьево, трафик в другую сторону
Шереметьево, трафик в другую сторону

Бонус, которого не было на Medium. Это я пособирал данные в другой день. Самолёты взлетали из Шереметьево противоположным курсом, и в этот раз на 06L никто не садился, зато взлетали в полный рост. Видимо, с запада какое-то ограничение есть.

Заключение

В целом, задача мне видится решённой. Из возможных улучшений:

 2019-10-06
авиация
визуализация данных
python