The 3: seeing three trees from your home
Does every home see at least three trees? For every tree in the province we calculated which spots within 30 metres can see it, taking buildings, hedges and terrain into account. Then every home gets the number of trees you can see just outside its facade.
Zuid-Holland, run of 8–9 October 2026.
What is measured?
The 3-30-300 rule (Konijnendijk, 2023) asks that everyone sees at least three well-established trees from their home, school and workplace. The paper does not say from what distance or from which window. For homes, we made that concrete as follows:
- A tree counts as visible when there is a clear line of sight from the top of its crown to a point at 1.8 m height (eye height) within 30 m of the tree.
- A home sees N trees when somewhere just outside its facade (within 1.5 m outside the building) there is a spot that sees N trees.
What the result assumes
The paper leaves open from where and how far to measure. The choices below fill that in and make the most difference to the figures. Each says which way it pushes the result; the reasons are under "Choices and why".
- One good spot is enough. If one 0.5 × 0.5 m cell in the ring around the building sees three trees, for example in the back garden, the whole building passes, even if the living room looks out on a blank wall. (more favourable)
- All homes in a building get the same score. The 80 flats in a block share one number and count 80 times in the area figures.
- The view is at street level. We calculate at 1.8 m above the ground in front of the facade; from upper floors and balconies you often see more. (stricter)
- A tree counts when the top of its crown is visible. A home that sees only the side of a crown or an overhanging branch, while the top is hidden behind a roof, does not count that tree. Seeing just the top above a roof does count.
- The 30 m is measured from the trunk, not from the edge of the crown. A large tree with its trunk 32 m away does not count, even if its crown hangs closer. (stricter)
- Every tree counts the same. A young street tree counts as much as an old oak, while trees marked "disappeared, small tree" or "not seen once, small tree" in the source are left out (24.5%). (more favourable)
- Everything in the elevation model is solid. A dense hedge or fence counts as a wall, also in winter. (stricter)
Steps
- Collect the elevation model and trees per municipality. The elevation model is AHN4, 0.5 m, the raw version: a surface model that contains buildings, hedges and tree crowns, not just the ground. The trees are points from the NEO tree data. Per province all municipalities are combined into one elevation mosaic and one tree file.
- Cut the elevation model into tiles. Tiles of 500 × 500 m with an extra margin of 35 m. Trees and heights in that margin are included, but only the inner part is kept. That way the tiles fit without seams and a tree just across a tile or municipal boundary still counts. Holes in the elevation model (water, under bridges) are filled first (see choices).
- Per tree: where can it be seen?
The observer stands at the top of the crown. GDAL's
ViewshedGeneratedetermines for every 0.5 m cell within 30 m whether there is a clear line of sight to 1.8 m above the surface. Every visible cell gets +1. The result is a map in which every cell counts the number of trees visible from there. - Find the homes. A BAG building is residential when at least one address (verblijfsobject) in it has a residential use and is in use. The number of homes in a building is the number of those addresses.
- Score per home. Around every residential building lies a ring of 1.5 m outside the facade, without the buildings themselves. The building's score is the highest value in that ring. Buildings without a free facade (fully enclosed) get no score.
- Summarise per municipality, district and neighbourhood. Every building goes to its current municipality and CBS neighbourhood (2025), based on its centre point. Per area: the share of homes with ≥ 3 visible trees, weighted by the number of homes per building.
Choices and why
| Choice | Why | Alternative we did not choose |
|---|---|---|
| Radius of 30 m | The rule names no distance. 30 m is the radius of the earlier 3 analysis (QGIS/ArcGIS), so results stay comparable. At that distance a tree is still clearly recognisable as a tree. | A larger radius counts distant trees you hardly experience as "a view of a tree" and makes the calculation much heavier. |
| Raw surface model (AHN4 DSM) | Buildings, hedges and crowns must be able to block the view. In a ground model everything is open. | AHN ground model (DTM): too optimistic. The classified AHN point cloud would be better, but is much heavier to process. |
| Observer at the top of the crown | A tree is visible when you see its crown. The crown top is the highest point of the surface within 1.5 m of the tree (roofs do not count). With the observer on the tree point itself, it sits inside its own crown, which blocks the view: in Delft, 35.5% of the trees then saw practically nothing. | The tree point + 1 m (ArcGIS default). One fixed tree height for all trees. |
| Height check: 0–35 m above the ground | The elevation model does not know what a tree is. A power line or roof edge next to a tree can be measured as "crown". If the measured height above the local ground (lowest point within 5 m) is not positive or higher than 35 m, a fixed 1.7 m is used. That happens for fewer than 1 in 80,000 trees. The check is on height above the ground, not on NAP, because the province runs from −6 m to +40 m NAP. | A check on NAP height (used earlier): it wrongly rejected 3% of Delft's trees. |
| Target height 1.8 m | Eye height of a standing person. The same value as the surface offset in the ArcGIS method. | Calculating per floor: not possible with one surface model (see limitations). |
| Score = highest value in a 1.5 m ring around the facade | Within the outline of a building the surface model is the roof: "1.8 m above the roof" is not what a resident sees. Just outside the facade, 1.8 m is eye height. The highest value, because the rule asks whether you see trees from your home, not from every window. | The average along the facade (penalises homes with one blind wall). Only the front facade (cannot be determined from the BAG). |
| Home = address in use with a residential use | Homes above shops count too. Addresses still to be built ("gevormd") or out of use do not count: they are usually not in the elevation model. | Buildings with a residential use in the BAG building data: too coarse for mixed buildings. |
| Classes 0, 1–2, 3–5, 6–7, 8+ | The threshold of 3 is the rule itself; 0 and 1–2 show how far below a home is, 6–7 and 8+ how far above. The same classes as the QGIS validation project. | Only meets / does not meet: hides the difference between 0 and 2 trees. |
| Margin of 35 m around every tile | Must be at least the 30 m radius, or cells at the edge miss trees of the neighbouring tile. Without a margin, visible seams appeared in 10–12% of the area. | Larger tiles without a margin: too much memory for the large municipalities. |
| Filling holes: interpolate small ones, lowest value for large ones | GDAL treats a NoData value as a real height: a hole of −9999 becomes a cliff. Small holes (≤ 25 m) are filled from their surroundings, large open water gets the lowest point of the tile, so it never blocks the view. | Interpolating everything: correct, but hours of computing time for coastal municipalities. |
| GDAL instead of ArcGIS | Open source, scriptable and repeatable for any province. Tested against an exact line-of-sight test per cell: 95.5–99.7% of cells equal. With the same observer, ArcGIS Visibility, GDAL and the exact test give practically the same result. | ArcGIS Pro (licence, hard to automate; the old engine behind Visibility fails on folder names with a digit and a hyphen). |
| Fewer than 10 homes: no percentage | With very small numbers a percentage says little and can be traced back to individual addresses. | — |
Is this right for my home?
The map shows for almost 1.8 million homes how many trees are visible nearby. Per neighbourhood, district and municipality that gives a reliable picture: small deviations average out there. Per home the result is a good indication, but not a measurement on site. Is your home red or orange while you do see trees from your house? Then the difference is usually one of these:
- The tree is more than 30 metres away. Only trees within 30 m of the facade count. A row of trees across a wide canal or a large square is visible, but falls outside the rule as we measure it.
- You look from a higher floor. We calculate at eye height (1.8 m) just outside the facade, so at street or garden level. From a balcony or upper floor you look over hedges, fences and cars and often see more trees than the map shows.
- The tree is new or not in the tree file. The tree file and the elevation model are from 2020–2022. Trees planted later are missing, and very young or small trees are sometimes not included.
- The situation has changed. If a building was demolished, a fence removed or a new neighbourhood built since 2020–2022, the model still uses the old situation. That works the other way round too.
- Something blocks the view in the model. The elevation model sees hedges, fences, bus shelters and the crowns of other trees as obstacles. A dense two-metre hedge in front of your window counts as a wall, even if in reality you see through it, for example in winter.
- The home has little free facade. We look all around the building, but for enclosed homes, corners and courtyards there is little room just outside the facade where the calculation can "stand".
Do you see an error that these points do not explain? Report it in the issues of the repository; that is how the map gets better.
Limitations and open issues
- Eye height at street level only. The view from higher floors is not calculated; residents of flats often see more (or other) trees in reality.
- Tree status. Since 8 October 2026 the trees marked "disappeared, small tree" (21%) or "not seen once, small tree" (3%) in the source no longer count. Fewer trees means fewer homes pass, which is safer than counting trees that may be gone. Still open: checking with NEO what the statuses mean exactly (open issue #1).
- Dates. Elevation model and trees are from 2020–2022, the homes from 2026. New-build homes appear on the map with the surroundings of back then (3 to 5% of homes).
- No point classification. The elevation model does not tell tree, building and power line apart. The height check catches most of it; the classified AHN point cloud would solve it.
- Comparison with ArcGIS. The earlier ArcGIS result for Delft saw more trees. That turned out to come from an error in that run's observer height, not from the method (issue #2, resolved).
Code and sources
| Step | Script |
|---|---|
| Settings (radius, heights, tiles) | etl/config.py |
| Download the BAG (PDOK) | etl/download_bag_pdok.py |
| 1. Cut tiles, fill holes | etl/01_tile_dem.py |
| 2. Visibility per tree | etl/02_compute_viewsheds.py |
| 3. Merge tiles | etl/03_merge_tiles.py |
| 4. Score per home | etl/04_score_buildings.py |
| 5. Merge the province | etl/05_merge_province.py |
| 6. Per municipality, district, neighbourhood | etl/06_area_summaries.py |
| Technical background | ARCHITECTURE.md |
| Data | Source | As of |
|---|---|---|
| Elevation model | AHN4, surface model 0.5 m, raw | captured 2020–2022 |
| Trees | NEO tree data (purchased, not public) | 2020–2022 |
| Buildings and addresses | BAG via PDOK | 27 September 2026 |
| Municipal boundaries | Administrative boundaries (Kadaster) via PDOK | 28 September 2026 |
| Districts and neighbourhoods | CBS Wijk- en Buurtkaart 2025 via PDOK | 2025 |