mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - Flightradar24 から空港情報一覧取得!

[ プログラミング ] [ Ruby ]

こんばんは。

航空機の運行状況をリアルタイムで確認できる Web サイト Flightradar24.com に登録されている空港情報の一覧を Ruby で取得してみました。(と言っても、 JSON データを取得しているだけですが)

0. 前提条件

  • Ruby 2.2.4-p230 での作業を想定。
  • 世界中の全空港を網羅している訳ではない。(例えば、島根県の隠岐空港や萩・石見空港のような規模の小さい(?)空港の情報は登録されていない)

1. Ruby スクリプトの作成

難しいことはしていないので、説明は省略する。
ただ、悪質な Bot でないことを主張するために連絡先を User Agent に設定している。(伏字は適宜置き換えること)

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” ディレクトリを作成後、以下を実行。

1
$ ./fr24_airports.rb

3. データの確認

“data” ディレクトリ内に “airports.txt” が作成されるので確認してみる。

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” を確認してみる。

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