Does rain slow the NYC buses, and where?

loading…

off — tick to fetch every 30 s; nothing can look live when it is not.

Storm or time period

Analyst details (advanced)

loading…

How to read these numbers

What the map colour measures
Speed ratio
grey — not enough data

About this map

Kafka 3.9 → Spark 3.5.3 + Sedona 1.9.1 → GeoParquet → DuckDB 1.5.5 (make export, pure-SQL JSON writer) → MapLibre GL JS 5.9.0, vendored. Rain: NOAA AORC hourly (analysis), MRMS RadarOnly QPE (live). Ground: TLC taxi zones over a vector basemap, one PMTiles archive read by range request.

Sources: MTA Bus Time GTFS-RT; the nycbuspositions archive (the 2017-2024 historical bus positions behind every past-storm number here); NOAA AORC; NYC TLC taxi zones; basemap Protomaps © OpenStreetMap contributors (ODbL).

Every number on this page is read from static JSON under files/; the read surface is documented in docs/read-api-contract.md.

Rain sources

rain: AORC hourly, hour-ending

The live panel's rain is radar-only (MRMS), uncalibrated — an estimate from radar, not a gauge reading.

The MTA gate

MTA gate: the MTA’s redistribution terms are not verified, so nothing MTA-derived is published here. The gate cuts by LINEAGE and has two sides - vehicle positions (the live fleet, the bus impact overlay) and alert rows (the MTA flood tier) - and both are dark. Those layers still appear, marked GATED: absence should be explained, not mysterious.

Licences

The map data is available under the Open Database License (ODbL); this basemap is a Produced Work from that data and re-serving it carries the same licence. Place labels set in Noto Sans (SIL Open Font License).

Bus positions and predictions are derived from the MTA’s GTFS-Realtime feeds (MTA Bus Time). This page is not affiliated with, endorsed by, or a service of the MTA, and the MTA does not warrant anything shown here.

Serving contract

Current snapshot only: no vehicle history is served here, and there is no bulk or protobuf download.

Reading the chips

Each row is one data source and its chip says how current it is; a bare AGE means no staleness budget is frozen for that file. Nothing is fetched until you tick it.

FRESH — inside its frozen staleness budget.

STALE — over budget, or no age could be read; the reason prints.

OFF — nothing is being fetched.

GATED — dark behind a licence gate; the row stays, explained.

AGE — age known, no budget frozen, so no verdict.

LOADING — the payload is being fetched right now.

One fill at a time: both options colour the same areas with one shared ramp, so they can never disagree on screen.