WolframAlpha.com
WolframCloud.com
All Sites & Public Resources...
Products & Services
Wolfram|One
Mathematica
Wolfram|Alpha Notebook Edition
Programming Lab
Finance Platform
SystemModeler
Wolfram Player
Wolfram Engine
WolframScript
Enterprise Private Cloud
Enterprise Mathematica
Wolfram|Alpha Appliance
Enterprise Solutions
Corporate Consulting
Technical Consulting
Wolfram|Alpha Business Solutions
Resource System
Data Repository
Neural Net Repository
Function Repository
Wolfram|Alpha
Wolfram|Alpha Pro
Problem Generator
API
Data Drop
Products for Education
Mobile Apps
Wolfram Player
Wolfram Cloud App
Wolfram|Alpha for Mobile
Wolfram|Alpha-Powered Apps
Services
Paid Project Support
Wolfram U
Summer Programs
All Products & Services »
Technologies
Wolfram Language
Revolutionary knowledge-based programming language.
Wolfram Cloud
Central infrastructure for Wolfram's cloud products & services.
Wolfram Science
Technology-enabling science of the computational universe.
Wolfram Notebooks
The preeminent environment for any technical workflows.
Wolfram Engine
Software engine implementing the Wolfram Language.
Wolfram Natural Language Understanding System
Knowledge-based broadly deployed natural language.
Wolfram Data Framework
Semantic framework for real-world data.
Wolfram Universal Deployment System
Instant deployment across cloud, desktop, mobile, and more.
Wolfram Knowledgebase
Curated computable knowledge powering Wolfram|Alpha.
All Technologies »
Solutions
Engineering, R&D
Aerospace & Defense
Chemical Engineering
Control Systems
Electrical Engineering
Image Processing
Industrial Engineering
Mechanical Engineering
Operations Research
More...
Finance, Statistics & Business Analysis
Actuarial Sciences
Bioinformatics
Data Science
Econometrics
Financial Risk Management
Statistics
More...
Education
All Solutions for Education
Trends
Machine Learning
Multiparadigm Data Science
Internet of Things
High-Performance Computing
Hackathons
Software & Web
Software Development
Authoring & Publishing
Interface Development
Web Development
Sciences
Astronomy
Biology
Chemistry
More...
All Solutions »
Learning & Support
Learning
Wolfram Language Documentation
Fast Introduction for Programmers
Wolfram U
Videos & Screencasts
Wolfram Language Introductory Book
Webinars & Training
Summer Programs
Books
Need Help?
Support FAQ
Wolfram Community
Contact Support
Premium Support
Paid Project Support
Technical Consulting
All Learning & Support »
Company
About
Company Background
Wolfram Blog
Events
Contact Us
Work with Us
Careers at Wolfram
Internships
Other Wolfram Language Jobs
Initiatives
Wolfram Foundation
MathWorld
Computer-Based Math
A New Kind of Science
Wolfram Technology for Hackathons
Student Ambassador Program
Wolfram for Startups
Demonstrations Project
Wolfram Innovator Awards
Wolfram + Raspberry Pi
Summer Programs
More...
All Company »
Search
WOLFRAM COMMUNITY
Connect with users of Wolfram technologies to learn, solve problems and share ideas
Join
Sign In
Dashboard
Groups
People
Message Boards
Answer
(
Unmark
)
Mark as an Answer
GROUPS:
Staff Picks
Biological Sciences
Data Science
Medical Sciences
Mathematica
Graphics and Visualization
Import and Export
Wolfram Language
Modeling
Geographic Information System
11
Diego Zviovich
Modeling the spatial spread of infection diseases in the US
Diego Zviovich
Posted
1 year ago
4918 Views
|
5 Replies
|
14 Total Likes
Follow this post
|
MODERATOR NOTE: coronavirus resources & updates:
https://wolfr.am/coronavirus
Introduction
The following document will be the first one on a series to try to replicate the model used by
GLEAMviz
, reducing the scope to the 48 contiguous US states (US). The focus will be in this region as data for the US is more readily available than in other geographies.
This model
1
uses socio-demographic and mobility data to simulate the spread of epidemics across a given geography. We’ll explore the spatio-temporal pattern of an epidemic spreading by seeding the starting locus at the different main points of entry.
Model
The model is composed of three different data layers: the population layer, the mobility layer and the disease layer. To build these layers, let’s proceed to capture the available data from the different sources.
The population layer
Our population layer will be built upon the University of Columbia’s “
Gridded Population of the World
” dataset
2
. One of the available datasets is the “population count v4.11”
3
. We’ll download the population data for 2020 at a 30 arc minute resolution (approximately 55km x 55 km).
https://sedac.ciesin.columbia.edu/data/set/gpw-v4-population-count-rev11/data-download.
The population layer will be constituted by a voronoi-like tesellation of the US around the main airports across the country, which we’ll be worked on in the next section. Each subpopulation will be assigned to a cell associated to the closest airport.
Let’s set up a structure to store our work as we move along the project. This structure will be made available in either github or the wolfram data repository. Link will be provided later.
d
a
t
a
=
A
s
s
o
c
i
a
t
i
o
n
M
a
p
[
<
|
|
>
&
,
{
"
s
o
u
r
c
e
s
"
,
"
r
a
w
D
a
t
a
"
,
"
t
e
m
p
"
,
"
r
e
s
u
l
t
s
"
}
]
s
o
u
r
c
e
s
,
r
a
w
D
a
t
a
,
t
e
m
p
,
r
e
s
u
l
t
s
O
u
t
[
]
=
d
a
t
a
[
"
s
o
u
r
c
e
s
"
,
"
p
o
p
u
l
a
t
i
o
n
D
a
t
a
"
]
=
H
y
p
e
r
l
i
n
k
[
"
h
t
t
p
s
:
/
/
s
e
d
a
c
.
c
i
e
s
i
n
.
c
o
l
u
m
b
i
a
.
e
d
u
/
d
a
t
a
/
s
e
t
/
g
p
w
-
v
4
-
p
o
p
u
l
a
t
i
o
n
-
c
o
u
n
t
-
r
e
v
1
1
/
d
a
t
a
-
d
o
w
n
l
o
a
d
"
]
;
I
n
[
]
:
=
Data has been saved in the local drive. We’ll proceed to read the data.
d
a
t
a
[
"
s
o
u
r
c
e
s
"
,
"
p
o
p
u
l
a
t
i
o
n
F
i
l
e
s
"
]
=
F
i
l
e
N
a
m
e
s
[
"
*
m
i
n
.
a
s
c
"
,
F
i
l
e
N
a
m
e
J
o
i
n
[
{
N
o
t
e
b
o
o
k
D
i
r
e
c
t
o
r
y
[
]
,
"
d
a
t
a
s
e
t
s
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
d
a
t
a
"
}
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
r
a
w
D
a
t
a
"
,
"
p
o
p
u
l
a
t
i
o
n
"
]
=
I
m
p
o
r
t
[
F
i
r
s
t
@
d
a
t
a
[
"
s
o
u
r
c
e
s
"
,
"
p
o
p
u
l
a
t
i
o
n
F
i
l
e
s
"
]
,
"
D
a
t
a
"
]
;
I
n
[
]
:
=
Let’s review the data structure of the read file. We can observe that it is a matrix of 720 columns and 360 rows, each cell representing a 0.5x0.5 angular degree sector.
d
a
t
a
[
"
r
a
w
D
a
t
a
"
,
"
p
o
p
u
l
a
t
i
o
n
"
]
[
[
;
;
6
]
]
{
n
c
o
l
s
7
2
0
,
n
r
o
w
s
3
6
0
,
x
l
l
c
o
r
n
e
r
-
1
8
0
,
y
l
l
c
o
r
n
e
r
-
9
0
,
c
e
l
l
s
i
z
e
0
.
5
,
N
O
D
A
T
A
_
v
a
l
u
e
-
9
9
9
9
}
O
u
t
[
]
=
Processing the data.
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
]
;
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
l
i
n
e
s
"
]
=
S
t
r
i
n
g
R
e
p
l
a
c
e
[
#
,
{
"
"
"
,
"
,
"
e
"
"
1
0
^
"
,
"
-
9
9
9
9
"
"
0
.
"
}
]
&
/
@
d
a
t
a
[
"
r
a
w
D
a
t
a
"
,
"
p
o
p
u
l
a
t
i
o
n
"
]
[
[
7
;
;
]
]
;
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
n
u
m
b
e
r
s
"
]
=
T
o
E
x
p
r
e
s
s
i
o
n
@
S
t
r
i
n
g
S
p
l
i
t
[
#
,
"
,
"
]
&
/
@
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
l
i
n
e
s
"
]
;
I
n
[
]
:
=
M
a
t
r
i
x
P
l
o
t
[
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
n
u
m
b
e
r
s
"
]
[
[
5
0
;
;
1
5
0
,
;
;
3
0
0
]
]
,
A
s
p
e
c
t
R
a
t
i
o
1
/
G
o
l
d
e
n
R
a
t
i
o
,
I
m
a
g
e
S
i
z
e
L
a
r
g
e
]
O
u
t
[
]
=
Let’s extract the population data for the US.
G
e
o
B
o
u
n
d
i
n
g
B
o
x
C
o
n
t
i
n
e
n
t
a
l
U
S
s
t
a
t
e
s
A
D
M
I
N
I
S
T
R
A
T
I
V
E
D
I
V
I
S
I
O
N
S
{
G
e
o
P
o
s
i
t
i
o
n
[
{
2
4
.
5
4
5
5
,
-
1
2
4
.
7
3
3
}
]
,
G
e
o
P
o
s
i
t
i
o
n
[
{
4
9
.
3
8
4
4
,
-
6
6
.
9
4
9
9
}
]
}
O
u
t
[
]
=
The following equations convert the grid to latitude and longitude.
l
o
n
[
n
_
]
:
=
.
2
5
-
1
8
0
+
(
n
-
1
)
3
0
/
6
0
l
a
t
[
n
_
]
:
=
-
.
2
5
+
9
0
-
(
n
-
1
)
3
0
/
6
0
I
n
[
]
:
=
{
n
/
.
S
o
l
v
e
[
l
o
n
[
n
]
-
1
2
4
.
7
3
2
9
8
4
9
,
n
,
R
e
a
l
s
]
,
n
/
.
S
o
l
v
e
[
l
o
n
[
n
]
-
6
6
.
9
4
9
9
,
n
,
R
e
a
l
s
]
,
n
/
.
S
o
l
v
e
[
l
a
t
[
n
]
2
5
.
5
4
5
5
,
n
,
R
e
a
l
s
]
,
n
/
.
S
o
l
v
e
[
l
a
t
[
n
]
4
9
.
3
8
4
4
,
n
,
R
e
a
l
s
]
}
{
{
1
1
1
.
0
3
4
}
,
{
2
2
6
.
6
}
,
{
1
2
9
.
4
0
9
}
,
{
8
1
.
7
3
1
2
}
}
O
u
t
[
]
=
Now that we now the limits in the grid let’s proceed to extract the data of interest.
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
D
e
l
e
t
e
C
a
s
e
s
[
F
l
a
t
t
e
n
[
T
a
b
l
e
[
G
e
o
P
o
s
i
t
i
o
n
[
{
l
a
t
[
i
]
,
l
o
n
[
j
]
}
]
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
n
u
m
b
e
r
s
"
]
〚
i
,
j
〛
,
{
i
,
8
2
,
1
2
9
}
,
{
j
,
1
1
1
,
2
2
7
}
]
,
1
]
,
A
l
t
e
r
n
a
t
i
v
e
s
[
R
u
l
e
[
_
,
0
.
]
,
R
u
l
e
[
_
,
0
]
]
]
]
;
I
n
[
]
:
=
We must remove the points outside the US polygon/
p
o
l
y
=
C
o
n
t
i
n
e
n
t
a
l
U
S
s
t
a
t
e
s
A
D
M
I
N
I
S
T
R
A
T
I
V
E
D
I
V
I
S
I
O
N
S
[
"
P
o
l
y
g
o
n
"
]
/
.
G
e
o
P
o
s
i
t
i
o
n
S
e
q
u
e
n
c
e
;
I
n
[
]
:
=
p
o
i
n
t
s
=
K
e
y
s
@
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
;
v
a
l
i
d
P
o
i
n
t
s
=
F
o
l
d
[
O
r
,
F
a
l
s
e
,
#
]
&
/
@
(
T
r
a
n
s
p
o
s
e
[
T
a
b
l
e
[
W
i
t
h
[
{
v
a
l
u
e
s
=
p
o
i
n
t
s
/
.
G
e
o
P
o
s
i
t
i
o
n
S
e
q
u
e
n
c
e
}
,
R
e
g
i
o
n
M
e
m
b
e
r
[
p
o
l
y
[
[
n
]
]
,
v
a
l
u
e
s
]
]
,
{
n
,
L
e
n
g
t
h
@
p
o
l
y
}
]
]
)
;
L
e
n
g
t
h
@
v
a
l
i
d
P
o
i
n
t
s
4
2
3
1
O
u
t
[
]
=
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
E
x
t
r
a
c
t
[
N
o
r
m
a
l
[
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
]
,
P
o
s
i
t
i
o
n
[
v
a
l
i
d
P
o
i
n
t
s
,
T
r
u
e
]
]
]
;
I
n
[
]
:
=
C
l
e
a
r
[
p
o
i
n
t
s
,
v
a
l
i
d
P
o
i
n
t
s
]
I
n
[
]
:
=
G
e
o
G
r
a
p
h
i
c
s
P
o
l
y
g
o
n
C
o
n
t
i
n
e
n
t
a
l
U
S
s
t
a
t
e
s
A
D
M
I
N
I
S
T
R
A
T
I
V
E
D
I
V
I
S
I
O
N
S
,
P
o
i
n
t
S
i
z
e
[
0
.
0
0
0
1
]
,
P
o
i
n
t
[
K
e
y
s
@
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
]
O
u
t
[
]
=
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
[
[
;
;
3
]
]
G
e
o
P
o
s
i
t
i
o
n
[
{
4
8
.
7
5
,
-
1
2
2
.
2
5
}
]
1
8
7
2
3
7
.
,
G
e
o
P
o
s
i
t
i
o
n
[
{
4
8
.
7
5
,
-
1
2
1
.
7
5
}
]
5
4
0
4
,
G
e
o
P
o
s
i
t
i
o
n
[
{
4
8
.
7
5
,
-
1
2
1
.
2
5
}
]
7
3
0
.
6
5
3
O
u
t
[
]
=
As a side note, we can observe the distribution of the population across the different cells of the grid.
H
i
s
t
o
g
r
a
m
[
L
o
g
[
2
,
V
a
l
u
e
s
[
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
]
]
,
P
l
o
t
T
h
e
m
e
"
D
e
t
a
i
l
e
d
"
,
F
r
a
m
e
T
i
c
k
s
{
{
A
u
t
o
m
a
t
i
c
,
N
o
n
e
}
,
{
{
#
,
2
^
#
}
&
/
@
R
a
n
g
e
[
0
,
2
0
,
5
]
,
N
o
n
e
}
}
]
O
u
t
[
]
=
G
e
o
R
e
g
i
o
n
V
a
l
u
e
P
l
o
t
L
o
g
[
2
,
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
]
,
C
o
l
o
r
F
u
n
c
t
i
o
n
S
c
a
l
i
n
g
F
a
l
s
e
,
C
o
l
o
r
F
u
n
c
t
i
o
n
W
h
i
c
h
#
≤
2
,
,
#
≤
4
,
,
#
≤
6
,
,
#
≤
1
2
,
,
#
≤
1
6
,
,
#
≤
1
8
,
,
#
≤
2
0
,
L
i
g
h
t
Y
e
l
l
o
w
,
T
r
u
e
,
L
i
g
h
t
P
i
n
k
&
O
u
t
[
]
=
The mobility layers
The tessellation procedure will divide the US surface in a metapopulation structure, each with its own subpopulations. The spatio-temporal patterns of disease spreading will be linked to the mobility flows of people between the different subpopulations. These flows will be represented by two different mobility networks.
Air Traffic Network
The Bureau of Transportation Statistics keeps air traffic statistics within the US
4
. Table T-100 Market (all carriers) collects the number of passengers enplaned between two airport within a period. We proceeded to download the data for the year 2018.
d
a
t
a
[
"
s
o
u
r
c
e
s
"
,
"
a
i
r
T
r
a
f
f
i
c
D
a
t
a
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
"
h
o
m
e
"
H
y
p
e
r
l
i
n
k
[
"
h
t
t
p
s
:
/
/
w
w
w
.
b
t
s
.
g
o
v
/
t
o
p
i
c
s
/
a
i
r
l
i
n
e
s
-
a
n
d
-
a
i
r
p
o
r
t
s
-
0
"
]
,
"
t
a
b
l
e
s
"
H
y
p
e
r
l
i
n
k
[
"
h
t
t
p
s
:
/
/
w
w
w
.
t
r
a
n
s
t
a
t
s
.
b
t
s
.
g
o
v
/
T
a
b
l
e
s
.
a
s
p
?
D
B
_
I
D
=
1
1
1
&
D
B
_
N
a
m
e
=
A
i
r
%
2
0
C
a
r
r
i
e
r
%
2
0
S
t
a
t
i
s
t
i
c
s
%
2
0
%
2
8
F
o
r
m
%
2
0
4
1
%
2
0
T
r
a
f
f
i
c
%
2
9
-
%
2
0
A
l
l
%
2
0
C
a
r
r
i
e
r
s
&
D
B
_
S
h
o
r
t
_
N
a
m
e
=
A
i
r
%
2
0
C
a
r
r
i
e
r
s
"
]
]
h
o
m
e
h
t
t
p
s
:
/
/
w
w
w
.
b
t
s
.
g
o
v
/
t
o
p
i
c
s
/
a
i
r
l
i
n
e
s
-
a
n
d
-
a
i
r
p
o
r
t
s
-
0
,
t
a
b
l
e
s
h
t
t
p
s
:
/
/
w
w
w
.
t
r
a
n
s
t
a
t
s
.
b
t
s
.
g
o
v
/
T
a
b
l
e
s
.
a
s
p
?
D
B
_
I
D
=
1
1
1
&
D
B
_
N
a
m
e
=
A
i
r
%
2
0
C
a
r
r
i
e
r
%
2
0
S
t
a
t
i
s
t
i
c
s
%
2
0
%
2
8
F
o
r
m
%
2
0
4
1
%
2
0
T
r
a
f
f
i
c
%
2
9
-
%
2
0
A
l
l
%
2
0
C
a
r
r
i
e
r
s
&
D
B
_
S
h
o
r
t
_
N
a
m
e
=
A
i
r
%
2
0
C
a
r
r
i
e
r
s
O
u
t
[
]
=
d
a
t
a
[
"
r
a
w
D
a
t
a
"
,
"
t
1
0
0
m
a
r
k
e
t
"
]
=
I
m
p
o
r
t
[
F
i
l
e
N
a
m
e
J
o
i
n
[
{
N
o
t
e
b
o
o
k
D
i
r
e
c
t
o
r
y
[
]
,
"
d
a
t
a
s
e
t
s
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
,
"
3
5
1
7
2
2
1
2
2
_
T
_
T
1
0
0
D
_
M
A
R
K
E
T
_
A
L
L
_
C
A
R
R
I
E
R
.
C
S
V
"
}
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
h
e
a
d
e
r
"
]
=
M
a
p
I
n
d
e
x
e
d
[
{
F
i
r
s
t
@
#
2
,
#
1
}
&
,
d
a
t
a
[
"
r
a
w
D
a
t
a
"
,
"
t
1
0
0
m
a
r
k
e
t
"
]
[
[
1
]
]
]
{
{
1
,
P
A
S
S
E
N
G
E
R
S
}
,
{
2
,
O
R
I
G
I
N
_
A
I
R
P
O
R
T
_
I
D
}
,
{
3
,
O
R
I
G
I
N
}
,
{
4
,
D
E
S
T
_
A
I
R
P
O
R
T
_
I
D
}
,
{
5
,
D
E
S
T
}
,
{
6
,
Y
E
A
R
}
,
{
7
,
M
O
N
T
H
}
,
{
8
,
}
}
O
u
t
[
]
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
]
=
R
e
s
t
@
d
a
t
a
[
"
r
a
w
D
a
t
a
"
,
"
t
1
0
0
m
a
r
k
e
t
"
]
;
I
n
[
]
:
=
First step is always to take a look at the data. There is always some issue that can be found. In the following steps we’ll proceed to clean up data.
Example, remove flights with no passengers.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
]
=
D
e
l
e
t
e
C
a
s
e
s
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
]
,
{
0
.
,
_
_
}
]
;
I
n
[
]
:
=
Remove Flights to and from the same airport and last field.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
]
=
M
o
s
t
/
@
D
e
l
e
t
e
C
a
s
e
s
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
]
,
{
_
,
_
,
a
_
,
_
,
a
_
,
_
_
}
]
;
I
n
[
]
:
=
Obtain the list of airports.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
]
[
[
;
;
7
]
]
{
{
1
.
,
1
0
3
0
4
,
A
N
I
,
1
2
7
1
9
,
K
L
G
,
2
0
1
8
,
5
}
,
{
1
.
,
1
0
3
0
4
,
A
N
I
,
1
3
1
9
6
,
M
C
G
,
2
0
1
8
,
5
}
,
{
1
.
,
1
0
3
1
3
,
A
N
V
,
1
0
3
0
4
,
A
N
I
,
2
0
1
8
,
5
}
,
{
1
.
,
1
0
3
1
3
,
A
N
V
,
1
2
6
7
6
,
K
G
X
,
2
0
1
8
,
5
}
,
{
1
.
,
1
0
5
5
1
,
B
E
T
,
1
2
7
0
9
,
K
K
I
,
2
0
1
8
,
5
}
,
{
1
.
,
1
0
5
5
1
,
B
E
T
,
1
4
1
3
0
,
P
K
A
,
2
0
1
8
,
5
}
,
{
1
.
,
1
0
5
5
1
,
B
E
T
,
1
5
8
6
2
,
W
T
L
,
2
0
1
8
,
5
}
}
O
u
t
[
]
=
Filter only to airports within the 48 contiguous states and listed in the air traffic database.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
]
;
I
n
[
]
:
=
Airports within the USA.
E
n
t
i
t
y
P
r
e
f
e
t
c
h
[
"
A
i
r
p
o
r
t
"
]
S
u
c
c
e
s
s
✓
M
e
s
s
a
g
e
:
P
r
e
f
e
t
c
h
s
u
c
c
e
s
s
f
u
l
.
V
a
l
u
e
s
:
1
1
6
1
0
5
6
O
u
t
[
]
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
u
s
A
i
r
p
o
r
t
s
"
]
=
E
n
t
i
t
y
L
i
s
t
F
i
l
t
e
r
e
d
E
n
t
i
t
y
C
l
a
s
s
"
A
i
r
p
o
r
t
"
,
E
n
t
i
t
y
F
u
n
c
t
i
o
n
c
,
c
c
o
u
n
t
r
y
=
=
=
U
n
i
t
e
d
S
t
a
t
e
s
C
O
U
N
T
R
Y
;
I
n
[
]
:
=
Filter out the airports with the 48 lower states.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
C
o
o
r
d
i
n
a
t
e
s
"
]
=
E
n
t
i
t
y
V
a
l
u
e
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
u
s
A
i
r
p
o
r
t
s
"
]
,
{
"
E
n
t
i
t
y
"
,
"
C
o
o
r
d
i
n
a
t
e
s
"
}
]
;
I
n
[
]
:
=
y
=
F
o
l
d
[
O
r
,
F
a
l
s
e
,
#
]
&
/
@
(
T
r
a
n
s
p
o
s
e
[
T
a
b
l
e
[
W
i
t
h
[
{
p
o
i
n
t
s
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
C
o
o
r
d
i
n
a
t
e
s
"
]
[
[
A
l
l
,
2
]
]
}
,
R
e
g
i
o
n
M
e
m
b
e
r
[
p
o
l
y
[
[
n
]
]
,
p
o
i
n
t
s
]
]
,
{
n
,
L
e
n
g
t
h
@
p
o
l
y
}
]
]
)
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
u
s
A
i
r
p
o
r
t
s
"
]
=
P
a
r
t
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
C
o
o
r
d
i
n
a
t
e
s
"
]
[
[
A
l
l
,
1
]
]
,
F
l
a
t
t
e
n
@
P
o
s
i
t
i
o
n
[
y
,
T
r
u
e
]
]
;
I
n
[
]
:
=
C
l
e
a
r
[
x
,
y
,
z
]
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
u
s
A
i
r
p
o
r
t
s
"
]
[
[
;
;
3
]
]
G
o
l
d
s
t
o
n
e
(
G
t
s
)
A
i
r
p
o
r
t
,
C
l
e
a
r
C
r
e
e
k
R
a
n
c
h
A
i
r
p
o
r
t
,
N
o
r
t
h
e
r
n
L
i
t
e
A
i
r
p
o
r
t
O
u
t
[
]
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
s
s
o
c
C
o
d
e
s
2
E
n
t
i
t
i
e
s
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
D
e
l
e
t
e
C
a
s
e
s
[
R
u
l
e
[
#
1
,
#
2
]
&
@
@
@
E
n
t
i
t
y
V
a
l
u
e
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
u
s
A
i
r
p
o
r
t
s
"
]
,
{
"
I
A
T
A
C
o
d
e
"
,
"
E
n
t
i
t
y
"
}
]
,
R
u
l
e
[
_
M
i
s
s
i
n
g
,
_
]
,
I
n
f
i
n
i
t
y
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
s
s
o
c
C
o
d
e
s
2
E
n
t
i
t
i
e
s
"
]
[
[
;
;
3
]
]
C
U
X
C
u
d
d
i
h
y
F
i
e
l
d
A
i
r
p
o
r
t
,
C
S
E
B
u
c
k
h
o
r
n
R
a
n
c
h
A
i
r
p
o
r
t
,
J
C
Y
L
B
J
R
a
n
c
h
A
i
r
p
o
r
t
O
u
t
[
]
=
Filter out the airports with the 48 lower states.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
T
r
a
f
f
i
c
"
]
=
R
e
v
e
r
s
e
S
o
r
t
[
A
s
s
o
c
i
a
t
i
o
n
[
D
e
l
e
t
e
C
a
s
e
s
[
N
o
r
m
a
l
[
Q
u
e
r
y
[
A
l
l
,
T
o
t
a
l
]
[
G
r
o
u
p
B
y
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
]
[
[
A
l
l
,
{
3
,
1
}
]
]
,
F
i
r
s
t
L
a
s
t
]
]
]
/
.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
s
s
o
c
C
o
d
e
s
2
E
n
t
i
t
i
e
s
"
]
,
R
u
l
e
[
_
S
t
r
i
n
g
,
_
]
]
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
s
A
i
r
p
o
r
t
s
"
]
=
D
a
t
a
s
e
t
[
W
i
t
h
[
{
t
r
a
f
f
i
c
=
A
s
s
o
c
i
a
t
i
o
n
T
h
r
e
a
d
[
{
"
A
i
r
p
o
r
t
"
,
"
T
r
a
f
f
i
c
"
}
,
#
]
&
/
@
(
{
#
1
,
#
2
}
&
@
@
@
N
o
r
m
a
l
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
T
r
a
f
f
i
c
"
]
]
)
,
c
o
o
r
d
s
=
A
s
s
o
c
i
a
t
i
o
n
T
h
r
e
a
d
[
{
"
A
i
r
p
o
r
t
"
,
"
P
o
s
i
t
i
o
n
"
,
"
C
o
o
r
d
i
n
a
t
e
s
"
,
"
I
A
T
A
C
o
d
e
"
}
,
#
]
&
/
@
(
{
#
1
,
#
2
,
#
3
,
#
4
}
&
@
@
@
E
n
t
i
t
y
V
a
l
u
e
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
u
s
A
i
r
p
o
r
t
s
"
]
,
{
"
E
n
t
i
t
y
"
,
"
P
o
s
i
t
i
o
n
"
,
"
C
o
o
r
d
i
n
a
t
e
s
"
,
"
I
A
T
A
C
o
d
e
"
}
]
)
}
,
J
o
i
n
A
c
r
o
s
s
[
t
r
a
f
f
i
c
,
c
o
o
r
d
s
,
"
A
i
r
p
o
r
t
"
]
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
s
A
i
r
p
o
r
t
s
"
]
=
Q
u
e
r
y
[
R
e
v
e
r
s
e
S
o
r
t
B
y
[
#
"
T
r
a
f
f
i
c
"
&
]
]
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
s
A
i
r
p
o
r
t
s
"
]
]
O
u
t
[
]
=
We can observe that there are several airports that service a big metropolitan area.
G
e
o
G
r
a
p
h
i
c
s
{
P
o
i
n
t
S
i
z
e
[
0
.
0
1
]
,
P
o
i
n
t
[
K
e
y
s
@
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
]
,
R
e
d
,
P
o
i
n
t
S
i
z
e
[
0
.
0
2
]
,
P
o
i
n
t
[
N
o
r
m
a
l
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
s
A
i
r
p
o
r
t
s
"
]
[
A
l
l
,
"
A
i
r
p
o
r
t
"
]
]
]
}
,
G
e
o
C
e
n
t
e
r
N
e
w
Y
o
r
k
C
i
t
y
C
I
T
Y
,
G
e
o
R
a
n
g
e
Q
u
a
n
t
i
t
y
[
2
0
0
,
"
k
m
"
]
O
u
t
[
]
=
We need to take into account that big urban areas are serviced by multiple airports. We’ll aggregate airports that are within a distance of 100 km of each other. The following formula allows to quickly calculate distances between locations.
g
e
o
D
i
s
t
=
C
o
m
p
i
l
e
[
{
{
p
o
s
1
,
_
R
e
a
l
,
1
}
,
{
p
o
s
2
,
_
R
e
a
l
,
1
}
}
,
A
r
c
C
o
s
[
S
i
n
[
p
o
s
1
[
[
1
]
]
*
P
i
/
1
8
0
]
*
S
i
n
[
p
o
s
2
[
[
1
]
]
*
P
i
/
1
8
0
]
+
C
o
s
[
p
o
s
1
[
[
1
]
]
*
P
i
/
1
8
0
]
*
C
o
s
[
p
o
s
2
[
[
1
]
]
*
P
i
/
1
8
0
]
*
C
o
s
[
p
o
s
2
[
[
2
]
]
*
P
i
/
1
8
0
-
p
o
s
1
[
[
2
]
]
*
P
i
/
1
8
0
]
]
*
6
3
7
1
]
C
o
m
p
i
l
e
d
F
u
n
c
t
i
o
n
A
r
g
u
m
e
n
t
c
o
u
n
t
:
2
A
r
g
u
m
e
n
t
t
y
p
e
s
:
{
{
_
R
e
a
l
,
1
}
,
{
_
R
e
a
l
,
1
}
}
O
u
t
[
]
=
Test function
g
e
o
D
i
s
t
[
{
4
0
.
6
9
2
5
`
,
-
7
4
.
1
6
8
6
6
7
`
}
,
{
4
0
.
6
3
9
7
5
1
`
,
-
7
3
.
7
7
8
9
2
5
`
}
]
3
3
.
3
9
1
4
O
u
t
[
]
=
Calculate Distance matrix
x
=
N
o
r
m
a
l
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
s
A
i
r
p
o
r
t
s
"
]
[
A
l
l
,
"
C
o
o
r
d
i
n
a
t
e
s
"
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
i
s
t
a
n
c
e
M
a
t
r
i
x
"
]
=
F
l
a
t
t
e
n
[
W
i
t
h
[
{
x
=
N
o
r
m
a
l
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
s
A
i
r
p
o
r
t
s
"
]
[
A
l
l
,
"
C
o
o
r
d
i
n
a
t
e
s
"
]
]
}
,
T
a
b
l
e
[
{
i
,
j
}
-
>
g
e
o
D
i
s
t
[
x
[
[
i
]
]
,
x
[
[
j
]
]
]
,
{
i
,
L
e
n
g
t
h
@
x
-
1
}
,
{
j
,
i
+
1
,
L
e
n
g
t
h
@
x
}
]
]
,
1
]
;
I
n
[
]
:
=
Filter airports that are more than 100km apart.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
n
e
a
r
b
y
P
a
i
r
s
"
]
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
i
s
t
a
n
c
e
M
a
t
r
i
x
"
]
[
[
F
l
a
t
t
e
n
[
P
o
s
i
t
i
o
n
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
i
s
t
a
n
c
e
M
a
t
r
i
x
"
]
[
[
A
l
l
,
2
]
]
,
a
_
/
;
a
<
1
0
0
]
]
]
]
;
I
n
[
]
:
=
Proceed to group airports
y
=
N
o
r
m
a
l
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
d
s
A
i
r
p
o
r
t
s
"
]
[
A
l
l
,
"
A
i
r
p
o
r
t
"
]
]
;
r
e
s
u
l
t
s
=
{
}
;
i
n
d
e
x
=
U
n
i
o
n
[
F
l
a
t
t
e
n
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
n
e
a
r
b
y
P
a
i
r
s
"
]
[
[
A
l
l
,
1
]
]
]
]
;
M
o
n
i
t
o
r
[
W
h
i
l
e
[
L
e
n
g
t
h
@
i
n
d
e
x
>
0
,
v
a
l
s
=
{
z
=
I
n
t
e
r
s
e
c
t
i
o
n
[
i
n
d
e
x
,
U
n
i
o
n
[
F
l
a
t
t
e
n
[
C
a
s
e
s
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
n
e
a
r
b
y
P
a
i
r
s
"
]
[
[
A
l
l
,
1
]
]
,
A
l
t
e
r
n
a
t
i
v
e
s
[
{
F
i
r
s
t
@
i
n
d
e
x
,
_
}
,
{
_
,
F
i
r
s
t
@
i
n
d
e
x
}
]
]
]
]
]
;
I
f
[
L
e
n
g
t
h
@
z
0
,
N
u
l
l
,
g
r
o
u
p
=
y
[
[
z
]
]
;
F
i
r
s
t
@
g
r
o
u
p
g
r
o
u
p
]
}
;
r
e
s
u
l
t
s
=
J
o
i
n
[
r
e
s
u
l
t
s
,
v
a
l
s
]
;
i
n
d
e
x
=
C
o
m
p
l
e
m
e
n
t
[
i
n
d
e
x
,
F
l
a
t
t
e
n
[
{
z
,
F
i
r
s
t
@
i
n
d
e
x
}
]
]
;
]
,
F
i
r
s
t
@
i
n
d
e
x
]
r
e
s
u
l
t
s
=
D
e
l
e
t
e
C
a
s
e
s
[
r
e
s
u
l
t
s
,
N
u
l
l
]
;
r
e
s
u
l
t
s
=
J
o
i
n
[
r
e
s
u
l
t
s
,
R
u
l
e
[
#
,
{
#
}
]
&
/
@
C
o
m
p
l
e
m
e
n
t
[
y
,
U
n
i
o
n
@
F
l
a
t
t
e
n
@
V
a
l
u
e
s
[
r
e
s
u
l
t
s
]
]
]
;
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
G
r
o
u
p
s
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
r
e
s
u
l
t
s
]
;
C
l
e
a
r
[
x
,
y
,
v
a
l
s
,
r
e
s
u
l
t
s
,
i
n
d
e
x
]
I
n
[
]
:
=
(
*
G
e
o
G
r
a
p
h
i
c
s
[
{
P
o
i
n
t
S
i
z
e
@
L
a
r
g
e
,
R
e
d
,
T
o
o
l
t
i
p
[
P
o
i
n
t
[
#
]
,
#
]
&
/
@
F
l
a
t
t
e
n
@
K
e
y
s
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
G
r
o
u
p
s
"
]
]
}
,
G
e
o
S
c
a
l
e
B
a
r
P
l
a
c
e
d
[
{
"
M
e
t
r
i
c
"
,
"
I
m
p
e
r
i
a
l
"
}
,
{
R
i
g
h
t
,
B
o
t
t
o
m
}
]
,
I
m
a
g
e
S
i
z
e
L
a
r
g
e
]
*
)
$
U
n
i
t
S
y
s
t
e
m
=
"
M
e
t
r
i
c
"
;
I
n
[
]
:
=
Map the airport hubs
G
e
o
G
r
a
p
h
i
c
s
[
{
P
o
i
n
t
S
i
z
e
[
0
.
0
0
1
]
,
P
o
i
n
t
[
K
e
y
s
@
d
a
t
a
[
"
t
e
m
p
"
,
"
p
o
p
u
l
a
t
i
o
n
"
,
"
a
s
s
o
c
G
e
o
P
o
s
i
t
i
o
n
"
]
]
,
R
e
d
,
P
o
i
n
t
S
i
z
e
[
0
.
0
0
5
]
,
T
o
o
l
t
i
p
[
P
o
i
n
t
[
#
]
,
#
]
&
/
@
K
e
y
s
@
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
G
r
o
u
p
s
"
]
}
,
I
m
a
g
e
S
i
z
e
8
0
0
]
O
u
t
[
]
=
We will now aggregate all traffic data to the corresponding airport hubs. Let’s work with IATA codes instead of entities.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
s
s
o
c
E
n
t
i
t
i
e
s
2
C
o
d
e
s
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
R
u
l
e
[
#
2
,
#
1
]
&
@
@
@
N
o
r
m
a
l
@
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
s
s
o
c
C
o
d
e
s
2
E
n
t
i
t
i
e
s
"
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
I
A
T
A
C
o
d
e
G
r
o
u
p
M
e
m
b
e
r
s
h
i
p
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
N
o
r
m
a
l
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
p
o
r
t
G
r
o
u
p
s
"
]
]
/
.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
s
s
o
c
E
n
t
i
t
i
e
s
2
C
o
d
e
s
"
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
I
A
T
A
C
o
d
e
G
r
o
u
p
M
e
m
b
e
r
s
h
i
p
"
]
[
[
;
;
3
]
]
A
T
L
{
A
T
L
,
C
S
G
,
M
C
N
,
P
D
K
,
A
H
N
,
A
N
B
,
M
G
E
,
F
T
Y
,
G
V
L
,
A
U
O
}
,
O
R
D
{
O
R
D
,
M
D
W
,
M
K
E
,
S
B
N
,
R
F
D
,
G
Y
Y
,
P
W
K
,
D
P
A
,
U
G
N
,
L
O
T
,
E
N
W
,
B
E
H
,
U
E
S
}
,
L
A
X
{
L
A
X
,
S
N
A
,
B
U
R
,
O
N
T
,
L
G
B
,
S
B
A
,
R
I
V
,
C
L
D
,
H
H
R
,
V
N
Y
,
V
C
V
,
S
M
O
,
O
X
R
,
E
D
W
,
T
O
A
}
O
u
t
[
]
=
The following association points to the associated airport hub for each airport
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
I
A
T
A
C
o
d
e
2
H
u
b
C
o
d
e
"
]
=
A
s
s
o
c
i
a
t
i
o
n
@
F
l
a
t
t
e
n
[
T
h
r
e
a
d
[
R
u
l
e
[
#
2
,
#
1
]
]
&
@
@
@
N
o
r
m
a
l
[
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
I
A
T
A
C
o
d
e
G
r
o
u
p
M
e
m
b
e
r
s
h
i
p
"
]
]
]
;
I
n
[
]
:
=
Replace airports for hubs in the dataset. Let’s first leave only the airports that we have identified.
x
=
D
e
l
e
t
e
C
a
s
e
s
[
(
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
d
a
t
a
"
]
[
[
A
l
l
,
{
3
,
5
,
1
}
]
]
)
/
.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
s
s
o
c
C
o
d
e
s
2
E
n
t
i
t
i
e
s
"
]
,
A
l
t
e
r
n
a
t
i
v
e
s
[
{
_
S
t
r
i
n
g
,
_
,
_
}
,
{
_
,
_
S
t
r
i
n
g
,
_
}
]
]
/
.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
s
s
o
c
E
n
t
i
t
i
e
s
2
C
o
d
e
s
"
]
/
.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
I
A
T
A
C
o
d
e
2
H
u
b
C
o
d
e
"
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
I
A
T
A
C
o
d
e
G
r
o
u
p
I
n
d
e
x
"
]
=
A
s
s
o
c
i
a
t
i
o
n
[
M
a
p
I
n
d
e
x
e
d
[
R
u
l
e
[
#
1
,
F
i
r
s
t
@
#
2
]
&
,
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
I
A
T
A
C
o
d
e
G
r
o
u
p
M
e
m
b
e
r
s
h
i
p
"
]
/
/
K
e
y
s
]
]
;
I
n
[
]
:
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
T
r
a
f
f
i
c
H
u
b
M
a
t
r
i
x
"
]
=
S
p
a
r
s
e
A
r
r
a
y
[
D
e
l
e
t
e
C
a
s
e
s
[
S
o
r
t
B
y
[
N
o
r
m
a
l
[
Q
u
e
r
y
[
G
r
o
u
p
B
y
[
{
#
[
[
1
]
]
,
#
[
[
2
]
]
}
&
]
,
T
o
t
a
l
,
#
[
[
3
]
]
&
]
[
x
]
]
/
.
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
I
A
T
A
C
o
d
e
G
r
o
u
p
I
n
d
e
x
"
]
,
F
i
r
s
t
]
,
A
l
t
e
r
n
a
t
i
v
e
s
[
{
a
_
,
a
_
}
_
,
{
_
S
t
r
i
n
g
,
_
}
_
,
{
_
,
_
S
t
r
i
n
g
}
_
]
,
I
n
f
i
n
i
t
y
]
]
S
p
a
r
s
e
A
r
r
a
y
S
p
e
c
i
f
i
e
d
e
l
e
m
e
n
t
s
:
5
6
8
0
D
i
m
e
n
s
i
o
n
s
:
{
1
6
7
,
1
6
7
}
O
u
t
[
]
=
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
]
/
/
K
e
y
s
{
u
s
A
i
r
p
o
r
t
s
,
a
i
r
p
o
r
t
C
o
o
r
d
i
n
a
t
e
s
,
a
s
s
o
c
C
o
d
e
s
2
E
n
t
i
t
i
e
s
,
a
i
r
p
o
r
t
T
r
a
f
f
i
c
,
d
s
A
i
r
p
o
r
t
s
,
d
i
s
t
a
n
c
e
M
a
t
r
i
x
,
n
e
a
r
b
y
P
a
i
r
s
,
a
i
r
p
o
r
t
G
r
o
u
p
s
,
a
s
s
o
c
E
n
t
i
t
i
e
s
2
C
o
d
e
s
,
I
A
T
A
C
o
d
e
G
r
o
u
p
M
e
m
b
e
r
s
h
i
p
,
I
A
T
A
C
o
d
e
2
H
u
b
C
o
d
e
,
I
A
T
A
C
o
d
e
G
r
o
u
p
I
n
d
e
x
,
a
i
r
T
r
a
f
f
i
c
H
u
b
M
a
t
r
i
x
,
a
i
r
p
o
r
t
H
u
b
C
o
o
r
d
i
n
a
t
e
s
,
a
i
r
p
o
r
t
H
u
b
I
n
d
e
x
}
O
u
t
[
]
=
C
l
e
a
r
[
x
]
I
n
[
]
:
=
Checking that the air traffic mobility network looks correct.
S
h
o
w
G
r
a
p
h
i
c
s
F
a
c
e
F
o
r
m
[
L
i
g
h
t
G
r
a
y
]
,
E
d
g
e
F
o
r
m
[
B
r
o
w
n
]
,
C
o
n
t
i
n
e
n
t
a
l
U
S
s
t
a
t
e
s
A
D
M
I
N
I
S
T
R
A
T
I
V
E
D
I
V
I
S
I
O
N
S
[
"
P
o
l
y
g
o
n
"
]
,
A
d
j
a
c
e
n
c
y
G
r
a
p
h
S
i
g
n
@
N
o
r
m
a
l
@
d
a
t
a
[
"
t
e
m
p
"
,
"
a
i
r
T
r
a
f
f
i
c
"
,
"
a
i
r
p
o
r
t
s
"
,
"
a
i
r
T
r
a
f
f
i
c
H
u
b
M
a
t
r
i
x
"
]
,
E
d
g
e
S
t
y
l
e
{
O
p
a
c
i
t
y