On July 16, 2025, Chicago City Council passed a landmark ordinance (O2025-0015577) that dramatically expands areas where residential developments can proceed without parking mandates. This map visualizes the new landscape of parking-free development zones across the city.
Key Changes:
Methodology Caveat: The Metra station buffers shown in this analysis are calculated from GTFS station centerpoints, not from actual station entrances/exits. In practice, the 2,640-foot radius should be measured from platform access points, which may result in slightly different coverage areas than shown here.
Dear Reader: If this kind of policy excites you, please consider becoming a member of Abundant Housing Illinois, which will get you access to the YIMBY Action Slack where over 400 members discuss and organize for housing abundance.
# Create interactive map
parking_map <- leaflet() %>%
# Base map
addProviderTiles(providers$CartoDB.Positron) %>%
# Zone polygons
addPolygons(
data = cta_no_parking_wgs,
fillColor = "#6B46C1",
fillOpacity = 0.35,
color = "#6B46C1",
weight = 1,
group = "No Parking Requirements",
popup = "No parking requirements - build freely!"
) %>%
addPolygons(
data = metra_only_wgs,
fillColor = "#F97316",
fillOpacity = 0.45,
color = "#EA580C",
weight = 2,
group = "Admin Adjustment Required (Metra-only)",
popup = "Administrative Adjustment required for parking reduction"
) %>%
addPolygons(
data = downtown_wgs,
fillColor = "#000000",
fillOpacity = 0.15,
color = "#000000",
weight = 0.7,
group = "Admin Adjustment Required ('D' districts)",
popup = "Downtown district - parking requirements remain"
) %>%
# Transit stations
addCircleMarkers(
data = cta_rail_sf,
radius = 3,
color = "#0078D4",
fillOpacity = 0.9,
group = "CTA Rail Stations",
popup = ~paste0("<b>", stop_name, "</b><br>CTA Rail")
) %>%
addCircleMarkers(
data = metra_sf,
radius = 3,
color = "#E31837",
fillOpacity = 0.9,
group = "Metra Stations",
popup = ~paste0("<b>", stop_name, "</b><br>Metra")
) %>%
# Reference boundaries (added last to be on top)
addPolylines(
data = community_areas,
color = "#999999",
weight = 0.5,
opacity = 0.5,
fill = FALSE
) %>%
addPolylines(
data = city_boundary_wgs,
color = "#666666",
weight = 1,
opacity = 0.7,
fill = FALSE
) %>%
# Layer controls
addLayersControl(
overlayGroups = c("No Parking Requirements",
"Admin Adjustment Required (Metra-only)",
"Admin Adjustment Required ('D' districts)",
"CTA Rail Stations",
"Metra Stations"),
options = layersControlOptions(collapsed = FALSE)
) %>%
# Legend
addLegend(
position = "bottomright",
colors = c("#6B46C1", "#F97316", "#000000"),
labels = c("No Parking Requirements",
"Admin Adjustment Required",
"Admin Adjustment Required ('D' districts)"),
title = "Parking Elimination Zones",
opacity = 0.7
) %>%
# Hide all groups except the main one
hideGroup("Admin Adjustment Required (Metra-only)") %>%
hideGroup("Admin Adjustment Required ('D' districts)") %>%
hideGroup("CTA Rail Stations") %>%
hideGroup("Metra Stations") %>%
# Add fullscreen control
addFullscreenControl() %>%
# Set initial view
setView(lng = -87.6298, lat = 41.8781, zoom = 11)
# Display map
parking_map
The new ordinance represents a major shift in Chicago’s approach to parking requirements:
This means that approximately 64.4% of Chicago is now free from residential parking mandates, enabling more affordable and sustainable development near transit.
Questions or feedback? This analysis is open source. Contributions and corrections are welcome on Github.