Ruby - Flightradar24 から空港情報一覧取得!
Updated:
航空機の運行状況をリアルタイムで確認できる Web サイト Flightradar24.com に登録されている空港情報の一覧を Ruby で取得してみました。(と言っても、 JSON データを取得しているだけですが)
0. 前提条件
- Ruby 2.2.4-p230 での作業を想定。
- 世界中の全空港を網羅している訳ではない。(例えば、島根県の隠岐空港や萩・石見空港のような規模の小さい(?)空港の情報は登録されていない)
1. Ruby スクリプトの作成
難しいことはしていないので、説明は省略する。
ただ、悪質な Bot でないことを主張するために連絡先を User Agent に設定している。(伏字は適宜置き換えること)
File: fr24_airports.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#! /usr/local/bin/ruby
# coding: utf-8
#---------------------------------------------------------------------------------
#= Flightradar24 空港情報取得
#
# date name version
# 2015.12.20 mk-mode.com 1.00 新規作成
#
# Copyright(C) 2015 mk-mode.com All Rights Reserved.
#---------------------------------------------------------------------------------
#++
require 'json'
require 'open-uri'
require 'timeout'
class Fr24Airports
URL = "http://www.flightradar24.com/_json/airports.php" # 接続先 URL
TIMEOUT = 10 # OpenURI 接続時のタイムアウト
USER_AGENT = "xxxxxxx Bot (by Ruby/#{RUBY_VERSION}, Administrator: xxxxxxxx@yyyyyyy.zzz)"
# OpenURI 接続時の User-Agent, Mail Address
FILE_PATH = "./data/airports" # 保存ファイル
def exec
get_json # JSON 取得
save_file # ファイル保存 (見やすく整形したものがよければこちら)
#save_file_csv # ファイル保存(CSV 形式がよければこちら)
rescue => e
$stderr.puts "[#{e.class}] #{e.message}"
e.backtrace.each { |tr| $stderr.puts "\t#{tr}" }
exit 1
end
private
# JSON 取得
def get_json
str = nil
timeout(TIMEOUT) do
str = open(URL, {"User-Agent" => USER_AGENT}) { |f| f.read }
end
@json = JSON.parse(str)["rows"].sort_by { |j| [j["country"], j["iata"]] }
rescue => e
raise
end
# ファイル保存
# * 最大文字数(country: 32, name: 63)
# * name の末尾に改行コードが含まれていることがあるので chomp している
def save_file
File.open("#{FILE_PATH}.txt", "w") do |f|
str = "COUNTRY" + " " * 27 + "IATA ICAO NAME" + " " * 68
str << "LAT LON ALT"
f.puts str
@json.each do |j|
str = sprintf("%-32s %3s %4s", j["country"], j["iata"], j["icao"])
str << sprintf(" %-63s", j["name"].chomp)
str << sprintf(" %10.6f", j["lat"].to_f)
str << sprintf(" %11.6f", j["lon"].to_f)
str << sprintf(" %5d", j["alt"].to_i)
f.puts str
end
end
rescue => e
raise
end
# ファイル保存(CSV 形式)
# * 最大文字数(country: 32, name: 63)
# * name の末尾に改行コードが含まれていることがあるので chomp している
# * カンマが含まれる可能性のある country, name のみ "" でくくっている
def save_file_csv
File.open("#{FILE_PATH}.csv", "w") do |f|
f.puts "COUNTRY,IATA,ICAO,NAME,LAT,LON,ALT"
@json.each do |j|
str = "\"#{j["country"]}\",#{j["iata"]},#{j["icao"]},\"#{j["name"].chomp}\","
str << "#{j["lat"]},#{j["lon"]},#{j["alt"]}"
f.puts str
end
end
rescue => e
raise
end
end
Fr24Airports.new.exec
2. Ruby スクリプトの実行
Ruby スクリプトと同じディレクトリ内に “data” ディレクトリを作成後、以下を実行。
$ ./fr24_airports.rb
3. データの確認
“data” ディレクトリ内に “airports.txt” が作成されるので確認してみる。
File: data/airports.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
COUNTRY IATA ICAO NAME LAT LON ALT
Afghanistan KBL OAKB Kabul International Airport 34.565842 69.212410 5871
Afghanistan MZR OAMS Mazar-I-Sharif International Airport 36.706909 67.209671 1284
Albania TIA LATI Tirana International Airport 41.414742 19.720560 126
Algeria AAE DABB Annaba Rabah Bitat Airport 36.822220 7.809167 16
Algeria ALG DAAG Algiers Houari Boumediene Airport 36.691010 3.215408 82
Algeria BJA DAAE Bejaia Soummam Airport 36.711990 5.069922 20
Algeria CFK DAOI Chlef International Airport 36.212223 1.331667 469
Algeria CZL DABC Constantine Mohamed Boudiaf International Airport 36.276020 6.620386 2316
Algeria GJL DAAV Jijel Ferhat Abbas Airport 36.795132 5.873608 36
Algeria ORN DAOO Oran Es Senia Airport 35.623852 -0.621180 299
:
====< 以下省略 >====
:
CSV 形式で出力した場合は “airports.csv” を確認してみる。
File: data/airports.csv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
COUNTRY,IATA,ICAO,NAME,LAT,LON,ALT
"Afghanistan",KBL,OAKB,"Kabul International Airport",34.565842,69.212410,5871
"Afghanistan",MZR,OAMS,"Mazar-I-Sharif International Airport",36.706909,67.209671,1284
"Albania",TIA,LATI,"Tirana International Airport",41.414742,19.720560,126
"Algeria",AAE,DABB,"Annaba Rabah Bitat Airport",36.822220,7.809167,16
"Algeria",ALG,DAAG,"Algiers Houari Boumediene Airport",36.691010,3.215408,82
"Algeria",BJA,DAAE,"Bejaia Soummam Airport",36.711990,5.069922,20
"Algeria",CFK,DAOI,"Chlef International Airport",36.212223,1.331667,469
"Algeria",CZL,DABC,"Constantine Mohamed Boudiaf International Airport",36.276020,6.620386,2316
"Algeria",GJL,DAAV,"Jijel Ferhat Abbas Airport",36.795132,5.873608,36
"Algeria",ORN,DAOO,"Oran Es Senia Airport",35.623852,-0.621180,299
:
====< 以下省略 >====
:
4. 関係のある過去の記事
5. その他
“Flightradar24.com” が提供するリアルタイムの航空機の飛行情報も、調査に調査を重ねて取得できるようになりました。(後日紹介)
ちなみに、Web 検索するとリアルタイム飛行情報を取得する方法についてある程度はヒットしますが、その9割くらいは情報が古いです。
全ての空港が網羅されていればうれしいのですが。。。
以上。
Comments