kimo

Mapping GNSS interference with ADS-B quality indicators

You can map GNSS interference from ADS-B because every aircraft position report includes the aircraft's own estimate of its navigation integrity (NIC) and accuracy (NACp). When many aircraft crossing the same area report degraded values at the same time, the likeliest explanation is interference on the ground, not a fleet of faulty receivers. Aggregate those reports per aircraft, per hexagon, per day, correct for sparse traffic, and you get a daily interference map that is useful for situational awareness, as long as you respect its limits.

Hugo Lefèvre
Aviation data analyst11 min read7 sources

GNSS interference has moved from a niche concern to a routine operational issue for civil aviation. EASA updated its Safety Information Bulletin on GNSS outages and alterations in July 2024, stating that spoofing is riskier for air operations than jamming and noting cases of crews reacting to false terrain-warning pull-up alerts4. In March 2026, EASA and EUROCONTROL published a joint European action plan to keep operations safe during GNSS interference6. Official reporting is the reference, but it is periodic. Open ADS-B data lets analysts see daily patterns, and it is the basis of the GNSS layer in Kimo Defense Intelligence.

§01What are NIC and NACp?

Both are produced by the aircraft's navigation system and travel with position data (NIC is derived from the type code plus supplement bits). When a GNSS receiver loses satellite lock or detects inconsistent measurements, these values drop, often all the way to 0. That is what makes them such a useful sensor: thousands of aircraft act as a moving, self-reporting monitoring network. Researchers at Stanford have used NIC as a proxy for GNSS reception quality precisely because ADS-B carries no direct signal metrics3.

NICContainment radius (Rc)How we read it
11< 7.5 mNormal
10< 25 mNormal
9< 75 mNormal
7–8up to 0.2 NM (7)Normal, lower bound
1–6larger radiiDegraded
0UnknownSeverely degraded or lost
NIC radii from the 1090 Megahertz Riddle; the "NIC 7 or better" normal-operation bound is the 14 CFR 91.227 requirement as cited by Liu et al. (sources 1 and 3).

Why 7? Under 14 CFR § 91.227, aircraft must maintain NIC of at least 7 in normal operation, which corresponds to a containment radius below 0.2 NM, so anything lower indicates degraded GNSS reception3. In the same work, the authors treat NIC 0 as received interference above their tolerance threshold and NIC 1 to 6 as moderate interference3. We use the same cut points in Kimo's default model, and expose them as parameters.

§02How do you turn aircraft reports into an interference map?

Mapping GNSS interference from ADS-B quality fieldsNIC/NACp degradation reported by aircraft is aggregated per aircraft into hexagonal cells, then rolled up into a daily map.Position reports (simulated)AircraftNICNACpNavSIM101810okSIM20279okSIM30300lowSIM404810okSIM50524lowSIM60679okFlag degradedNIC or NACp below thresholdAggregate to hexes% degraded per cell per dayLow< 2% aircraftMedium2–10%High> 10%Illustrative grid · simulated data
Figure.NIC/NACp degradation reported by aircraft is aggregated per aircraft into hexagonal cells, then rolled up into a daily map.

Scroll sideways to see the full diagram.

The public reference for this method is GPSJam (opens in a new tab), which aggregates ADS-B position reports from community receiver networks over 24 hours and colors hexagons by the share of aircraft reporting low navigation accuracy: green where more than 98% reported good accuracy, yellow where 2% to 10% reported low accuracy, red where more than 10% did2. Its FAQ also describes subtracting one from the bad-aircraft count before computing the percentage, which suppresses false positives in cells crossed by very few aircraft2. GPSJam classifies aircraft on NACp2; Kimo's model follows the same logic but defaults to NIC, as the Stanford work does, because NIC is available with every position message while NACp is broadcast less often3. Both fields are supported.

  1. Step 1:

    Keep position reports with quality fields

    You need decoded NIC and/or NACp. Note that the OpenSky REST state vectors do not include them5, so use a receiver feed or a historical dataset that preserves decoded ADS-B messages. The ADS-B ingestion guide shows both paths.

  2. Step 2:

    Bin positions into hexagonal cells

    Hexagons have uniform neighbor distances and tile the globe cleanly. We default to H3 resolution 4 for regional views and 5 for local ones; coarser cells mean more aircraft per cell and steadier percentages.

  3. Step 3:

    Classify each aircraft once per cell per day

    For each aircraft in a cell, take the median NIC across its reports there. If the median is below 7 the aircraft counts as degraded, otherwise as good. One aircraft, one vote.

  4. Step 4:

    Compute a sparse-safe share

    Apply the minus-one correction and a minimum of five distinct aircraft per cell before publishing a value. Cells under the minimum are shown as "insufficient traffic", never as green.

  5. Step 5:

    Publish daily, compare to baseline

    Store each day's cell values and compare them with the trailing 28-day baseline, so recurring hot spots and new ones are visibly different.

Formula

Degraded share=max(degraded aircraft − 1, 0) ÷ (good aircraft + degraded aircraft)

where
degraded aircraft
Distinct aircraft whose median NIC in the cell that day was below 7
good aircraft
Distinct aircraft whose median NIC was 7 or higher
Daily degraded share per hexagon
sql
with per_aircraft as (
  select date_trunc('day', ts)             as day,
         h3_latlng_to_cell(lat, lon, 4)    as cell,
         icao24,
         percentile_cont(0.5) within group (order by nic) as median_nic
  from adsb_positions
  where nic is not null
    and on_ground = false
  group by 1, 2, 3
)
select day, cell,
       count(*) filter (where median_nic >= 7) as good,
       count(*) filter (where median_nic <  7) as degraded,
       greatest(count(*) filter (where median_nic < 7) - 1, 0)::float
         / count(*)                            as degraded_share
from per_aircraft
group by day, cell
having count(*) >= 5;
Daily degraded share in one region
  • Degraded share
  • 28-day baseline
Figure. Illustrative data: simulated 14-day series for one region, share of aircraft with median NIC below 7 versus the trailing baseline.

Reading a red cell: a worked example

Suppose a cell saw 46 distinct aircraft yesterday, 9 of them with a median NIC below 7. The corrected share is (9 − 1) ÷ 46 ≈ 17%, which puts it in the high band. Before anyone reacts, the drill-down answers three questions. Were the degraded aircraft spread across operators and types, or concentrated in one fleet (which would point to avionics)? Did degradation cluster at certain altitudes or on certain routes? And is the cell new, or has it been elevated for weeks? A cell that is high today but at baseline yesterday, across many operators, is the pattern worth reporting. A cell where one airframe type accounts for every degraded aircraft is usually a data-quality note.

§03Does the map show jamming or spoofing?

EASA defines jamming as intentional radio-frequency interference that prevents GNSS receivers from locking onto satellite signals, and spoofing as broadcasting counterfeit satellite signals that make receivers compute incorrect position, navigation and timing7. A degraded-NIC map is primarily a jamming-like signal: the receiver knows it is in trouble and says so.

Spoofing is harder. A spoofed receiver may report a confident, high-NIC position that is simply wrong. EASA explicitly calls spoofing harder to detect4. Open data can still surface symptoms, for example positions that jump far from the previous point, or ADS-B positions that disagree with independent MLAT positions for the same aircraft. In Kimo we model those as separate anomaly layers with their own confidence and never merge them silently into the NIC map.

§04What are the limits and false positives?

  • The map shows where aircraft were affected, not where a source is. Interference reaches aircraft at altitude over long distances, so affected cells can be far from any emitter. Kimo stays at area-level mapping for awareness.
  • No traffic, no data. Closed airspace, oceans and remote areas produce empty cells. Empty is not the same as clean.
  • Avionics differences. Some airframes report low integrity values for reasons unrelated to interference, such as equipment configuration. Per-aircraft voting and minimum counts reduce their weight; a "chronic offender" list removes the rest.
  • Ground and low-altitude reports. Surface positions and aircraft near the ground behave differently; exclude on_ground rows by default.
  • Feed composition changes. If a receiver network adds coverage in a new area, the denominator changes. Compare against baselines from the same feed mix.

§05How the GNSS layer works in Kimo

The GNSS interference monitor template ships the model above: a positions source, a gnss_daily_cells model with configurable thresholds, a map layer on the Map view, and an alert when a cell exceeds both 10% and three times its baseline on two consecutive days. The detection guide walks through tuning. The same tracks power the Airspace view, so an analyst can click a red cell and see which (simulated) flights crossed it, with their NIC traces.

NIC < 7
default "degraded" threshold
−1
sparse-cell correction on degraded count
≥ 5
distinct aircraft before a cell is shown
24 h
default aggregation window
Sources for the GNSS layer: your own receivers or Kafka streams for decoded quality fields, OpenSky for traffic context, Kimo Bridge to keep raw data on your servers.

Frequently asked questions

Can ADS-B data detect GPS jamming?

Indirectly, yes. Aircraft broadcast NIC and NACp values that drop when their GNSS receiver is degraded. When many aircraft in the same area report degraded values on the same day, interference is the most likely explanation.

What NIC value indicates GNSS interference?

A common threshold is NIC below 7, because US rules require NIC 7 or better (a containment radius under 0.2 NM) in normal operation. NIC 0 indicates severe degradation or loss.

Why count aircraft instead of messages?

Aircraft broadcast positions about twice per second, so one aircraft lingering in an area would dominate a message count. Classifying each aircraft once per cell per day gives every aircraft equal weight.

Can this method detect spoofing?

Not reliably on its own, because a spoofed receiver may report a confident but wrong position. Spoofing symptoms such as implausible jumps or disagreement with MLAT positions need separate anomaly checks.

Does OpenSky provide NIC and NACp?

Not in its REST state vectors. You need a source of decoded ADS-B messages, such as your own receivers or a dataset that preserves the quality fields.

Sources

7 references
  1. The 1090 Megahertz Riddle: Uncertainty, accuracy and integrity (opens in a new tab)
    Junzi Sun, TU Delft (mode-s.org)mode-s.org

    NIC and NACp tables and containment radii.

  2. GPSJam FAQ (opens in a new tab)
    GPSJam.orggpsjam.org

    Daily hexagon aggregation, NACp-based classification, 2%/10% thresholds, minus-one correction.

  3. Locating GNSS interference sources using ADS-B with non-linear least squares (opens in a new tab)
    Liu, Lo, Blanch, Chen, Walter — NAVIGATION (Institute of Navigation), vol. 72 no. 32025navi.ion.org

    NIC as a proxy for GNSS reception (broadcast with every position, unlike NACp); NIC ≥ 7 normal-operation requirement under 14 CFR 91.227.

  4. EASA updates Safety Information Bulletin on global navigation satellite system outages and alterations (opens in a new tab)
    EASA2024easa.europa.eu

    SIB 2022-02R3: spoofing riskier than jamming; false TAWS pull-up warnings.

  5. OpenSky REST API documentation (opens in a new tab)
    OpenSky Networkopenskynetwork.github.io

    State vector fields (no NIC/NACp in state vectors).

  6. Global Navigation Satellite System outages and alterations (opens in a new tab)
    EASAeasa.europa.eu

    Definitions of jamming and spoofing; affected FIRs; operator recommendations.

External sources were accessed at the time of writing. Kimo product details, customers and figures in examples are illustrative unless a source is cited.

  • #GNSS
  • #ADS-B
  • #Interference
Found this useful? Pass it on.
Written by
Hugo Lefèvre
Aviation data analyst at Kimo · 2 articles

Writes about ADS-B, Airspace, OSINT, GNSS.

Kimo people and customers mentioned are illustrative; example charts use simulated data unless a source is cited. All aircraft data shown in Kimo is simulated.

Put it to work

Go deeper

Whitepaper

Airspace Awareness from Open Data

ADS-B, Mode-S and GNSS interference: what open aviation data can reveal, its limits, and how to fuse it responsibly.

32 pages
Live demo

Open Airspace

Tracks, emergency squawks and a GNSS-interference map on a simulated feed.

Simulated data · no sign-up

All resources
Template
Defense

GNSS interference monitor

Daily interference map from aircraft navigation-accuracy reports.

Kimo team
4 min setup
Whitepaper
Defense

Airspace Awareness from Open Data

ADS-B, Mode-S and GNSS interference: what open aviation data can reveal, its limits, and how to fuse it responsibly.

Hugo Lefèvre
32 pages

Airspace awareness from open data.

Fuse ADS-B, AIS and OSINT feeds on your own infrastructure. The demo runs entirely on simulated data.