This repository contains the source code for the Python package <rfi_fileparser>, which provides utilities to download and visualize JSON files from the GNSS Interference Monitoring Website: http://rfi.stanford.edu/. Users can specify a start date, end date, and data type (jamming, spoofing, or dashboard).
Last updated on Jun 11, 2026
- Python 3.8–3.11 installed.
pip(included with standard Python installations).
Note: Python 3.12 and newer are currently not supported because the required
h3==3.7.6dependency does not provide compatible Windows wheels.
pip install rfi-fileparserUpdate periodically to get the latest features:
pip install --upgrade rfi-fileparserfrom rfi_fileparser import downloader
downloader.download_files("2025/04/23", "2025/04/26", "dashboard")
downloader.download_files("2025/04/23", "2025/04/26", "jamming")
downloader.download_files("2025/04/23", "2025/04/26", "spoofing")- HTTPS warnings may appear; these are safe and result from bypassing certificate checks.
- Downloading one week of all data types may take a few minutes.
- Files are saved under the directory
downloaded_json_files/in the current working path.
from rfi_fileparser import plot_daily_heatmap, plot_hourly_heatmap, plot_aggregate_heatmap
plot_daily_heatmap("downloaded_json_files", "2025/04/24")
plot_hourly_heatmap("downloaded_json_files", "2025/04/24")
plot_aggregate_heatmap("downloaded_json_files", "2025/03/23", "2025/04/26")
plot_aggregate_heatmap(
"downloaded_json_files",
"2025/03/23",
"2025/04/26",
lat_range=(24.5, 49.5),
lon_range=(-125.0, -66.5)
)from rfi_fileparser import plot_jamming, plot_spoofing
plot_jamming("downloaded_json_files", "2025/04/24")
plot_spoofing("downloaded_json_files", "2025/04/24").downloaded_json_files/
├── dashboard
│ ├──general.json
│ └── 2025
│ └── 04
│ └── statistics.json
├── jamming
│ └── 2025
│ └── 04
│ └── 24
│ ├── events.json
│ ├── heatmap.json
│ ├── 0000
│ │ └── heatmap.json
│ ├── 0100
│ │ └── heatmap.json
│ └── ...
└── spoofing
└── 2025
└── 04
└── 24
├── beforeAndDuringSpoofing.json
├── duringAndAfterSpoofing.json
├── events.json
└── heatmap.json
→ Daily heatmap data.
→ Hourly heatmap data.
-
h3Index: Unique index for each hexagonal cell (H3 system). Use it to get hexgaon boundaries in Python:from h3 import h3 from shapely.geometry import Polygon def h3_to_polygon(h3_index): boundary = h3.h3_to_geo_boundary(h3_index, geo_json=True) return Polygon(boundary)
(Functions for this are included in the GitHub repository.)
-
lowQualityCountandtotalAircraftCount: Number of low NIC / total aircraft seen within that hexagonal cell.
→ All jamming events detected on that day.
latitudeandlongitude: Centroid location of each jamming event.startTimeandendTime: Start and end times of each jamming event.
→ For each spoofing event, shows the last known normal position and the first spoofed position observed for each affected flight.
beforeSpoofing: Last known normal positionspoofedInto: First spoofed position
Example:
{
"event_1": [
{
"beforeSpoofing": {
"lat": 53.1131,
"lon": 49.9999,
"alt": 9098.28,
"nic": 7,
"time": 1740858262.297
},
"spoofedInto": {
"lat": 53.102,
"lon": 49.9545,
"alt": 9098.28,
"nic": 0,
"time": 1740859918.787
},
},
...
],
...
}→ For each spoofing event, shows the last spoofed position and the first normal position after recovery.
spoofedInto: Last spoofed positionafterRecovering: First normal position after spoofing
Example:
{
"event_1": [
{
"spoofedInto": {
"lat": 53.101,
"lon": 49.9843,
"alt": 9098.28,
"nic": 0,
"time": 1740867858.763
},
"afterRecovering": {
"lat": 51.7174,
"lon": 55.0444,
"alt": 9098.28,
"nic": 0,
"time": 1740868558.257
}
},
...
],
...
}→ All spoofing events detected on that day.
latitudeandlongitude: Centroid location of each spoofing event.startTimeandendTime: Start and end times of each spoofing event.
→ Daily heatmap of spoofing-affected region.
-
h3Index: Unique index for each hexagonal cell (H3 system). (See usage example above underjamming/2025/04/24/0000/heatmap.json.) -
spoofedFlightCount: Number of affected aircraft within each cell, based on interpolated true paths. -
seenAircraftCount: Number of unaffected aircraft in the same cell, based on ADS-B data.
Example:
{
"event_1": [
{
"h3Index": "841f533ffffffff",
"spoofedFlightCount": 2,
"seenAircraftCount": 26
},
{
"h3Index": "841f53bffffffff",
"spoofedFlightCount": 3,
"seenAircraftCount": 19
},
...
],
...
}