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.


Interactive Map

# 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

Key Findings

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.


Data Sources


Additional Resources


Questions or feedback? This analysis is open source. Contributions and corrections are welcome on Github.