OpenSky Flight-Route Atlas
A TMAP of 200,000 flights from the OpenSky monthly flightlist, each encoded as a seven-feature route fingerprint (log flight duration, log great-circle distance, origin/destination geography, and related derived fields, z-scored) with Euclidean metric. Route regions separate cleanly on the tree - only 0.8% of edges (1,632 / 199,999) cross an origin-destination continent-pair boundary, with EU-EU (28.1%) and AS-AS (6.4%) the largest identified regions after a large share of unresolved airport pairs (49.7%). Aircraft-type clustering is weaker (mean subtree purity 0.341), since a given route is flown by many different aircraft types, but haul length still concentrates distinctly: long-haul flights (n=12,071) form a tighter cluster (spread 0.2) than short-haul flights (n=134,148, spread 0.3). The top carriers by ICAO callsign are Southwest (10,795 flights), American (10,437), and United (6,537); 2,924 flights in this slice are military or state aircraft.
This demo is hosted externally
The dataset is too large to embed inline. Opens in a new tab.
Open Interactive DemoHow it was made
import numpy as np
from tmap import TMAP
from tmap.graph.analysis import boundary_edges
# Seven-feature route fingerprint, z-scored: log duration, log distance, geography, etc.
X = route_fingerprint(flights)
model = TMAP(metric="euclidean", n_neighbors=20, seed=42).fit(X)
be = boundary_edges(model.tree_, flights["route_region"].to_numpy())
print(f"Route-region boundary edges: {len(be)} / {len(model.tree_.edges)}")
viz = model.to_tmapviz()
viz.add_color_layout("route region", flights["route_region"].tolist(), categorical=True, color="tab20")
viz.add_color_layout("aircraft type", flights["aircraft_type"].tolist(), categorical=True, color="tab20")
viz.write_html("opensky_flights.html")