Metrics

Every column on this site: formula, unit, domain, reading.

Sign conventions

Both are signed: an absolute value would merge early and late starts.

Quantity Definition Good when
off_s trk_start − ATOT negative: began before take-off, heard on the ground
land_s trk_end − ALDT positive: ran past landing, into taxi-in

Measured and estimated aerodromes

Each aerodrome’s tier depends on its own measured_pct (APDF-milestone share, busier side); measured means ≥ 50.

Tier Milestones Capture metrics Ranked on
Tier A (measured) AOBT, ATOT, ALDT, AIBT yes coverage_index
Tier B (estimated) Network Manager: take-off = AOBT_3 + TAXI_TIME_3; ARVT_3 adds FLT_DUR_3, not measured no (no in-block time outside APDF) detection_pct

352 aerodromes rank for 2026: 89 measured, 263 estimated (n_gt ≥ 20 floor).

NoteWhy the classification is not t_source

t_source is "apdf" only when both ends are covered: right for a two-ended metric, wrong per aerodrome.

On 2025 data, 44,841 flights have a genuine APDF in-block time, but only 22,588 are labelled "apdf": 22,254 departed from an uncovered aerodrome, mislabelling 26 aerodromes with 20+ movements despite 99–100% of arrivals measured (Helsinki, Stuttgart among them).

Per-endpoint flags dep_measured/arr_measured carry the answer; t_source stays untouched so nothing published on it moves.

Estimated times were validated at median error 0 s, IQR 17 s (take-off), 25 s (landing): accurate, but not observations. ARVT_3 reproduces from AOBT_3 + TAXI_TIME_3 + FLT_DUR_3 within 7 s (median), 30 s (max): a duration figure, not a reconstructed arrival.

Columns

Side-specific columns take a _dep/_arr suffix; departures group on gt_adep, arrivals on gt_ades. Full definitions are below.

Counts and detection

Column Formula Unit Domain Reading
n_gt_dep, n_gt_arr ground-truth movements here flights ≥ 0 sample size; ranking needs ≥ 20
n_detected_dep, n_detected_arr ≥ 1 assigned state vector flights 0..n_gt
detection_pct_dep, detection_pct_arr 100 · n_detected / n_gt % 0..100 100 = seen at least once
dep_bins_total, arr_bins_total ceil(ground phase seconds / 30) bins ≥ 1 30 s ground-phase slices
dep_bins_seen, arr_bins_seen bins with ≥ 1 position report bins 0..total
dep_n_samples, arr_n_samples reports inside the ground phase count ≥ 0
n_capture_excluded_dep, ..._arr measured movements with AOBT ≥ ATOT or AIBT ≤ ALDT flights ≥ 0 excluded, not clipped: unmeasured means no capture, not impossible
measured_pct_dep, ..._arr 100 · #(endpoint measured by APDF) / n_gt % 0..100 ≥ 50 = ground coverage measurable
dep_measured, arr_measured per flight: did APDF supply the milestones bool computed only where true; never a predicted-time denominator

Movements is n_gt_dep + n_gt_arr; n_gt is their max, gating the floor. Percentiles use detected flights, since an undetected flight has no offset.

Boundary error

Duration columns are seconds, downloads included; pages show minutes.

Column Formula Unit Domain Reading
off_s_p10off_s_p90 percentiles of off_s over detected departures s signed p90 = worst decile; p50 near zero = take-off start
land_s_p10land_s_p90 percentiles of land_s over detected arrivals s signed p10 = worst decile
off_abs_p50, off_abs_p90 percentiles of |off_s| s ≥ 0 V1 comparability only: merges early and late starts
land_abs_p50, land_abs_p90 percentiles of |land_s| s ≥ 0 as above

Ground coverage: measured aerodromes only

A raw duration isn’t comparable between aerodromes; normalising by the ground phase fixes that.

ImportantSpanned is not observed

Reach: how far back the first report lies; one report at the stand scores 1.000, too generous. Continuity: how much of the taxi was observed, in 30-second bins.

The index uses signal. Continuity and reach stay as diagnostics: high continuity with low signal is a thin but unbroken stream; high reach with low continuity is the failure reach was added to catch.

Column Formula Unit Domain Reading
dep_signal_p10p90 percentiles of dep_n_samples / (taxi_out_s / 5), dep_measured flights only fraction ≥ 0, not clipped the headline: share of taxi-out reception received
arr_signal_p10p90 the same over [ALDT, AIBT] fraction ≥ 0, not clipped share of taxi-in reception received
dep_continuity_p10p90 percentiles of dep_bins_seen / dep_bins_total, dep_measured flights only fraction 0..1 share of the taxi-out observed
arr_continuity_p10p90 the same over [ALDT, AIBT] fraction 0..1 share of the taxi-in observed
dep_max_gap_median_s median longest silence in the taxi-out s ≥ 0 a blind spot, not weak reception
arr_max_gap_median_s the same for taxi-in s ≥ 0
dep_reach_p10p90 percentiles of clip((ATOT − trk_start) / (ATOT − AOBT), 0, 1) fraction 0..1 diagnostic: how much of the taxi-out the track spans
arr_reach_p10p90 percentiles of clip((trk_end − ALDT) / (AIBT − ALDT), 0, 1) fraction 0..1 diagnostic
dep_no_ground_pct 100 · #(off_s ≥ 0) / n_detected % 0..100 never heard on the ground
arr_no_ground_pct 100 · #(land_s ≤ 0) / n_detected % 0..100 lost at or before landing
dep_full_capture_pct 100 · #(dep_continuity ≥ 0.95) / n_detected % 0..100 whole taxi-out observed, not merely spanned
arr_full_capture_pct 100 · #(arr_continuity ≥ 0.95) / n_detected % 0..100
taxi_out_median_s median ATOT − AOBT s > 0 context
taxi_in_median_s median AIBT − ALDT s > 0 context

Signal, reach and continuity use only measured milestones. A Tier B aerodrome gets the same computation over a predicted taxi window, in the same column, asterisked on measured rows.

Column Formula Unit Domain Reading
dep_signal_p50 (Tier B) median dep_signal computed over [AOBT_3, AOBT_3 + TAXI_TIME_3] fraction ≥ 0, not clipped median only; measured rows carry *

A non-positive ground phase is bad data, not zero coverage: those flights are excluded into n_capture_excluded, not clipped to 0 or 1.

Segmentation quality

Present so a poor number can be pinned on reception or algorithm. A flight that is both counts as merged.

Split understates coverage: scored on its largest piece, a split departure’s track starts a median 6.5 min later than a clean one, same aerodrome. Merged shows little effect on the survivor (median −0.009, twelve aerodromes, ten-plus each), dropping the other flight entirely. Merged flights score better fleet-wide, a confound: they concentrate at well-covered aerodromes.

Column Formula Unit Domain Reading
clean_pct_dep, clean_pct_arr 100 · #(one flight ↔︎ one track) / n_gt % 0..100
fragmented_pct_dep, ..._arr 100 · #(one flight → several tracks) / n_gt % 0..100 recoverable: present in pieces
merged_pct_dep, ..._arr 100 · #(several flights → one track) / n_gt % 0..100 unrecoverable: other flights don’t exist downstream

The ranking

Column Formula Unit Domain Reading
coverage_index see below fraction 0..1 share of one movement the network captures
rank position in the table ≥ 1 measured table ranks on coverage_index; all-aerodromes table on detection_pct

The coverage index, spelled out

Every term above is defined already; the formula follows, since each part is itself an average.

coverage_index  =  (detection_pct / 100)  ×  mean(dep_signal_p50, arr_signal_p50)
  • detection_pct / 100: share of movements seen at all (≥ 1 position report between take-off and landing).
  • dep_signal_p50 / arr_signal_p50: median share of expected ground reports that arrived, taxi-out and taxi-in.
  • mean(...): both sides averaged.

It is blank, not zero, where ground figures can’t be computed, and never falls back to reach or detection alone.

Column reference

Every column on the site, in full: tables above give the formula; hovering a heading gives the one-line version, and this section gives the full one.

Taxi-in observed (worst 10%)

arr_continuity_p10

The worst-covered tenth of arrivals.

Taxi-in without gaps (median)

arr_continuity_p50

The same over the taxi-in.

Taxi-in observed (best 10%)

arr_continuity_p90

The best-covered tenth of arrivals.

Whole taxi-in observed (%)

arr_full_capture_pct

The same for taxi-in.

Longest taxi-in gap (min, median)

arr_max_gap_median_s

The same for taxi-in.

Lost at landing (%)

arr_no_ground_pct

The share of arrivals whose track ends at or before landing.

Taxi-in spanned (median)

arr_reach_p50

The same on the arrival side, measured forward from landing to the track’s last report.

Taxi-in received (median)

arr_signal_p50

The same computation over the taxi-in: the interval between landing and in-block, with reports counted against the same 5-second expectation.

One flight, one track (%)

clean_pct_arr

As above, over arrivals.

One flight, one track (%)

clean_pct_dep

The share of movements the track-building algorithm matched to exactly one track that contains no other flight. Position reports arrive as a continuous stream per airframe with no notion of a flight, so they have to be cut into flights first; this says how often that cut was right here.

Coverage index

coverage_index

The share of movements seen at all, multiplied by the share of a typical ground movement received (the average of the taxi-out and taxi-in medians).

Read it as the expected share of one movement the network captures. 1.00 is perfect; 0.00 means the surface is invisible even where the aircraft is tracked once airborne.

Left blank, never zero, where the ground figures are unavailable. Falling back to detection alone would rank an unmeasurable aerodrome as though it were well covered.

Taxi-out observed (worst 10%)

dep_continuity_p10

The worst-covered tenth of departures, by the 30-second-slice measure.

Taxi-out without gaps (median)

dep_continuity_p50

The taxi-out cut into 30-second slices; this counts how many held at least one report, regardless of how many were expected.

Read it against “received”: high here and low there means a thin but unbroken stream, arriving every half-minute but far short of what was expected.

Taxi-out observed (best 10%)

dep_continuity_p90

The best-covered tenth of departures, by the same measure.

Whole taxi-out observed (%)

dep_full_capture_pct

The share of departures where at least 95% of the expected reports arrived during taxi-out — effectively complete coverage of the ground movement.

Longest taxi-out gap (min, median)

dep_max_gap_median_s

The longest unbroken silence during taxi-out, for a typical departure. Measured from the start of the taxi to the first report, between consecutive reports, and from the last report to take-off — so a receiver that stops halfway is counted as having a gap even though no two reports straddle it. A large gap alongside otherwise good reception points at one blind spot rather than weak coverage throughout.

Never seen on the ground (%)

dep_no_ground_pct

The share of departures whose track starts at or after take-off — the aircraft was never heard while it was on the ground at all.

Taxi-out spanned (median)

dep_reach_p50

How far back the track’s first report lies, as a fraction of the taxi: the time between that report and take-off, divided by the taxi duration.

Disagrees with “received” in a revealing way: a single report at the stand and nothing afterwards spans the entire taxi and scores 1.00 here, where “received” scores it near zero.

Taxi-out received (median)

dep_signal_p50

The taxi-out is the interval between two measured times: off-block, and take-off. The feed delivers about one position report every 5 seconds, so a taxi of n seconds should produce about n/5 reports. We count how many arrived and divide by how many were expected, then take the median across this aerodrome’s departures.

1.00 means the aircraft was tracked the whole way out. 0.10 means nine reports in ten never arrived.

Flights seen (%)

detection_pct

Movements seen divided by movements the reference data records. Read it as a floor, not a coverage figure: above 99% at four measured aerodromes in five, it separates “invisible to the network” from “seen, but only partly” and says nothing about how much was tracked.

A flight counts as seen if one position report comes from the same airframe, matched on the ICAO address, and falls between its take-off and landing. That window is the airborne one, which is why this says nothing about ground coverage.

Arrivals seen (%)

detection_pct_arr

As above, over arrivals only.

Departures seen (%)

detection_pct_dep

As above, over departures only.

Split across tracks (%)

fragmented_pct_arr

As above, over arrivals.

Split across tracks (%)

fragmented_pct_dep

The share of movements broken across several tracks. Recoverable — the flight is present, in pieces — but coverage is measured against the largest piece, so a split flight’s coverage is understated. Within the same aerodrome a split departure’s track starts a median 6.5 minutes later than a clean one, which is the size of the understatement.

Track end vs landing (min, earliest 10%)

land_s_p10

The worst tenth, where tracking stops earliest relative to landing.

Track end vs landing (min, median)

land_s_p50

The gap between landing and the end of the track, in minutes, for a typical arrival: the track’s last position report minus the recorded landing time.

Positive is good: the aircraft was still being tracked while it taxied in. Negative means the track ended before the aircraft was down.

Track end vs landing (min, latest 10%)

land_s_p90

The best tenth, where tracking continues longest after it.

Times measured?

measured

Whether this aerodrome’s real stand and runway times are recorded by the operator. Where they are, the taxi phase has exact bounds and how much of it was received can be measured; where they are not, only whether the flight was seen at all.

Milestones measured (%)

measured_pct

The share of this aerodrome’s movements whose stand and runway times come from the airport operator, rather than being estimated. At or above 50% the aerodrome is treated as measured; below it, only whether flights were seen at all.

Arrival milestones measured (%)

measured_pct_arr

As above, over arrivals only.

Departure milestones measured (%)

measured_pct_dep

As above, over departures only.

Merged with another flight (%)

merged_pct_arr

As above, over arrivals.

Merged with another flight (%)

merged_pct_dep

The share of movements sharing a track with another flight. Only one comes out of a merged track; the other does not exist downstream. The survivor’s own coverage shows no consistent shift (median −0.009 against clean flights): a completeness loss, not a coverage one.

Unusable reference rows

n_capture_excluded

Movements whose recorded times are impossible — an off-block after take-off, or an on-stand before landing. They are dropped from the ground-coverage figures and counted here instead. Dropping rather than clamping matters: a movement with a negative taxi duration has no denominator, and forcing it to zero or one would move this aerodrome’s median for a reason that has nothing to do with reception.

Unusable reference rows (arr)

n_capture_excluded_arr

As above, on the arrival side.

Unusable reference rows (dep)

n_capture_excluded_dep

As above, on the departure side.

Movements seen

n_detected

How many of those movements produced any ADS-B position report at all, matched by airframe (24-bit ICAO address) and by time, inside that flight’s own airborne interval. One matching report is enough to count as seen.

Arrivals seen

n_detected_arr

Landings with at least one matching position report.

Departures seen

n_detected_dep

Take-offs with at least one matching position report. See “Movements seen”.

Movements (larger side)

n_gt

The larger of the two sides. The ranking floor and nothing else: 20 movements on one side, a stricter test than 20 across both.

Arrivals

n_gt_arr

Landings the reference data records here, counted against the flight’s destination aerodrome.

Departures

n_gt_dep

Take-offs the reference data records here over the sampled days, counted against the flight’s origin aerodrome.

Movements

n_movements

Take-offs plus landings the reference data records here, one flight contributing a movement at each end. The reference is the Network Manager flight table, independent of ADS-B. Where only one side is known, this counts the side that is.

Track start vs take-off (min, earliest 10%)

off_s_p10

The earliest tenth of departures — how far ahead of take-off tracking begins when this aerodrome is at its best.

Track start vs take-off (min, median)

off_s_p50

The gap between when the track starts and when the aircraft actually left the ground, in minutes, for a typical departure. Computed as the track’s first position report minus the recorded take-off time.

Negative is good: the track began before take-off, so the aircraft was already being followed on the ground. Positive means part of the departure was never seen.

Track start vs take-off (min, latest 10%)

off_s_p90

The latest tenth — how much of the departure is missed in the worst cases here.

Coverage

rating

A band over the coverage index, so a long table can be scanned without reading three decimals on every row: Excellent at 0.90 and above, Good from 0.60, Partial from 0.30, Poor from 0.05, and None below that.

Typical taxi-in (min)

taxi_in_median_s

How long a typical taxi-in takes here, from landing to in-block.

Typical taxi-out (min)

taxi_out_median_s

How long a typical taxi-out takes here, from off-block to take-off. Context rather than a coverage figure: the same three minutes of reception is most of a short taxi and a fraction of a long one, which is why coverage is expressed as a fraction and not as a duration.

Tracking errors (%)

tracking_err_pct

The share of this aerodrome’s movements the track-building step got wrong: split and merged added together.

Split understates coverage, because only the largest piece is scored. A split departure’s track starts a median 6.5 minutes later than a clean one, at 182 of 206 aerodromes.

Merged costs a whole flight: two share a track, one survives, the other is absent downstream. No measurable effect on the survivor (median −0.009, on 0.8% of movements).

So a high figure means coverage understated and movements missing, not poor reception.

Each heading’s anchor ({#coverage-index}) links its definition, so a reader can be pointed at one column, not the whole page.