click a station for its catchment, or any block dot for its numbers.
full BOTEC: assumptions & sources
Atomic unit: 2020 census blocks — 38,816 in Chicago, 33,801 with anyone living on them. Official PL 94-171 redistricting counts; the block totals sum to Chicago’s exact 2020 population of 2,746,388. Each block’s people sit at its Census-defined internal point (blocks are about the size of… a city block, so within-block error is tiny).
City membership: blocks selected by the Census PLACE code for Chicago (14000) — exact, no boundary clipping.
Distance: straight-line block point → station. No street network, no station entrances; real walks run ~1.2–1.4× longer.
Exponential weight: w = e−d/λ. Default λ = 0.5 mi ≈ a 10-minute walk; rail walk-access ridership decays steeply past 0.5 mi in most transit literature.
Driving share: per community area from CMAP Community Data Snapshots 2023 (ACS 5-yr): (drove alone + carpool) ÷ commuters. Blocks inherit their community area’s share (assigned by point-in-polygon); the slider scales all areas uniformly. Commute mode ≠ all trips — a proxy for car orientation.
Stations: 144 current CTA ‘L’ stations (City portal export, June 2025, incl. Damen/Lake) + 4 planned Red Line Extension stations (103rd, 111th, Michigan Ave, 130th; coordinates approximated from CTA preferred-alignment maps; target ~2030).
Catchments: “weighted” counts every block toward every station (people near two stops count twice; truncated past 6 mi where the weight is <5% even at λ=2). “Primary” assigns each block only to its single nearest station — no double counting, so the per-station numbers sum to the city total.
Sources: block population Chicago/Census2020-redistricting (official PL 94-171 file); stops & rail lines City of Chicago data portal via GitHub mirrors; commute CMAP snapshots. Regenerate with build_data.py.
proximity weight e^(−d/λ)
farat the stop
block dot size = population station size = weighted catchment