Exploring walkable urban growth on real-world data
The Isobenefit Urbanism plugin for QGIS simulates how a place could grow so that everyone keeps walkable access to both mixed-use local centres (shops and services among homes) and green space. From the simulation it generates idealised planning scenarios. It runs on your own GIS layers.
This is research software for discussion and debate. Its scenarios are speculative sketches of walkable growth in a place, made to be discussed with domain experts and weighed by them when developing actual planning strategies and developments. The scenarios are not plans to build from.
Isobenefit Urbanism (Luca D'Acci) describes a city whose benefits are spread evenly; the iso means equal. Wherever you live, and however large the settlement grows, you can walk both to a local centre and to green land, so quality of life does not depend on which part of town you live in. The aim is to avoid sprawl, which strands people far from centres and paves over nature, and equally to avoid overcrowding, which squeezes nature out.
It also sits between master-planning and laissez-faire growth: a few simple rules guide development, while the detailed form is left to emerge. The plugin works the same way. A cellular-automaton simulation grows a grid of land cells step by step under rules that keep new development within a walk of a centre and protect green corridors. The rules include randomness, so there is no single answer; the plugin runs many simulations and reports the variation across them, as well as coherent individual scenarios.
The settlements and their centres should also be linked by effective public transport (buses and rail). Without that link they would not work as one cohesive city, and dispersed development then indicates a problem. The plugin downloads streets, stops and stations for this purpose.
This page explains the model, using one real town throughout. To install the plugin and run it yourself, the plugin guide covers installation, a first-run walkthrough, the run dialog, the outputs and troubleshooting. Ready-made places to start from, with data and parameters prepared, are in the scenario library.
A companion Extract from OpenStreetMap tool downloads the input layers for an area of interest, so no manual data preparation is needed. The downloaded layers are ordinary editable layers, though: you can adjust them before running a simulation, or use your own layers instead. The panels below are the downloaded layers for a 4.2 km window around Cambourne, fetched with the plugin's own queries. Each panel shows one layer of the same place. The layers partition the town: green does not overlap built land, centres sit inside the built fabric, and stacked together they add back up to the whole town.
Two further datasets, railways and rail/tram stations, are also downloaded. They are empty here because Cambourne has no railway. Where stations do exist, they anchor centres in the scenarios.
In QGIS you point the run dialog at these layers, choose a projected CRS and an output path, and press Run; the rest is automatic. The simulation works on a grid (here 50 m cells), so the vector layers are rasterised first: existing built fabric becomes frozen built cells, downloaded green becomes protected green cells, centre areas become centre cells across their full extent, and water, industrial land and buffered barrier corridors (motorways, railways, rivers) are marked unbuildable, so the simulation never develops them. Every run on this page starts from this grid:
Each step, the cellular automaton visits the land grid and decides whether an undeveloped cell may be built. The rules are shown below, zoomed into a schematic neighbourhood.
A cell is only a candidate if it is empty and on the periphery of built land:
Two green settings play different roles. The minimum green span above is a building rule; the simulation refuses to pinch a green corridor below that width. The green walk sets how far a home may be from usable green, and it is judged on the finished scenario alongside the centre walk.
As built land grows to the edge of the centre walk, frontier cells just beyond it can no longer build. Each such cell has a small fixed chance (1% per iteration, at most one new centre per iteration) to seed a new neighbouring centre, which lets a single town keep growing outward. A separate setting, Dispersed development (Off, Moderate or Aggressive), sets the chance that a far-off green cell instead seeds an isolated centre, so development leapfrogs away from the core to form satellite settlements. Both are probability draws, like the build chance: the dice are governed by the Build probability and Dispersed development settings, and the Random seed makes any run repeatable.
Below, those rules run on the Cambourne grid from step 2; the three figures show the same run at three points in time. New development (coloured by density) stays on the periphery of the existing fabric, keeps within a walk of a centre (red seeds appear as the town outgrows them), and leaves the green corridors and the unbuildable cells alone.
Two further settings shape growth. The build probability is the per-step growth rate; lower values give compact growth, higher values looser growth. The development density is set as three tiers (low, medium and high, each a density in people per km²), each with a share, and the three shares sum to 1. Every new cell is built at one of the three densities, drawn at those shares, so the shares set the mix. Growth counts new development only, and stops once the new population reaches the target; the existing fabric is context and is not counted. Counting it would demand inputs that rarely exist in practice: a reliable population for every existing block, and the capacity of every existing centre. Treating existing fabric as already-served context needs neither. The finished scenario then arranges the drawn densities and colours the result by tier, described in step 5.
A single run is one plausible outcome; a different random seed gives a different, equally valid layout. So the plugin runs an ensemble and does two things with it. First, it blends the runs into a development-likelihood map; the map below blends 24 runs over Cambourne.
Because a probability surface is not a buildable layout, the plugin also produces one buildable scenario. Every run in the ensemble is first post-processed into a candidate (the edits are described in step 5), the candidates are scored, and the one with the shortest average walk to amenities is kept.
Each run is refined into a candidate scenario before the scoring in step 4; the winner is the scenario the plugin loads. Post-processing changes the centres and applies a limited building cleanup; the buildings themselves come from the simulation.
The centres are mixed-use throughout: a centre cell keeps its homes and gains shops and services, and each centre is sized by the population it serves at a rule-of-thumb provision (m² of centre land per person). Where new development has no centre of its own within a walk, one is added: an existing centre nearby serves the existing town, not the new growth, so new development cannot sprawl centre-free along existing fabric. Once the centres are settled, each scenario is coloured by density tier. The densities drawn during the run are arranged by walking distance to the final centres: the highest sit nearest a centre, then medium, then low. The mix of tiers is fixed, so the total population does not change; only their placement is set here. Arranging it after post-processing, rather than during growth, means the placement is measured against the centres the scenario actually shows, not against whichever centres happened to exist mid-run.
This centre-and-density arrangement is also what makes public transport workable. A well-placed mixed-use centre, with the densest housing gathered around it, concentrates residents, shops and services in one walkable catchment; a bus or tram stop at the centre then serves the most people and the most destinations per stop. Scattered centres and flat densities spread that demand too thin for a service to run frequently.
Finally, centres are offered at two clustering strengths. The run and the buildings are the same; only the centre arrangement differs. These are the two options the plugin writes:
Either can be compared against the raw grown state at the end of step 3. The raw state is always saved alongside, so the effect of post-processing stays visible.
An ensemble run writes a small set of layers, each shown above:
_report.txt, a record of the parameters and the per-option statisticsReading the report: every population figure counts new residents only. Existing fabric is shown for context and is assumed to be served by its own centres, so it is never counted. The per-person readouts follow the same convention: m² of centre per person is new mixed-use centre land over new residents, and m² of walkable green per person is new green over new residents. The coverage percentages, by contrast, include every home, existing and new, since a walk to a centre matters to everyone.
A single run, with the ensemble checkbox off, is instead written step by step as a growth animation you can play in the QGIS Temporal Controller. The three growth moments in step 3 are three such frames.
The figure at the top of the page is the moderately clustered scenario from this pipeline.
Every figure below is a complete pipeline run on the same Cambourne grid; only the named parameter changes between figures.
This control sets how readily growth leapfrogs away from the existing fabric. Even Moderate keeps the existing town dominant, while Aggressive scatters satellites across the window.
This is the per-step growth rate: each eligible cell builds with this probability per iteration, so a higher value grows more, and spreads farther, in the same number of iterations.
The growth rules themselves (periphery-only development, a walk to the nearest centrality, protected green spans, stochastic seeding of new centralities) follow D'Acci's morphogenesis and Voto's original simulator. Around that core, this implementation departs in several ways. The theory page gives the detailed comparison with the published model.
Based on the Isobenefit Urbanism concept by Luca D'Acci, with original Python code by Michele Voto. Developed as part of the Future Urban Growth project at UCL Bartlett School of Planning (Tommaso Gabrieli, Luca D'Acci, Heeseo Kwon, Stephen Marshall, Valentina Marin Maureira, Gareth Simons). The code lives at BSP-isobenefit-qgis-plugin.
Map data © OpenStreetMap contributors, available under the Open Database License (ODbL). Slope layers in the scenario library are derived from the Copernicus GLO-30 digital elevation model: produced using Copernicus WorldDEM-30 © DLR e.V. 2010–2014 and © Airbus Defence and Space GmbH, provided under COPERNICUS by the European Union and ESA; all rights reserved.
The plugin and its simulation engine are free software under the GNU AGPL-3.0-or-later. Problems and suggestions are welcome on the issue tracker.
Further reading: