スクリーンショット_2019-12-05_17

Flightradar24からCaratsっぽいデータを自炊する方法

今回は、私自身が研究に利用しているデータ取得方法を紹介する。航空機が実際に飛行するデータを、Flightradar24というサイトから取得する方法である。今回はPythonを利用し、11月3日にデータ取得を行っているものを、そのまま記述するものである。

将来の航空交通システムに関する長期ビジョン(CARATS)は、特にアジア太平洋地域での航空需要増大に合わせ、航空交通流に関する研究の裾野を広げつつ主要目標を達成しようとする国土交通省のビジョン、またそれを達成するためのプロジェクトを指す(https://www.mlit.go.jp/common/000124208.pdf)。この一環として提供されるCARATS Open Data(COD)というデータは、国土交通省から提供される航空機のデータで、その位置情報、高度、機種名が記述され、CSVファイルへ格納されている。ただこのデータはアップデートが遅く、最新のものも国土交通省から逐次公開されるわけではない。そこで今回は、インターネット上で多くの航空機情報を表示、共有するサイト「Flightradar24(https://www.flightradar24.com)」のJSONファイルを利用して、近似するデータを作成することを試みた。なおこのデータは、ADS-B OUT搭載機材のみ表示し、また受信側の範囲も制限されるため、一部の分析ではCODと同様に利用できない場合がある。(搭載率参考(2017年) :http://www.mlit.go.jp/common/001184275.pdf)

まずは利用するパッケージをインポートする。

import sys;print(sys.version)
import time
import json
import urllib.request
import csv

ここからデータ取得に入る。for文により処理を回し、10秒ごとにデータ取得を行うため、8640回の処理を行って、それぞれ取得したデータを「Hanedadata20191103.csv」へと格納している。

j=0
for j in range(8640):
       start_time = time.time()
       url = 'http://data.flightradar24.com/zones/fcgi/feed.js?bounds=36.3,34.5,139.3,140.6&adsb=1&mlat=1&faa=1&flarm=1&estimated=1&air=1&gnd=1&vehicles=1&gliders=1&array=1'
       headers = {
               "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
               }
       request = urllib.request.Request(url=url, headers=headers)
       response = urllib.request.urlopen(request)
       root = json.loads(response.read())
       k=0

       now = time.ctime()
       cnvtime = time.strptime(now)
       timenow=(time.strftime("% %H:%M:%S", cnvtime))
       with open('Hanedadata20191103.csv', 'a') as f:
               for i in root['aircraft']:
                       timeset = timenow
                       flightnumber = root['aircraft'][int(k)][14]
                       position1 = root['aircraft'][int(k)][2]
                       position2 = root['aircraft'][int(k)][3]
                       altitude = root['aircraft'][int(k)][5]
                       shipname = root['aircraft'][int(k)][9]
                       if flightnumber == '':
                               flightnumber='null'
                       if shipname == '':
                               shipname = 'null'
                       if altitude !=0:
                               print(timeset, flightnumber, position1, position2, altitude, shipname)
                               writer = csv.writer(f)
                               writer.writerow([
                               timeset, flightnumber, position1, position2, altitude, shipname
                               ])
                       k=k+1
       j=j+1
       print(j)
       end_time = time.time()
       elapsed_time = end_time - start_time
       if elapsed_time <= 10:
               time.sleep(10-elapsed_time)

4行目、feed.js?boundsの後ろに入る4つのパラメータはそれぞれ、緯度北端、緯度南端、経度西端、経度東端を示していることにご留意いただきたい。例えばJFK(アメリカ、ニューヨークJFK空港)では41.5,39,75,71というパラメータになるし、MUN(ドイツ、ミュンヘン空港)は48.6,48,11,12というパラメータを用いて取得すると空港周辺を取得できる。これらの数値は空港の位置、また空域の範囲に合わせて変更されることを強くお薦めする。

この記事が気に入ったらサポートをしてみませんか?