The 3-30-300 rule on a map

Seeing three trees from your home, 30% tree canopy in your neighbourhood and a park within 300 metres. These pages explain how each indicator was calculated, which choices were made and why, and how to repeat it for another province.

๐Ÿ“„

The paper

Where the rule comes from: Konijnendijk (2023), and where this map departs from it.

3

trees in view

Sightlines from every tree, a score per home just outside its facade.

30

% canopy cover

Area under tree crowns divided by land area, within 500 m of every home.

300

metres to green

Walking time over streets and paths to the entrance of a park or wood.

The map

On the map, the 3, 30 and 300 buttons switch between the indicators. All three are shown on the same areas, so you can compare them directly:

Zoom levelAreaSource
provincemunicipalities (gemeenten)Administrative boundaries (Kadaster), current division
citydistricts (wijken)CBS Wijk- en Buurtkaart 2025
districtneighbourhoods (buurten)CBS Wijk- en Buurtkaart 2025
streethomes (3, 30 and 300)BAG

Green always means "meets the rule", orange and red "does not", grey "no data" or fewer than 10 homes. The i button on the map lists the sources and their dates. As background you can choose the grey topographic map or the aerial photo (Beeldmateriaal Nederland, 8 cm, via the PDOK WMS).

What is open, what is not?

IndicatorSoftwareData
3Python + GDAL, fully in the repositoryAHN, BAG, CBS: open. Trees: NEO (purchased)
30Python + GDAL, fully in the repositoryCBS: open. Tree crowns: Boomkroonbedekking 2024 by Friedenau Society
300Python + GDAL + GRASS, fully in the repositoryOpenStreetMap, TOP10NL, BAG, CBS, provincial facilities map: open

Doing it yourself for another province

The repository is set up so that only settings and input files differ per province. The full technical guide is in the wiki page Another province. In short:

  1. Install QGIS/OSGeo4W (for GDAL) and get the code:
    git clone https://github.com/RobertoTjesse/3-30-300-regel.git 330300regel
  2. Prepare an elevation model and a tree file per municipality, with the same name: Utrecht.tif (AHN4 DSM 0.5 m, raw) and Utrecht.gpkg (tree points). Without NEO data you can use a municipal tree register or another tree mapping.
  3. Fill in indicator_3_bomen/etl/config_local.py (a copy of config_local.example.py):
    PROVINCE = "Utrecht"              # as in PDOK
    VIEWANALYSE_DIR = Path(r"D:\data\utrecht")
    MUNICIPALITIES = []               # empty = all municipalities
  4. Download the BAG, municipal and provincial boundaries and CBS neighbourhoods (PDOK). The commands are in indicator_3_bomen/etl/download_bag_pdok.py, 05_merge_province.py and 06_area_summaries.py; use the extent of your own province.
  5. Run the six steps (indicator_3_bomen/etl/01 to 06) and then web/build_tiles.py. For the 30, run indicator_30_kroonbedekking/etl/kroon_raster_5m.py and kroon_500m_woningen.py on the crown map (BKB 2024 covers all of the Netherlands). For the 300, run indicator_300_park/etl/ with green sources and an OpenStreetMap extract for your province. Then run web/build_tiles_30_300.py and web/build_tiles_groen.py.
  6. Adapt the map: in web/index.html only PROVINCE and REPO at the top of the script. The map zooms to the extent of your data by itself.
  7. Publish the web/ folder (without the .py files) on a GitHub Pages branch.

What holds for all three

Future

The whole rule runs on QGIS and what comes with it: Python with GDAL, and for the 300 GRASS. No other software or licence is needed. What is still planned (such as the 3 per floor, the WHO threshold of 1 ha for the 300, and one result per home) is listed in IMPROVEMENTS.md; open issues are on the issues page.