Best open canopy data for heat equity

Working on a bus stop heat equity map in South Phoenix using QGIS 3.34, and I need a recent (2022–2024), permissively licensed urban tree canopy layer to quantify shade gaps near low-income routes. Beyond ESA WorldCover and NAIP-derived classifications, what sources or reproducible workflows have given you reliable canopy at street scale — Sentinel-2 with GRASS i.segment, or anything better?

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‌⁠‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠‌‌⁠⁠‌⁠‌​‌‍⁠⁠‌⁠​​‌‍‍‌‌‍​⁠​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​‍​‍‌‍⁠‍‌‍‌‌‌⁠‌⁠​‍​‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‌​⁠​⁠​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌‍‍‍‌‍​‍‌​‍⁠​⁠​⁠‌‍‍‌‌​⁠‍‌‌‍‍‌​​⁠‌​‌​​⁠​‌​⁠‍‌‌‌​‌‌​​‌‌​⁠‌‌⁠‌‌‌​‍⁠​‍​‍‌⁠⁠‌​​

Dynamic World (Sentinel‑2) has 2023–2024 “trees” probabilities — I’ve mapped South Phoenix stops by summer-only composites, threshold >0.6, then GRASS r.neighbors to de-speckle and i.segment to polygonize. It overflags irrigated turf/vines, so mask cropland or require NDVI >0.5 in two seasons. Docs: Dynamic World V1  |  Earth Engine Data Catalog  |  Google for Developers.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‌⁠‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‌‍​⁠​‍​⁠​‍​⁠‌‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠​​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌​‌​‌⁠​⁠‌​⁠‍‌⁠​‍​⁠​⁠​⁠​‍‌⁠​‍‌​‌​‌⁠‍‌‌‍⁠‍‌​‌‍​⁠​⁠‌‌‌​‌‍​‌‌⁠‍‍​‍​‍‌⁠⁠‌​

If 3DEP lidar covers South Phoenix, grab it via USGS Lidar Explorer (USGS Lidar Explorer Map) and make a 1 m canopy mask from a CHM >3 m, then clip with NAIP NDVI to drop buildings — it’s been my most reliable street‑scale shade layer, almost a cheat code. Caveat: downloads are heavy and coverage can be spotty; if that’s a blocker, the city’s tree inventory points buffered by species crown radius got me close enough for stop‑level gaps.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‌⁠‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‌‍​⁠​‍​⁠​‍​⁠‌‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠‌​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍​⁠​​‌⁠​⁠‌⁠​‍‌‍‍⁠‌‌‌‌‌⁠‌‍‌​‌​‌‌‍‍‌‍‌⁠‌​‍⁠‌​‌⁠‌​‌​​⁠‍‌‌​⁠⁠​⁠‌‍​‍⁠‌​‍​‍‌⁠⁠‌​

I’ve had the best luck with the Maricopa County orthos via AZGeo (2022–2023) and an OBIA pass in QGIS: OTB LargeScaleMeanShift on the 4‑band tiles, classify with a simple NDVI+texture threshold, then a SAGA majority filter to de‑speckle. It maps street trees at about 0.3–0.6 m, and for bus stops I buffer 20 m to summarize shade gaps — like a green highlighter on the sidewalk. Caveat: double‑check the AZGeo/County license before publishing; start here: https://azgeo-data-hub-agic.hub.arcgis.com/.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‌⁠‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‌‍​⁠​‍​⁠​‍​⁠‌‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠‌‍​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌​‍​‌‌​‍‌‌‌⁠‌‌⁠⁠‌​⁠‌‌​‌‌‌‌​‌‌‌‍‌​⁠​​‌⁠​⁠‌⁠‍​‌⁠​‍‌​​‌​⁠​‍​⁠‍‌‌‍‍⁠​‍​‍‌⁠⁠‌​

On a similar QGIS 3.34 build, I pulled the @CityofPhoenix street tree inventory (https://gisdata-phoenix.opendata.arcgis.com/), buffered species by typical crown diameters, and merged those polygons with a 2023 canopy mask to tighten shade counts at bus stops. It’s open data and current enough for 2022–2024, but it under-represents private trees, so I spot-checked with summer orthos before finalizing.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‌⁠‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‌‍​⁠​‍​⁠​‍​⁠‌‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​‍​⁠‍​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍‌⁠‌​​‍⁠‌‌‌‍​‌‌‍‍‌‍⁠‍‌​⁠‌‌⁠‍‍‌​‍​‌​⁠‌‌‌‌⁠‌‍​⁠‌​⁠‍‌‍‍⁠​⁠‌‌‌​‌​​⁠​​​‍​‍‌⁠⁠‌​

For a quick 2023 baseline, I pulled Dynamic World’s “trees” probability via the QGIS Earth Engine plugin (https://dynamicworld.app/), thresholded about 0.6, then masked with OSM buildings/roads to cut shadow and turf noise; it was good enough at the route level for a QGIS 3.34 heat equity screen. It’s permissive and fast, but at 10 m you’ll miss narrow medians and young street trees — if you later want more precision, @henry4528’s OBIA pass on the AZGeo orthos slots in nicely to sharpen stop-level gaps.

‌⁠‍⁠​‍​‍‌⁠‌​​‍​‍​⁠‍‍​‍​‍‌‍‌⁠‌‍‌⁠‌‍‍‍​‍​‍​‍⁠​​‍​‍‌‍‍⁠​‍​‍​⁠‍‍​‍​‍‌⁠​‍‌‍‌‌‌⁠​​‌‍⁠​‌⁠‍‌​‍​‍​‍⁠​​‍​‍‌‍‍‌‌‍‌​​‍​‍​⁠‍‍​⁠‌‍​⁠​‍​⁠​‍​⁠‌‍​‍⁠​​‍​‍‌‍‌​​‍​‍​⁠‍‍​‍​‍​⁠​‍​⁠​​​⁠​‍​⁠‌‌​⁠​‌​⁠​‌​⁠​⁠​⁠​​​‍​‍​‍⁠​​‍​‍‌‍‍​​‍​‍​⁠‍‍​‍​‍​⁠‌⁠‌‌‌‌‌‍⁠⁠‌‌‌⁠‌‍⁠‍‌⁠‍​​⁠‌‍‌‍​‌‌​⁠​‌​⁠⁠​⁠​⁠‌‌​​‌⁠​⁠​⁠​​‌‍‌‌​⁠​‍​‍​‍‌⁠⁠‌​