MRMS Renderer is an open-source tool for retrieving, rendering, and visualizing NOAA Multi-Radar/Multi-Sensor (MRMS) radar data locally.
It turns recent NOAA ReflectivityAtLowestAltitude GRIB2 files into
transparent PNG frames, writes a chronological frame manifest, and animates
the sequence over an OpenStreetMap-based interactive map in the browser.
- Python 3.11+
- ecCodes
(with Python bindings installed via
pip install eccodesor your package manager) - NumPy and Pillow (installed automatically)
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"The CLI runs the complete local workflow using radar data retrieved directly from NOAA/NCEP.
| Command | What it does |
|---|---|
mrms-renderer discover |
Lists up to 30 recent MRMS frames from the NOAA/NCEP index, newest first. |
mrms-renderer frames |
Full pipeline: download → decompress → decode (ecCodes) → render (NumPy/Pillow) → output/frames.json. |
mrms-renderer view |
Serves output/ and opens the browser viewer. |
mrms-renderer demo |
Runs frames then view: complete 30-frame pipeline + animated map. |
Common options are --count N (default 30) and --output/-o PATH
(default ./output).
mrms-renderer demoThis downloads up to 30 recent reflectivity frames, decompresses and decodes them with ecCodes, renders transparent RGBA PNGs with NumPy and Pillow, writes the chronological manifest, and opens a local interactive map. Press play/pause, scrub the timeline, and change playback speed.
Output is written to the git-ignored output/ directory:
output/
download/ *.grib2.gz
decompressed/ *.grib2
frames/ frame_YYYYMMDD-HHMMSS.png
frames.json chronological manifest
index.html local viewer (installed automatically)
The v0.1 release is scoped to NOAA's ReflectivityAtLowestAltitude product.
Frames are discovered from
https://mrms.ncep.noaa.gov/2D/ReflectivityAtLowestAltitude/, which lists
MRMS_ReflectivityAtLowestAltitude_00.50_YYYYMMDD-HHMMSS.grib2.gz files.
The palette is centralized in src/mrms_renderer/palette.py and preserved
unchanged from the prototype pipeline. dBZ values below 5.0 are fully
transparent.
| dBZ | RGBA |
|---|---|
| ≥ 5.0 | (80, 180, 255, 150) |
| ≥ 10.0 | (0, 220, 120, 180) |
| ≥ 20.0 | (0, 170, 0, 200) |
| ≥ 30.0 | (255, 200, 0, 220) |
| ≥ 40.0 | (255, 80, 0, 230) |
| ≥ 50.0 | (255, 0, 0, 240) |
Any future palette or opacity change must be made in palette.py, covered by
tests/test_color.py, and documented here.
pytest
ruff check src testsTests cover the palette bands, frame discovery/parsing, grid decoding (including bounds derivation from GRIB metadata), rendering output, and manifest ordering.
NOAA MRMS index
↓
discover (mrms_renderer/discovery.py)
↓
download + decompress (mrms_renderer/download.py)
↓
ecCodes decode (mrms_renderer/decode.py)
↓
NumPy → RGBA → Pillow PNG (mrms_renderer/render.py)
↓
frames.json manifest (mrms_renderer/manifest.py)
↓
JavaScript viewer animation (web/)
MRMS Renderer is focused on the local radar rendering workflow documented in this repository. Proprietary Taylor Creative Development products, services, and infrastructure are outside the scope of this project and are not documented here.
Radar data is provided by NOAA through the Multi-Radar/Multi-Sensor (MRMS) system. Map tiles are © OpenStreetMap contributors (ODbL).
Apache License 2.0. See LICENSE.
MRMS Renderer is developed by Taylor Creative Development.
