Green space in a site analysis usually stops at the GREEN SPACES panel: parks and open-space polygons from a land-use layer. That is land use, not trees. The polygon does not say whether the park is lawn or woodland, and street trees and courtyard trees outside any polygon do not exist in it. If you want to distinguish a street with a canopy from one without, you have to find the trees themselves.
The TREES panel detects trees directly in aerial imagery. This is an explanation of how, where it failed along the way, why it is currently switched on for New York only, and what "86% recall" does and does not mean.
Leaves absorb red light for photosynthesis and reflect near-infrared, which is useless to them, almost completely. In a near-infrared photograph trees burn white while asphalt and roofs stay dark. The ratio that measures that contrast is NDVI, the normalised difference vegetation index — a standard tool in remote sensing.
The US is lucky here. NAIP imagery (the National Agriculture Imagery Program) carries four bands including near-infrared at roughly 0.6–1 m per pixel. The Korean edition has only RGB aerials and must find trees by colour, which is much weaker — its recall is 70% against 86% here, and the whole gap is the missing band.
The first attempt looked plausible and was wrong. Over Times Square, where there should be almost nothing green, the minimum near-infrared value was 94 (red's was 26). Shadows that should read near black had a floor of 94 baked in. That lifts NDVI everywhere, and with a threshold of 0.30 16% of Midtown's roofs and walls came out as canopy — magenta over the rooftops when we overlaid the result. Raise the threshold to suppress that and you lose half the street trees in shadow (recall 51%).
The fix is to subtract the lift. The trap is estimating the lift from the scene itself:
Opposite symptoms, same failure: a scene with no dark ground to calibrate against.
We stopped trying to recognise water spectrally (turbidity and glare flip its values within a single river) and masked it geometrically with the water polygons we already have. Building footprints are masked the same way, which alone halved the Midtown false positives. The offset is then estimated only from the dark, non-vegetated ground that remains.
Measured that way, the offset comes out at (41,67), (44,73), (43,63), (41,64) across four unrelated neighbourhoods — nearly constant. That is what a real sensor property should look like, as opposed to a scene property, and it is what we had been looking for.
New York publishes the 2015 Street Tree Census with a coordinate for every street tree. We took the census points in seven neighbourhoods and asked whether our canopy mask covers each one (within 3 m).
| Upper East Side | East Village | Forest Hills | Bay Ridge | Riverdale | Astoria | Harlem | Total |
|---|---|---|---|---|---|---|---|
| 82% | 80% | 84% | 88% | 92% | 93% | 88% | 86% (2,998 of 3,497) |
The other side is clean too: Times Square 1.6%, Hudson River 0.0%, East River 1.5% canopy; Central Park 73%, Prospect Park 83%, Staten Island Greenbelt 99%.
The census is used for validation only. Every tree you see on the panel was found in the imagery.
If every detected pixel is turned into a dot, forests come out wrong: a minimum-spacing algorithm lays the dots in a regular lattice, advertising an order that is not there. So where canopy density in a 12 m window exceeds 0.7 we draw a continuous canopy (a mass), and only the rest as individual circles. That matches drawing convention — woodland as a hatch, street trees as circles. Circle radius is taken from how far vegetation extends in four directions (1.2–6 m). Rendering takes 0.2–0.5 s.
NAIP is flown state by state and year by year, with different cameras, seasons and processing. The offset above is a property of one acquisition, and a threshold tuned on New York is not guaranteed to hold in Los Angeles or Chicago. Rather than ship a plate that might paint a lake as forest, the panel is excluded from the default set outside New York until we have checked it against ground truth there. Adding a city is a one-line change once its recall has been measured.
The detection code lives in one place and the thermal comfort map uses the same mask for tree shade — otherwise the diagram and the map would drift apart. There, detected canopy is given an assumed height of 8 m; that assumption is explained on that page.