Putting Baltimore Jail Intake Data Over Live Radar Maps
I've spent the last three years pulling together dashboards that layer Baltimore City Department of Corrections booking statistics on top of Maryland Emergency Management Agency Doppler feeds. Most people think this is just a gimmick. It isn't. The correlation between severe weather events and spike bookings in certain districts is actually measurable, and if you know how to sync the APIs properly, it's straightforward. The core setup involves two data sources: the Baltimore City jail intake API, which pushes daily booking counts by district, and the NWS cloud-based Doppler feed that updates every six minutes during active storms. You map the intake numbers to a choropleth layer, then overlay the radar reflectivity as a separate geoJSON ring. The result is a single interactive map showing where arrests are trending while you watch actual weather moving across the metro area. Here's the part nobody warns you about. The Baltimore incarceration data comes in batch updates around 6 AM local time, but the radar is continuous. When you first try to join them, the timestamps don't line up and your map renders empty cells for the morning window. I wasted about two weeks on this before I realized I needed to interpolate the daily intake figures across a 24-hour sliding window rather than treating each day as a hard block. A simple linear interpolation between the 6 AM publish points solves it completely.
I use a Python script that pulls both feeds every fifteen minutes and stores everything in a TimescaleDB instance. The Doppler polygons get cached, the intake counts get upserted, and a PostgreSQL view does the spatial join using ST_Intersects. The query runs in about forty milliseconds on a modest 4-core machine. Rendering in the browser through Mapbox GL takes another hundred milliseconds or so. End to end, you're looking at roughly three seconds of latency from data pull to screen update, which is fine for a dashboard like this. The tricky edge case is when Baltimore County and Baltimore City boundaries overlap with the NWS radar cells. The county jail system reports separately from the city, and if you don't filter by jurisdiction codes before joining, your choropleth double-counts incidents in the border zip codes. I caught this during a heavy ice storm in February when the maps showed impossible spikes in the suburb of Parkville. Turned out half those "bookings" were actually county detainers flowing through the city processing center. The fix was adding a jurisdiction prefix filter to the intake query and excluding detainer records with a status flag check. You'll want to normalize the incarceration numbers before overlaying anything. Raw daily counts are misleading because weekend processing slows down and holiday staffing changes the volume. I divide each district's daily intake by the rolling fourteen-day average for that same district, then multiply by one hundred to get a percentage change index. Now a reading of 145 means that district is seeing forty-five percent more bookings than its recent baseline, regardless of whether it's a Tuesday in July or a Monday in January.
For the radar side, reflectivity values above fifty dBZ usually indicate heavy precipitation. When those cells sit over a district for more than three hours and the normalized incarceration index climbs above 120, there's typically a pattern worth flagging. Alcohol-related arrests tend to spike during prolonged severe weather events in the Eastern District. It's not dramatic. It's just something you notice if you actually look at the data instead of building the map and forgetting about it. If you're building this yourself, start with the raw APIs and test the join before you touch any visualization library. I've seen people spend days making beautiful maps that are structurally broken because the underlying spatial SQL returns duplicate rows. Run a GROUP BY with COUNT on your test queries first. Verify the row count matches what you expect from the source systems. Then and only then worry about colors and labels. The Baltimore City data portal has a public download section at baltimorecity.gov/data. The NWS radar feeds are available through api.weather.gov. Both are free. No special credentials needed for basic usage. If you need higher frequency incarceration data, you'll run into rate limits pretty quickly and will need to request academic or nonprofit status for faster access.
Get the Full Details
