やろうと思った背景
リアルタイムで現実世界の情報を入手、可視化したいと思ったため
準備
EC2スポットインスタンス準備
デスクトップを起動し続けるより、クラウドでサーバを借りたほうが安いです。
※うちのデスクトップを動かすと400円/日 かかると怒られました。
OpenSkyへの登録
OpenSkyでIDをとりましょう。正確にはとらなくてもデータは取得できる。
https://opensky-network.org/
もし、固定IPを持っている人がいれば、OpenSkyに協力してあげてほしいなぁ。
NiFiのダウンロード&実行
Download→Download Nifi→nifi-1.7.1-bin.tar.gz
そのあと表示される一覧からお好きなリンクをどうぞ。
ダウンロードしたら、ファイルを展開して、以下を実行するだけ。
tar zxfv nifi-1.7.1-bin.tar.gz
nifi-1.7.1/bin/nifi.sh
PostgreSQLインストール
PostgreSQLインストールしましょう。
sudo yum install -y postgresql96-server
/etc/init.d/postgresql96 initdb
vi /var/lib/pgsql96/data/postgresql.conf
追加:listen_addresses = '*'
Metabaseインストール
可視化ツールとして、今回はMetabase使ってみましょう。
Dockerであれば楽勝です。
docker run -d -p 3000:3000 --name metabase metabase/metabase
情報取得 & レコード保存
あとは、APIの仕様に従って、リアルタイム情報を取得するだけです。
https://opensky-network.org/apidoc/
Rest APIが公開されているので、
私の場合、プログラムが面倒なので、NiFiを用いて、データ取得からPostgreSQLに突っ込むところまでやります。
最後にDBに突っ込めばいいと思います。
対象のテーブルは以下のように作成すればよいかと思います。
create table ADSB(
time int,
icao24 text,
callsign text ,
origin_country text ,
time_position int ,
last_contact int ,
longitude float ,
latitude float ,
geo_altitude float ,
on_ground boolean ,
velocity float ,
true_track float ,
vertical_rate float ,
sensors int ,
baro_altitude float ,
squawk text ,
spi boolean ,
position_source int
);
可視化
Metabaseに接続しましょう。
ポートは3000です。
sshでのポートフォワーディングが楽でしょう。
Metabaseの初期化が始まります。(しばらくかかります)
途中、Databaseの設定などあるので、ホスト側のPostgreSQLへの接続設定を行いましょう。
host: ホストサーバのIPアドレス。(Docker LANのIPでいいです)
Port、Database、ユーザ名、パスワードはPostgreSQL、またはDBの設定に合わせてください。
あとは、SQLを適当に実行してMAP表示すると、最新の飛行機の位置が表示されます。
※この時、表示件数が多すぎると表示されないため500程度に絞ったほうがよいでしょう。
select
distinct callsign ,latitude, longitude, avg(Velocity)
from
adsb
where
time = (select max(time) from adsb)
group by
callsign, latitude, longitude
limit 500
Pin表示しかできないのが残念ですね。