NoisefloorThe Intelligence Company

Download and reuse

Everything behind the map, the charts and the Sea page can be downloaded and reused under its licence. Nothing here needs an account.

What you can use, and how to credit it

DataWhereLicenceCredit
GNSS degradation, every day since 1 Oct 2025 (per cell, hour and minute; anomalies, bursts, SBAS flags)Monthly releases on GitHubODbL 1.0"Contains data derived from adsb.lol (ODbL 1.0), processed by Noisefloor (noisefloor.theintelligence.company)." Share derived databases under ODbL too.
The site's own map, event, trend and chart filesSite files belowODbL 1.0
Daily summary feed/feed.xml (Atom)ODbL 1.0
Announced US GPS interference testsdeclared-data release, faa_gps_tests.jsonParsed from FAA flight advisories, a US government work (public domain in the US)"FAA SPANS flight advisories, parsed by Noisefloor."
L-band emitter sites from NISAR radar (repeat sites, their detections and the passes that covered them; leads, not attribution)nisar-data release, <day>.nisar.json, and /data/nisar/ belowDerived from NASA-ISRO NISAR (ASF DAAC), NASA open data, CC0; the aircraft cross-check counts in it are ODbL 1.0 (from adsb.lol)"NASA-ISRO NISAR data via ASF DAAC, processed by Noisefloor." Add the adsb.lol credit above if you use the aircraft counts.
GPS interference regions from the COSMIC-2 satellites' navigation antennas (cells scored at or above the validated threshold, by day)cosmic2-data release, <day>.cosmic2.json, and /data/cosmic2/ belowDerived from UCAR CDAAC COSMIC-2 data (CC BY 4.0)"COSMIC-2 data: UCAR COSMIC Program (CDAAC); processed by Noisefloor."
GPS interference regions from Sentinel-6A's own receiver (cells scored at or above the validated threshold, by day)s6-data release, <day>.s6.json, and /data/s6/ belowDerived from Copernicus Sentinel-6A data (PO.DAAC; openly shared without restriction; Copernicus: free, full and open)"Contains modified Copernicus Sentinel data [year]; Sentinel-6A GNSS-RO-POD tracking data, PO.DAAC, doi:10.5067/S6AGN-1ROPD; processed by Noisefloor."
Interference in the protected 1400–1427 MHz band from NASA SMAP (stand-out emitter cells and busy regions, 7 days to each day)smap-data release, <day>.smap.json, and /data/smap/ belowDerived from NASA SMAP L1C (NSIDC DAAC), NASA open data"SMAP L1C Radiometer Half-Orbit 36 km EASE-Grid Brightness Temperatures, Version 6, NSIDC DAAC, doi:10.5067/DV7IX2DQ681Y; processed by Noisefloor."
C-band (5.4 GHz) radar activity from Sentinel-1's own interference reports (share of passes with interference per H3 res-3 cell, 28 days to each day)s1-data release, <day>.s1.json, and /data/s1/ belowDerived from Copernicus Sentinel-1 Level-1 annotations (free, full and open, including commercial use, with attribution)"Contains modified Copernicus Sentinel data [year]; processed by Noisefloor."
Sea page vessels (sanctioned, military, law-enforcement and state-flag ships in Finland's open AIS)baltic.json, gnss_at_sea.json, or the CSV and GeoJSON buttons on the Sea pageMixed: Digitraffic AIS CC BY 4.0; OFAC SDN List (US government work); UK Sanctions List (OGL v3.0); Marine Regions zones CC BY 4.0; NGA World Port IndexEach file carries its sources' attribution lines; keep them.

Aggregates only: the GNSS files hold counts per H3 cell and region, never aircraft identifiers. The daily files are made automatically and not reviewed by a person, apart from the 20 validated days (on the Validation page).

GNSS degradation: monthly releases

One GitHub release per month, named pnt-data-YYYY-MM, with one set of files per UTC day. A day's files appear the next morning, after the daily run at 05:40 UTC (about 12:40 AM CDT), with a second try at 12:40 UTC for late archives. Download one file directly with https://github.com/metacog-osint/noise-floor/releases/download/pnt-data-YYYY-MM/<file>.

All releases: github.com/metacog-osint/noise-floor/releases.

Gaps are at the source: adsb.lol published no archive for 31 Dec 2025 or 6 May 2026, its 5 May 2026 archive holds no traces, and its 7 May 2026 archive covers about 6 hours.

File (per day)What it holdsTypical size
<day>.parquetOne row per H3 cell (resolution 4, about 1,770 km²) seen that day0.7 MB
<day>.hourly.parquetOne row per cell and UTC hour1.1 MB
<day>.minute.parquetAircraft with gross degradation per cell and minute (nonzero rows only)0.1 MB
<day>.anomalies.jsonRegion-hours well above the same hour's median over up to 14 earlier days, grouped into ranked events0.1 MB
<day>.bursts.jsonMinute-level bursts: short rises in degraded aircraft, timed to the minute30 kB
<day>.sbas.jsonHours when an SBAS service area lost 10 m accuracy, labelled storm or probable service problem20 kB
<day>.hotspots.jsonThe day's share in each area of the charts page's daily trend1 kB
<day>.summary.jsonRun details: input hashes, counts, timings, method version and parameters16 kB
<day>.map.jsonThe map page's file for the day (a compact copy of the per-cell counts)0.8 MB
<day>.loss.parquetPosition loss per cell and UTC hour: aircraft heard, and how many were placed only by multilateration (days processed from late Oct 2026)0.8 MB
<day>.loss_daily.parquetThe same once per cell per day, with the cell centre0.5 MB
<day>.spoof.jsonGNSS spoofing from aircraft that day: episodes by class, the H3 res-2 regions where aircraft really were during active episodes, and the places their receivers were spoofed to (from late Oct 2026; method)2 kB

Columns in the per-cell table

"Bad" means an aircraft with half or more of its reports in that cell (or cell-hour) below the threshold. Reports are ADS-B version 2, the aircraft's own GNSS position only (type adsb_icao), airborne (1,000 ft or more), sampled at most every 30 s per aircraft. Aircraft whose avionics were faulty that day (bad where their neighbours were fine) are dropped. Full method: Methods and the method card.

ColumnMeaning
h3, lat, lonH3 cell (resolution 4) and its centre
aircraftAircraft seen in the cell that day
bad_nacpAircraft bad at NACp below 8 (uncertainty 93 m or worse): severe GPS error, raw, comparable with GPSJam
bad_nicThe same with NIC below 7 (integrity)
bad_acc10Aircraft bad at NACp below 10 (10 m or worse)
score, score_acc10100 × max(bad − 1, 0) / aircraft, for bad_nacp and bad_acc10 (the formula GPSJam publishes; one bad aircraft is subtracted)
capable, cap_bad_acc10Aircraft that reported 10 m accuracy at least once that day, and how many of them were bad at 10 m in this cell
latchedAircraft whose degraded reports here are post-exposure: still degraded after leaving interference 300 km or more away, among healthy neighbours
bad_nacp_live, score_livebad_nacp and score with post-exposure reports left out. The map and charts use these
heavy_liveOf bad_nacp_live, how many were A350s or A380s (in files made from 25 Oct 2026). These types flag poor accuracy far more readily than others

The hourly table has the same counts per cell and hour (0–23, UTC). The minute table has h3, minute (0–1439, UTC), bad_nacp, latched and, from 25 Oct 2026, heavy.

Columns in the position-loss tables

Strong jamming can stop an aircraft sending any GNSS position, so it drops out of the tables above instead of counting as degraded. Multilateration (MLAT: receivers timing the same signal) can still place many of them. These tables count aircraft at 10,000 ft or more, any version, per H3 cell (resolution 4): loss.parquet per hour (0–23, UTC), loss_daily.parquet once per day with lat and lon. They exist only for days processed after the daily run started making them (late Oct 2026).

ColumnMeaning
heardAircraft with an ADS-B or an MLAT position in the cell
adsbOf those, aircraft that sent their own ADS-B position there
mlat_onlyAircraft placed there only by MLAT (in the daily table: never on ADS-B in that cell that day)
mlat_anyAircraft with any MLAT position there: shows where MLAT works

mlat_only / heard is a lower bound on position loss: aircraft that neither send a position nor are placed by MLAT can't be counted, and MLAT coverage differs by place and has grown over time (east of Kaliningrad it went from a few cells to most of them between mid-2025 and mid-2026). Compare places and years with mlat_any in view. Method and checks: position-loss.md.

Read one day in Python

import io, urllib.request
import pyarrow.parquet as pq

day = "2026-10-01"
url = f"https://github.com/metacog-osint/noise-floor/releases/download/pnt-data-{day[:7]}/{day}.parquet"
table = pq.read_table(io.BytesIO(urllib.request.urlopen(url).read()))
rows = [r for r in table.to_pylist() if r["aircraft"] >= 5]
jam = [r for r in rows if 100 * max(r["bad_nacp_live"] - 1, 0) / r["aircraft"] >= 10]
print(len(rows), "cells with 5 or more aircraft;", len(jam), "with severe GPS error")

Open the data in ArcGIS or QGIS

The tables give each cell as an H3 cell ID with its centre. This script turns one day into hexagon polygons in GeoJSON, which QGIS, ArcGIS Pro and ArcGIS Online all open:

import io, json, urllib.request
import h3, pyarrow.parquet as pq          # pip install h3 pyarrow

day = "2026-10-01"
url = f"https://github.com/metacog-osint/noise-floor/releases/download/pnt-data-{day[:7]}/{day}.parquet"
rows = pq.read_table(io.BytesIO(urllib.request.urlopen(url).read())).to_pylist()
features = []
for r in rows:
    if r["aircraft"] < 5:
        continue
    ring = [[round(lon, 5), round(lat, 5)] for lat, lon in h3.cell_to_boundary(r["h3"])]
    if max(p[0] for p in ring) - min(p[0] for p in ring) > 180:    # skip the few cells that cross 180 degrees
        continue
    ring.append(ring[0])
    props = {k: r[k] for k in ("h3", "aircraft", "bad_nacp_live", "score_live")}
    features.append({"type": "Feature", "properties": props, "geometry": {"type": "Polygon", "coordinates": [ring]}})
with open(f"{day}.geojson", "w") as f:
    json.dump({"type": "FeatureCollection", "features": features}, f)
print(len(features), "cells written to", f"{day}.geojson")

The ODbL applies to whatever you build from these files: credit adsb.lol contributors and Noisefloor, and share derived databases under the same licence.

Site files

The pages read small JSON files that you can use directly. They're refreshed after each daily run.

FileWhat it holds
/data/gnss/days.jsonEvery day on the map, with its cell counts (cells with 5 or more aircraft, cells with severe GPS error, cells with 10 m loss)
/data/gnss/<day>.jsonThe map's per-cell counts for a day
/data/events/<day>.jsonThe day's anomaly events, bursts, SBAS flags and matching announced tests
/data/nisar/index.json, /data/nisar/<day>.jsonThe map's NISAR layer: each day's snapshot of every repeat L-band emitter site, with its detections (time, track, frequencies, share of pulses, NISAR granule), the passes over it that could hear its signal, and the times of passes in a receive mode that couldn't. NISAR fields CC0-derived; each pass's aircraft cross-check counts are ODbL (from adsb.lol)
/data/cosmic2/index.json, /data/cosmic2/<day>.jsonThe map's COSMIC-2 layer: each day's H3 res-2 cells whose score reaches the validated threshold, as [cell, score, 10 s bins that could see it], with the strongest regions, the satellites that delivered data, counts and credits
/data/s6/index.json, /data/s6/<day>.jsonThe map's Sentinel-6 layer: each day's H3 res-2 cells whose score reaches the validated threshold, as [cell, score, 10 s bins that could see it], with the counts, method and credits
/data/smap/index.json, /data/smap/<day>.jsonThe map's SMAP layer: for the 7 days to each day, stand-out cells as [H3 res-4 cell, share of looks flagged, points above the 100–300 km ring, looks] and busy regions as [H3 res-3 cell, median share, SMAP cells]
/data/s1/index.json, /data/s1/<day>.jsonThe map's Sentinel-1 layer: for the 28 days to each day, H3 res-3 cells passed over at least 4 times with interference on a quarter of passes or more, as [cell, share of passes, passes], with the busiest places, cuts and credits
/data/trend.jsonThe charts page's daily hotspot trend: share per named area, every day
/data/charts.jsonThe validation charts
/feed.xmlAtom feed: one entry per day for the latest 30 days

How to cite

Noisefloor (2026). GNSS degradation from ADS-B, daily, method v1.4. The Intelligence Company. https://noisefloor.theintelligence.company. Data derived from adsb.lol, ODbL 1.0.

Code: github.com/metacog-osint/noise-floor.