Every city block i at position (xi, zi) is scored against the nearest park p among the placed set P by straight-line walking distance, converted to a walk time at an average pedestrian speed of 80 m/min:
d_i = min over p in P of |pos_i − pos_p| (meters)
t_i = d_i / 80 (minutes)
served_i = 1 if t_i ≤ T (threshold slider)
This is the "10-minute walk to a park" service-area standard used by real urban-parks agencies (e.g. the Trust for Public Land's ParkScore). Citywide access is the population-weighted share of blocks with servedi = 1. The equity gap is the percentage-point difference between the served share of higher-income population and the served share of low-income population — a positive gap means low-income residents are under-served relative to the rest of the city, the exact disparity environmental-justice audits of green-space distribution look for.
The two siting buttons compare two real facility-location strategies:
- Uniform grid — spaces the park budget evenly across the city footprint, ignoring who lives where. This is how park systems built purely on land availability tend to end up.
- Equity-optimized — a greedy maximal-coverage heuristic: repeatedly places the next park at the still-unserved location with the highest population-weighted demand, where low-income population is weighted 2.5× to prioritize closing the access gap first, then re-scores every block and repeats until the budget is spent.
Drag the segregation slider to control how spatially clustered low-income blocks are (0% = income randomly scattered, 100% = a sharp low-income quarter in one corner) and watch how much siting strategy matters changes with the underlying geography.
This top-down 2D map is the same city model and scoring math as the 3D building view — flattened to a plan view so you can pan and zoom the whole grid at once instead of orbiting a camera.