Los Angeles, CaliforniaOpen map ↗

THE EVIDENCE BEHIND THE MAP

Build the case for
your next tree investment.

Find where shade investment deserves attention, test your priorities, and put an initial scale of planting beside the evidence. Here’s how each feature supports that decision.

For urban forestry, climate planning and public works · Project methods last updated November 11, 2026 (not independently reviewed)
Sources and data vintages are listed by topic.

Start here

From a map to a defensible shortlist

Find where canopy investment deserves a closer look, then explore the scale of a street-tree intervention.

Use it to

Turn a citywide canopy and heat map into a focused conversation about where to invest. A city team can shortlist areas for field assessment, compare policy priorities, and estimate the scale of a street-tree program in one place.

Why this approach

We bring canopy, residents and home-cooling context onto the same grid so staff can compare areas without assembling separate maps. The workflow connects a priority to its evidence and a planting scenario.

Source & calculation details
1. Choose a ranked area. 2. Read its metrics. 3. Adjust the planting share. Use Explore to compare layers or change ranking weights. The map, list and score breakdown update together.

Planning note Use the shortlist to scope an assessment; confirm site feasibility and local costs before committing funds.

Priorities

Priority score & ranking

A relative 0–100 index of where canopy investment may be most needed in this city.

Use it to

Build a first-round investment shortlist that accounts for both missing shade and the people living with it. Open any area to explain the drivers behind its position in a budget or program-scoping discussion.

Why this approach

An additive score makes each input’s contribution inspectable. Surface heat and missing canopy carry the largest default shares (35% each); homes without A/C and residents aged 65+ add resident context (15% each). Heat is scored here on a measurement, not an assumption: Los Angeles runs from the beach to the San Fernando Valley, but across this build’s 9,021 ranked areas position alone explains 8.8% of the variance in summer surface temperature, and surface temperature tracks missing tree cover (r = −0.66), so a hotter cell is mostly a barer cell rather than simply a more inland one. Population adjusts potential reach. These are explicit project policy choices, not externally prescribed weights.

Source & calculation details
Defaults: 35% surface heat + 35% missing canopy + 15% homes without A/C + 15% age 65+. The SB 535 designation is an available input that starts at zero. Inputs are scaled to 0–1; protective inputs enter as 1 − scaled value. Multiply the sum by (0.55 + 0.45 × scaled population), then rescale residential results to 0–100. The pipeline clips the low-need tail: heat and age at p2, canopy and A/C at p98; population saturates at p98. Exact endpoints ship in the GeoJSON norm object.

Planning note Scores compare residential cells within this city; they are not health-risk probabilities or cross-city rankings.

Rank stability A rank is an estimate with a band, not an exact position. 05b_stability.py re-draws each block group’s population and residents 65+ and each tract’s A/C estimate inside their published 90% margins of error (neighbouring areas cut from the same block group move together), jitters each non-zero recommended weight by ±10 points, and re-ranks; 300 draws. The detail panel shows each area’s 5th–95th percentile rank and how often it lands in the top tier (best 903 of 9,021). In this build the median band is 937 ranks wide, and of the 903 top-tier areas 76% stay top-tier in at least 80% of draws. Surface temperature and tree cover are held fixed (measurement error, no per-area margin published), as is the allocation of residents within a block group. Treat rank differences smaller than an area’s band as not established (the bands are sensitivity ranges under stated assumptions, not confidence intervals or a pairwise test); use the top-tier share to shortlist.

Priorities

Presets & custom weights

Ask a different policy question and see the shortlist change.

Use it to

Test whether a proposed focus area remains a priority when staff emphasize shade, older residents or access to cooling. Use presets to structure a policy discussion instead of treating one ranking as the only answer.

Why this approach

Editable weights expose the value judgments behind a composite index. The JRC’s guidance supports examining rankings under alternative assumptions; it does not endorse our particular presets. Normalizing weights keeps their relative contribution explicit.

Source & calculation details
Recommended mix is the shipped model. Fewest trees isolates tree cover, still adjusted for population. Heat first leans on surface heat. Older residents emphasizes age; Homes without A/C emphasizes A/C; Far from cooling adds walking time. Most people raises the population multiplier. Input sliders are normalized to sum to 100%; the population slider changes the separate multiplier. Reset restores the defaults.

Count people more (the population multiplier)

The four condition sliders say what counts; this slider says how much the number of residents counts. Each area first gets a need figure from its conditions. That figure is then multiplied by a factor that runs from (1 − P) for the least-populated area up to 1 for the most-populated, where P is the slider. At P = 0% every area is judged on conditions alone. At the recommended 45%, the most-populated area counts about 1.8× the least. At 100%, an area with almost no residents scores near zero whatever its heat or shade, because there is almost nobody there to help. Population is normalized between its minimum and the 98th percentile of ranked areas (risk inputs run from their 2nd percentile to their maximum; protective inputs from their minimum to their 98th percentile), so one very crowded area does not flatten everyone else.

Worked example
Two areas with the same conditions score 0.60 before population. One holds 40 residents (near the bottom of the range), the other 2,400 (near the top). At P = 45% the first is multiplied by about 0.55 and the second by about 1.0, so they score 0.33 and 0.60: the populous area ranks well ahead. At P = 0% both stay at 0.60 and tie. At P = 90% the small one falls to 0.06.

Planning note Presets represent alternative priorities. They change rankings, not planting costs.

Data

Surface heat

Satellite surface temperature, not the air temperature people breathe.

Use it to

See the outdoor thermal context around proposed investments and compare it with canopy gaps. The separate heat view helps staff distinguish a shade-priority question from a surface-heat question.

Why this approach

Landsat provides a repeatable, spatially consistent thermal record. Summer medians reduce dependence on a single scene. Heat carries 35% of the default weight here because the within-city comparison holds up when tested: position (longitude and latitude) explains 8.8% of the variance in surface temperature across ranked areas, and surface temperature tracks missing tree cover more closely than in any other build (r = −0.66, against −0.20 in the Contra Costa County build, which leaves heat unscored). The coast-to-Valley difference is real, a few degrees on average, and the “Heat first” preset will lean toward the Valley because of it.

Source & calculation details
Landsat 8/9 Collection 2 surface-temperature band ST_B10, via Planetary Computer; the median of 35 scenes with under 20% cloud between June 1 and September 15: 15 from 2024, 13 from 2025 and 7 from 2026 (WRS-2 path 41, rows 36 and 37), cloud and cloud-shadow pixels masked, at 30 m. These are the three most recent summers, the window every build now uses. Ranked areas read 22.6–51.3 °C, median 44.6 °C. Mid-morning overpasses sample particular clear-sky days, not the hottest afternoon or a continuous record. Two of the three summers follow the January 2025 fires, so burned ground reads as it is now.

Planning note Surface temperature is not air temperature or a live heat alert. Current scenes cover summers 2024–2026.

Data

Tree canopy

The share of assessed ground covered by tree crowns.

Use it to

Locate shade deficits and establish a baseline for scoping a canopy assessment. Staff can compare canopy coverage across candidate areas before choosing where to investigate street-tree opportunities.

Why this approach

The USFS/CAL FIRE aerial canopy classification targets tree crowns, which fits a shade-investment question more directly than general greenness. Equal-area aggregation preserves ground-area proportions; the assessed urban boundary defines the denominator. Validation. Los Angeles is outside the Bay Area lidar vegetation map used to validate the Contra Costa builds, so the aerial classification has not been checked against an independent source here. Unlike those builds, nearly every ranked area (99.2%) uses the one aerial source, so there are no pooled sources to reconcile. The imagery is from 2022: areas inside the January 2025 Palisades and Hurst fire perimeters are flagged (see Wildfire perimeters).

Source & calculation details
Primary layer: USFS/CAL FIRE California Urban Tree Canopy, 2022 NAIP aerial classification at 0.6 m native resolution (the Los Angeles–Long Beach–Anaheim urban-area package, the newest release; no later statewide canopy map has been published). The pipeline aggregates canopy pixels in equal-area coordinates and clips denominators to the assessed urban boundary. This build uses no height-model fallback. Where the aerial product does not reach a cell, or assessed under 10% of it, the cell shows Sentinel-2 vegetation instead; green_src identifies canopy versus ndvi in the exported data. The current build has 8,948 canopy-backed residential cells, all from the 2022 aerial product (8,632 assessed on at least 99% of the cell, 316 partly), and 73 vegetation-proxy cells on the mountain edge: 43 outside the assessed urban boundary and 30 whose aerial assessment covered under 10% of the cell (canopy_quality = below-threshold). canopy_source distinguishes usfs-2022 and none; coverage_frac gives the assessed share. The tree-canopy layer renders missing canopy in gray; the separate greenness layer covers all cells.

Planning note Canopy comes from one aerial source dated 2022; 73 ranked cells on the mountain edge show a greenness stand-in, labeled in cell details. Percentages describe assessed cover in 2022, not individual trees, verified planting space, or conditions after the 2025 fires.

Data

Population

Estimated residents allocated into map cells from larger census areas.

Use it to

Bring the scale of resident need into investment decisions. Population helps distinguish a sparsely occupied canopy gap from an area where a similar gap affects the surroundings of many more residents.

Why this approach

ACS five-year data supplies population, age and income on a consistent small-area geography. In Los Angeles each block group’s residents are placed by mapped residential building footprint (dasymetric allocation), so parks, hillsides, freeways and industrial land inside a block group receive no residents.

Source & calculation details
ACS 2024 five-year estimates (2020–2024), the newest release (2021–2025 is due in December 2026), at block-group level, intersected with the city limit and cells. Each block group’s residents are split across the cells it overlaps in proportion to the footprint area of OpenStreetMap residential buildings inside the city (872,599 footprints, 30–4,000 m², tagged as housing or untyped), with all of the block group’s housing, inside the city or not, as the denominator, so residents outside the city are not assigned to edge cells. Two block groups with no mapped housing use overlap area. The allocated total is 3,856,571 residents against the ACS figure of 3,857,263 for the City of Los Angeles (a 0.02% difference). The footprints are Los Angeles County’s own building outlines as imported into OpenStreetMap, read from the November 10, 2026 extract. The building map passed the completeness check (0.58 mapped buildings per housing unit). Its count-per-unit income check read 2.7×, which on inspection is apartment housing, not a mapping gap: the lowest-income quartile of block groups has a median 3.0 housing units per mapped building against 1.0 in the highest, and among block groups that are at least 90% one-unit structures coverage is 1.1–1.3 buildings per unit in every income quartile (evidence in cities/losangeles/config.py). Footprint area is not floor area: a five-story building counts the same as a one-story building of the same footprint, so where a block group mixes towers and houses, residents lean toward the houses; and buildings over 4,000 m² are left out as non-residential, which also drops the largest apartment blocks.

Planning note Cell populations are allocated estimates, not household counts. Published ACS margins of error are carried into the likely-rank bands (see Rank stability), which hold heat, tree cover and walking time fixed and spread each block group’s or tract’s re-draw over cells by whole-cell overlap area, an approximation of the point model’s boundary-clipped, building-weighted allocation; the bands are sensitivity ranges under those assumptions, not confidence intervals.

Data

Residents aged 65+

An estimated, smoothed share of older residents.

Use it to

Bring older residents into the shortlist for shade investment and outreach planning. The seniors preset lets staff see how prioritizing this population changes the areas they would investigate first.

Why this approach

CDC identifies adults aged 65+ as more susceptible to heat-related problems, supporting age as one input. The project smooths small-cell percentages to avoid unstable extremes; the 100-person smoothing strength is a design choice, not a CDC recommendation.

Source & calculation details
Start with ACS block-group population aged 65+, allocate to cells, then smooth: (estimated residents 65+ + 100 × citywide age-65+ fraction) ÷ (cell population + 100). The displayed percentage and score use this smoothed result.

Planning note Shares are smoothed area estimates. They do not identify individual residents or their health needs.

Data

A/C access

Census estimates of occupied homes with air conditioning.

Use it to

Identify areas where limited home cooling adds a reason to investigate shade and public cooling access. This gives the investment discussion a housing dimension alongside canopy and population.

Why this approach

Census LACE combines AHS air-conditioning information with the ACS’s geographic coverage to estimate prevalence at tract scale. We chose it to use a documented, cooling-specific national product instead of treating local income rank as A/C availability.

Source & calculation details
US Census LACE 2023 AC_PE, joined by tract and aggregated using allocated occupied housing units from ACS 2024 B25003_001E. Each overlap contributes occupied homes × overlap fraction; A/C homes = that count × tract rate / 100. The cell rate is summed A/C homes ÷ summed occupied homes × 100. LACE is an experimental modeled product drawing on the American Housing Survey and ACS. The pipeline retains an income-rank fallback where estimates are unavailable; ac_src now explicitly records lace or income-model. ac_coverage records the share of allocated occupied homes with a valid LACE estimate; incomplete coverage does not become a zero-A/C observation. Of 9,021 ranked residential cells, 9,004 are LACE-backed; 1 whose source block groups report no occupied homes uses the population-weighted tract rate (ac_src = lace-pop); and 16 whose tract has no LACE estimate (university housing in Westwood and a few mountain-edge cells) keep the income-rank fallback and are grayed on the A/C layer. LACE 2023 is the only vintage the Census Bureau has published. A/C prevalence varies widely in Los Angeles (44–100% across ranked cells, median 94%), lowest near the coast and in older housing, so it carries 15% of the default weight.

Planning note Experimental tract estimates, weighted by occupied homes. It does not establish working or affordable A/C in a particular home.

Data

Walking access & potential cooling sites

Estimated walking time to a discovery site, with an official county directory alongside.

Use it to

Screen for areas where residents may face a long walk to a potential cooling facility. Use the map to focus a facility-verification exercise or a discussion about where additional relief may be needed.

Why this approach

OSM provides facility locations and a pedestrian graph in a common, reproducible source. Shortest-path routing represents mapped street connections more realistically than straight-line distance alone. This is a facility-access screen, not an emergency service directory.

Source & calculation details
The city file contains 669 mapped sites across library, community center, pool and senior/shelter categories. The inventory covers the bounding box around the city, so a resident near the city line can be routed to a library or pool in a neighboring city such as Burbank, Glendale, Culver City or Santa Monica. The walking pipeline uses an OSM pedestrian graph (575,806 nodes after simplification, built from the November 10, 2026 OpenStreetMap extract for Southern California with osmnx’s walking-network rules), multi-source shortest paths, straight-line snap distances at both ends, and 4.8 km/h. Streets tagged access=private (gated and private subdivisions) are part of the graph, because residents can walk out of their own subdivision, and each cell center and each site is joined to its eight nearest network nodes with the best door-to-door total kept, so a point does not snap to an isolated footpath when a street is a few meters further. A cell whose only nearby network is a fragment (fewer than 40 nodes within 2 km) is treated as off-network and shows the straight-line estimate, labeled. The median ranked area is 16 minutes from a mapped site; 31 ranked areas carry a detour-review flag because the route is more than three times the straight line (a freeway, rail line, river channel or hillside, or a remaining map gap). The shipped model puts no weight on walking time. Of the 11,893 cells in the current overlay CSV, 11,888 are routed and 5 use the straight-line fallback (1 of them ranked residential areas); 3,859 ranked areas carry an approach-review flag because the cell-to-network connection exceeds 100 m.

Planning note Verify designation, hours, fees and accessibility. Category filters change markers only; walking estimates remain based on all mapped sites.

County-listed cooling centers and contacts ↗

Los Angeles County’s cooling center list (August 2026) names 153 sites countywide, including City of Los Angeles library branches; 94 are inside the city or within 1.5 km of its limit and are drawn on the map at the county’s own published coordinates. The county states that listed sites have working air conditioning, restrooms and drinking water. The list gives regular hours and is not an open-now feed: extended hours are announced only during heat events. No mapped discovery site is currently excluded for lacking A/C. access_snap_m records the straight-line cell-to-network connection; connections over 100 m are flagged for approach review, without implying that shorter approaches are verified. Walking estimates use all 669 discovery sites, not just the official directory.

Scenarios

Street planting share

Choose how much of the theoretical mapped street capacity to explore.

Use it to

Translate a priority area into a concrete program-scale question: what would planting a quarter, half or all of the mapped street capacity involve? Compare tree counts, canopy gain and indicative cost before commissioning site surveys.

Why this approach

Street length connects the scenario to a physical intervention that a public-works team can investigate. Trees are assumed on both sides of the street, one every 10 m (33 ft) to start with. That spacing is yours to change, in the box beside the cost: type 6 for small trees planted close together or 15 for large shade trees, and every tree count, cost and “street room” word updates at once. The ranking does not use spacing, so no rank moves. 10 m is a round planning figure, not a rule; a city’s own landscape standard or its species list should set the real one.

Source & calculation details
Capacity = floor(mapped eligible street centerline meters × 2 ÷ spacing), with spacing 10 m unless you change it (allowed range 4–30 m; saved in every export as tree_spacing_m and restored when a scenario file is loaded), counting only street inside the study boundary, so an edge cell cannot offer streets outside the study area as capacity. Trees = round(capacity × selected share / 100), capped by cell area minus known aerial canopy area, divided by 40 m². With a usable whole-cell baseline, its remaining-canopy ceiling also applies. Surviving trees = round(trees × survival share), with the share editable beside the cost (default 70%). Added canopy percentage points = surviving trees × 40 ÷ cell area × 100; cost counts every planted tree. A change from 10% to 15% canopy is +5 percentage points, not a 5% relative increase. Scenarios require mapped street capacity, not 99% accuracy. Tree counts, cost, added canopy and illustrative air cooling are conditional on feasible planting and new, non-overlapping crowns. The remaining-area ceiling subtracts known aerial canopy without extrapolating partial coverage over unassessed land. A whole-cell current-to-future canopy total is shown only with at least 99% aerial coverage; otherwise only added canopy is shown. The slider starts at 25%; zero means no planting. Choices persist during unit and weight changes for this session.

Planning note Capacity is theoretical; confirm ownership, existing trees, utilities and space. Partial and unknown canopy coverage allow conditional scenarios; they do not establish a reliable future total or verified planting capacity.

Scenarios

Trees, maturity & cost

An indicative scale of investment; no financial return is calculated.

Use it to

Put an initial scale of investment beside the shortlist. A shared unit-cost and crown-area assumption lets staff compare scenarios consistently and prepare questions for arborists and procurement teams.

Why this approach

A linear model makes every dollar and canopy increment traceable to the tree count. The cost per tree is a band, not a point, so the app offers three sourced presets and lets you type your own. The closest published Los Angeles figure is the High preset: Los Angeles Public Works reported $4,351 per street tree including five years of watering (2022). The 40 m² mature crown is a planning assumption.

Source & calculation details
Scenario cost = planted trees × the cost per tree, planting-side only; pruning after establishment, sidewalk repair and replacement are not costed. Three presets, from published California figures (September 2026): Low $500, planting only by city crews with no separate establishment budget, which is Bakersfield’s own estimate (its $500,000 budget funds “roughly 1,000 trees”); Base $2,000, planting plus about a year of establishment care, or a grant program’s all-in average (Concord’s USDA grant: $1 million for 500 trees including a plan and workforce); High $3,500, planting plus three years of watering and program overhead (San Francisco’s 3500 Trees project: $12 million for 3,500 street trees; Los Angeles Public Works reported $4,351 per tree with five years of watering in 2022). The default is the low band in every build, so scenario files reproduce across study areas; for a Los Angeles budget, start from the High preset or your own contract price. The number you set is written into every export. Assume 40 m² of additional mature crown per tree. Canopy and cooling are credited only to the share of planted trees assumed to reach maturity (default 70%, editable; scenario files record it). That default is a planning placeholder: the US Forest Service’s monitoring of the Sacramento Shade program found 42.4% of trees alive 22 years after planting (Ko, Lee, McPherson & Roman 2015), and Berkeley and Oakland cohorts lost 34% in two years, so a program without a watering budget should test lower values. Crown area is an assumption, not a detected tree count; additive canopy assumes no overlap.

Planning note Indicative cost at assumed maturity; not a bid, lifecycle budget or financial ROI. Growth and crown overlap are not modeled; survival is an assumed share (editable beside the cost, default 70%), not a predicted outcome.

Scenarios

Illustrative air cooling

A literature-based scale estimate of possible cooling at maturity.

Use it to

Connect tree investment to cooler streets and shade where people walk and wait. Added crowns can reduce direct sun and surface heating; the air-cooling number describes a different, area-wide effect and does not capture the full benefit of standing in shade.

Why this approach

A review of urban cooling simulations estimates about 0.3 °C of afternoon air cooling per 10 percentage points of canopy under clear-sky summer conditions. We use that relationship for an illustrative scenario, separate from the satellite surface-temperature layer.

Source & calculation details
Apply 0.3 °C air-temperature reduction per 10 percentage points of added canopy: cooling = canopy gain ÷ 10 × 0.3. Krayenhoff et al. (2021) synthesize higher-quality numerical modeling studies at this approximate scale. The coefficient describes clear-sky summer afternoons, not annual average cooling or a calibrated local response. Fahrenheit differences multiply by 1.8, without adding 32. This is air cooling, not surface cooling. For example, +5 canopy percentage points gives an illustrative 0.15 °C air reduction. Research comparing tree-covered surfaces with built surfaces does not provide a transferable per-tree forecast for this cell; no surface-temperature change is currently modeled.

Planning note Literature-based illustration at maturity, not a locally calibrated forecast or a count of residents cooled.

Data

Cells, names & unranked land

Hexagons are consistent analysis units, not census blocks or neighborhood boundaries.

Use it to

Compare the same geographic units across all map layers. A consistent grid helps staff move from a city overview to an identifiable area for follow-up without changing the unit of analysis.

Why this approach

H3 cells give each area a stable identifier and allow different source geographies to be combined. Keeping developed and undeveloped cells visible preserves geographic context while residential-only ranking keeps the shortlist aligned with resident priorities.

Source & calculation details
H3 resolution 9, about 0.12 km² per cell at this latitude; exact geodesic areas are stored per cell. Current build: 9,021 residential, 658 developed without residents and 2,214 undeveloped cells, totaling 11,893. Residential means estimated population ≥ 1. Development uses OSM street-length/building thresholds. Names locate a cell by neighborhood: a cell takes the name of the Los Angeles Times “Mapping L.A.” neighborhood containing its center (114 neighborhoods, as published on the City of Los Angeles GeoHub), with a compass direction and a number to tell cells apart; cells outside every neighborhood polygon, mostly harbor water and a few edges, take the nearest neighborhood or OpenStreetMap place name. Those boundaries are a newspaper’s reader-reviewed map, not legal lines, and nothing is scored or summed by neighborhood. Every cell is in the City of Los Angeles (Census TIGERweb place polygon, step 04d), exported as city_or_community; use the council-district filter to narrow the list. Cells on the city line are described by the part inside it, the same part whose residents are counted.

Planning note Cells are not census blocks or neighborhood boundaries. Place names are approximate; gray means unranked.

Priorities

The canopy-equity headline

A canopy-exposure figure from the current build, stated with its limits.

Use it to

Frame an equity discussion using canopy and resident context, then inspect the candidate areas directly. The figures below are recomputed from the current build; they are exposure counts and a historical comparison, not a causal estimate.

Why this approach

The figure counts estimated residents by the canopy of the cell they live in, independently of the composite score. It uses no income data, so it does not by itself establish an equity gap.

Source & calculation details
In the current build, 2,544,239 of 3,855,645 estimated residents in canopy-assessed cells (66.0%) live in cells with canopy below 15%; the median ranked cell has 14.3% canopy. Ranked cells inside the 1939 HOLC map average, by grade — A: 38.4 °C and 35% tree cover (416 areas); B: 42.2 °C and 22% tree cover (730 areas); C: 44.5 °C and 13% tree cover (1,488 areas); D: 44.9 °C and 10% tree cover (877 areas). 3,790 ranked cells holding 57% of residents are at least half inside an SB 535 disadvantaged community, and 93 of the 100 highest-ranked areas are. An income-quartile comparison has not been computed for this build; income is not a visible map layer.

Planning note Canopy is the 2022 aerial map and residents are 2020–2024 estimates. The HOLC and SB 535 figures describe this dataset; they do not isolate the effect of a grade or a designation from everything else that differs between those neighborhoods.

Data

SB 535 disadvantaged communities

Census tracts designated by CalEPA under SB 535 (final designation, September 2026).

Use it to

See which priority areas also fall inside a state-designated disadvantaged community, and rank within that set. The “Disadvantaged communities” preset asks where, inside designated tracts, heat and missing shade are worst.

Why this approach

SB 535 is the designation state and local programs already screen against, so the map carries it as published rather than a locally invented equity index. The 2026 designation qualifies a tract under any of four criteria: the top 25% of CalEnviroScreen 5.0 overall scores, the top 5% of CES 5.0 pollution burden, at least 25% overlap with a 2022 (CES 4.0) designated tract, or land under the control of a federally recognized tribe. It is a funding-eligibility designation, not a measurement of heat or shade, which is why it carries no weight in the recommended mix and leads its own preset instead.

Source & calculation details
CalEPA ArcGIS feature service SB_535_Disadvantaged_Communities_2026 (tract layer plus the three tribal-boundary layers), queried for the study bounding box on November 11, 2026 and cached as sb535_losangeles.geojson: 999 designated tracts touch the box, in Los Angeles and its neighboring cities; no tribal land. Each cell’s value is the share of its area inside any designated polygon (0–1, the union, so stacked designations never exceed 1), with the criterion and tract GEOID of the polygon covering most of the cell. 4,614 of 11,893 cells are at least half inside a designated tract and 5,257 touch one; by the covering tract’s criterion, 3,266 are CES 5.0 top 25%, 1,022 CES 4.0 carry-over and 326 high pollution with low population (the pollution-burden criterion, as the service labels it). The share enters the score on a fixed 0–1 scale (no percentile clip), so a wholly designated cell reads 1 regardless of the other cells. With the recommended weights the term is zero. Exported as sb535_dac_share_pct, sb535_dac_criterion and sb535_dac_tract.

Planning note The designation applies to whole census tracts; a cell straddling a tract boundary reads a partial share. Eligibility rules for a specific grant program should be checked against the program’s own guidelines and the official CalEPA map.

Data

Priority populations

Disadvantaged and low-income communities that count toward state climate-investment targets, in builds that carry the layer.

Use it to

Where a build carries the layer, see which areas fall inside a California Climate Investments priority population area: an SB 535 disadvantaged community or an AB 1550 low-income community. State climate grants, including urban forestry grants, report against these.

Why this approach

SB 535 alone leaves out the low-income communities AB 1550 added, so a build that reports against grant terms carries the Air Resources Board’s own layer as well. It is a funding designation, not a measurement, and never part of the score. This build does not carry it: its map shows no priority-populations layer and its exports leave the two columns empty.

Source & calculation details
Not built for this study area. Where built (pipeline step 04h, CARB Priority Populations 5.0, in effect September 18, 2026), each cell carries the share of its area inside a priority population area and the designation covering most of it, exported as priority_population_share_pct and priority_population_designation; the Bakersfield guide documents the method.

Planning note Low-income households qualify wherever they live; no map shows that.

Data

Wildfire perimeters

A flag on areas inside the January 2025 fire perimeters, whose tree-cover and census numbers predate the fires.

Use it to

Know which areas’ numbers describe the ground before a fire. A flagged area shows a note in its detail panel and a “fire 2025” tag in the list; treat its tree cover, residents, A/C and street capacity as pre-fire and check on the ground before using its rank.

Why this approach

The tree-cover map is 2022 aerial imagery and the residents are the 2020–2024 American Community Survey. The perimeter of the Palisades fire (started January 7, 2025) encloses 56 km² inside the city limit, including most of Pacific Palisades, and that of the Hurst fire about 1 km² of hillside above Sylmar. No newer citywide tree-cover or census data exists to replace the pre-fire numbers, so the map marks the areas instead of rescoring them. Surface heat is the exception: it comes from summers 2024–2026, two of them after the fires. The flag carries no weight and changes no score.

Source & calculation details
CAL FIRE FRAP historical fire perimeters (ArcGIS feature service), queried on November 11, 2026 for fires from 2023 on, the first year after the tree-cover imagery; two reach the city (pipeline step 04g, cached as fire_losangeles.geojson). Each cell carries the share of its area inside a perimeter, with the fire’s name and year. 503 of 11,893 cells are at least half inside one, most of them unpopulated hillside; 129 are ranked residential areas (126 Palisades, 3 Hurst) that held 15,369 residents in the pre-fire estimates, and 176 ranked areas have at least 5% of their area inside and show the note. None is in the top tier: the highest-ranked flagged area is number 4,172 of 9,021. Exported as fire_perimeter_share_pct, fire_name and fire_year. The FRAP perimeter file is updated each spring, so a fire from 2026 would not be in it yet.

Planning note A perimeter is a fire’s outer line, not a map of what burned: surviving houses and trees lie inside it, and damage does not stop exactly at it. Replanting after a fire is its own program with its own data; this screen does not plan it.

Data

Historical redlining

The 1939 federal lending map of Los Angeles, shown as context where it reached.

Use it to

See where today’s heat and canopy gaps line up with the 1939 Home Owners’ Loan Corporation grades, as background for an equity discussion. Turn the layer on under “Color the map by”.

Why this approach

Mapping Inequality (University of Richmond) publishes the digitized 1939 HOLC “residential security” map of Los Angeles; this is the only CoolEquity build with one. The layer is context only: it carries no weight in any score or preset. A cell takes the grade covering most of its area, and only where graded polygons cover at least a quarter of the cell, because the 1939 map stops at the then built-up city and most of the San Fernando Valley was never graded.

Source & calculation details
416 graded polygons (one polygon with no grade is dropped). 3,621 of 11,893 cells carry a grade: A 435, B 755, C 1,526, D 905; 3,511 of them are ranked residential cells. Exported as redlining_grade. Averages by grade for this build are in the canopy-equity topic.

Planning note No grade does not mean no history of discrimination: areas built after 1939 or outside the surveyed map were never graded.

Using the map

Layers, units, basemaps & session state

Layers change the map view; weights change the ranking; planting share changes the scenario.

Use it to

Move from a quick shortlist to detailed exploration at your own pace. Switch layers to inspect evidence, adjust weights to test priorities, and change the planting share to scope an intervention.

Why this approach

One panel holds every control, in numbered steps, so a quick shortlist and a detailed exploration use the same screen. Units and basemaps change presentation only. Contextual guide links preserve the map in its original tab, so checking a method does not interrupt the scenario.

Source & calculation details
The panel shows priorities and a searchable area list. Search approximate place names or cell IDs and use Previous / Next 25 to browse all 9,021 ranked residential cells. The same panel exposes layers, presets, weights and site filters. Darker colors generally indicate greater need; tree canopy uses brown for low canopy. Gray and muted cells are unranked. Metric/imperial is display-only. Map/satellite changes background imagery. How to use reopens help at any time; the help card can be dragged, or moved with the arrow keys. Every “i” button opens a short plain-language card with a link to the matching guide topic. The panel is arranged as three numbered steps — what matters most, color the map by, places to cool off — followed by the legend and the priority list, which can be folded away; the ranked list marks how far each area moved whenever the mix is not the recommended one. Reset map returns to the zoomed-out Priority view without touching your mix. Fahrenheit and miles are the default.

Planning note Your mix of priorities and the map layer are kept for this browser tab: a reload lands where you were, and the home button returns to the start screen without resetting them. A new tab starts fresh at the start screen. Planting shares last for the current page session.

Using the map

Sorting, filtering and searching the list

Sort re-orders the Priority areas list by one measure; rank badges and the map never change.

Use it to

Read the same ranked list from a different angle: the most people first, the hottest ground first, the least tree cover first, the longest walk first. Filters narrow the list to areas that meet a threshold; search finds one area by name or cell number.

Why this approach

The rank badge is the answer to the question set under What matters most, so it stays fixed. Sorting is a reading aid, which is why the count line says what the list is sorted by and in which direction whenever it is not in rank order.

Source & calculation details
Sort options. Need: the priority score under the current mix, the same order as the rank badges. Residents: estimated people living in the area (ACS, allocated into the hexagon). Surface heat: summer late-morning land-surface temperature from Landsat (about 10:30 am overpass). Tree cover: share of assessed land under tree crowns (or the greenness index where no aerial assessment exists). Walk to cooling: estimated minutes on foot to the nearest mapped cool place along the pedestrian network. Age 65+: estimated share of residents aged 65 or older. Direction. “Most first” puts the largest value at the top; “least first” the smallest. Tree cover opens least first, every other measure most first, and either can be flipped. Filters. Walk over 15 minutes; 500 or more residents; tree cover under 10%; residents aged 65+ at 20% or more; plantable (mapped street capacity exists); full aerial tree data (drops height-model, lidar, partly assessed and greenness stand-in areas); stable top tier (in the best 10% in at least 80% of rank-stability re-draws). Filters combine, and the count line says “matching” instead of “ranked” while any is on. Areas with no value for the chosen measure sort as zero.

Planning note A sort is not a ranking. Use What matters most to change what the score rewards; use sort and filters to find areas within the ranking you already have.

Using the map

Export & reload a scenario

Take the ranked list or a single selected area into a meeting as a file that records exactly what produced it, and load it back later.

Use it to

Share a shortlist or one area with colleagues, keep a record of the weights and planting share behind a recommendation, and reopen the same view. A CSV opens in a spreadsheet; a JSON file reloads into this map. Nothing is uploaded: files are generated in the browser and saved on your computer.

Ranked list — the Export & share section

Save scenario (JSON) saves the ranked list with the full scenario header, for reopening. All ranked areas (CSV) saves every ranked cell in the order the current weights put them, one row per cell, with plain column names (see the column key below). Open a saved scenario… reads a scenario file back in and restores the weights, population weighting, any planting shares you set and the selected area; the status line under the buttons says what was loaded and whether the data version matches.

Selected area — in the area panel

Save this area (JSON) and Spreadsheet row (CSV) save one record for the cell you have open: its metrics, where it ranks under the weights in force and under the shipped defaults, the sources and coverage behind each number, and the planting scenario at the share you chose (trees, canopy gain in percentage points, indicative cost, illustrative cooling). Reloading an area file restores the weights and reopens that area.

Why this approach

A ranking only means something with its weights, assumptions and data version attached, so every export carries them: the weights in force, the population multiplier, the preset if one matches, the planting constants, per-cell source and coverage flags, and the SHA-256 fingerprint of the data file that was loaded. Reloading says plainly if the data version differs.

Source & calculation details
rank/score are computed live from the exported weights; rank_recommended_mix/score_recommended_mix are the pipeline defaults shipped with the data. Spreadsheet rows repeat the scenario header (city, timestamp, data fingerprint and version tag, ACS year, preset, population weight and the five weights) as trailing columns so a row can never be separated from the weights that produced it. JSON files add an interpretation note list and the column key. Loading checks the export schema and the city and refuses a mismatch; a different data fingerprint loads with a visible warning because figures may not reproduce. The fingerprint is computed in the browser at load and reads “unavailable” when the page is opened from a local file rather than a server.

Column key

Spreadsheet columns use the plain names in the first column; scenario (JSON) files use the internal keys in the second and carry this key as field_key.

Spreadsheet columnJSON keyMeaning
cell_ididStable number of the hexagon area
area_namenameArea name: nearest mapped place, or the cross streets inside or nearest the area where the build names areas by street
nearest_major_intersectionnearNearest intersection of two through streets, with direction and distance from the area center; empty where the name is that intersection or the build does not name areas by street
area_typeplaceres = residents ranked; activity = developed, no residents; empty = undeveloped
city_or_communitycityCity or census-designated community containing the area's center (Census TIGERweb places)
rankrankRank under the priorities in this file (1 = most need)
priority_score_0_100scorePriority score under these priorities, relative within the study area
rank_recommended_mixrank_defaultRank under the recommended mix shipped with the data
score_recommended_mixscore_defaultScore under the recommended mix
rank_recommended_mix_p05rank_loRecommended-mix rank, 5th percentile across re-draws of census margins and ±10-point weight jitter
rank_recommended_mix_p95rank_hiRecommended-mix rank, 95th percentile across the same re-draws
top_tier_sharerank_top_shareShare of re-draws in which the area ranks in the best 10% under the recommended mix
surface_heat_clst_cSummer land-surface temperature, °C (satellite)
tree_cover_pctcanopy_pctTree cover, % of assessed land; empty where only satellite greenness is available
greenness_index_0_100greenness_indexSatellite greenness index, 0–100; filled only where tree_cover_source_type = ndvi
tree_cover_source_typegreen_srccanopy = tree-cover map (aerial classification or a model of it, calibrated height model or lidar; see tree_cover_dataset); ndvi = satellite greenness stand-in
tree_cover_datasetcanopy_sourceusfs-2022 aerial classification, naip-model (modelled from the 2022 aerial survey outside the USFS map), usfs+naip-model (USFS map for the assessed part, the same model for the rest, where most homes lie outside the assessed part), chm-legacy height model, lidar-2020 county lidar map, or none (no tree-cover assessment; greenness stand-in)
tree_cover_yearcanopy_yearYear of the tree-cover dataset
tree_cover_assessed_fractioncoverage_fracShare of the area the aerial assessment covers (0–1)
tree_cover_qualitycanopy_qualityfull, partial, modelled (see naip-model), completed (see usfs+naip-model), calibrated (height model rescaled to the aerial line), lidar, coverage-unknown, below-threshold (assessed on under 10% of the area) or unassessed
tree_cover_m2canopy_m2Assessed tree crown area, m²
assessed_area_m2assessed_m2Land the assessment covers, m²
residentspopEstimated residents (ACS, allocated into the area)
residents_65_plus_pctpct65Estimated share of residents aged 65+, %
homes_with_ac_pctac_pctEstimated share of homes with air conditioning, %
ac_sourceac_srclace = Census LACE; lace-pop = population-weighted LACE; income-model = fallback estimate
ac_coverage_fractionac_coverageShare of homes with a LACE estimate (0–1)
census_acs_yearacs_yearACS five-year vintage
walk_to_cooling_minaccess_minEstimated walking minutes to the nearest mapped cool place
walk_to_cooling_kmaccess_kmEstimated walking distance, km
walk_quality_flagaccess_qualitynetwork-estimate, approach-review (>100 m off-network approach) or detour-review (route far longer than the straight line)
walk_methodaccess_srcrouted = walked on the OpenStreetMap pedestrian network; straightline = straight-line distance times a detour factor because the area could not be connected to the network
share_inside_study_areainside_fracShare of the hexagon inside the study boundary (1 = wholly inside); residents, street capacity and the city label describe that part only
walk_network_connection_maccess_snap_mStraight-line meters from the area center to the walking network
area_m2area_m2Area of the hexagon, m²
mapped_street_mstreet_mMapped street centerline in the area, m: theoretical capacity from OpenStreetMap, not surveyed plantable space
street_room_tree_spotsstreet_room_positionsTree spots the mapped street could hold on both sides at the spacing in tree_spacing_m (10 m unless changed in the app): an upper bound, not a site survey
street_room_bandstreet_room_bandno mapped street, little room, some room or plenty of room: city-relative thirds of the areas with any mapped street
planting_scenario_availablescenario_oktrue when mapped street capacity exists
tree_cover_baseline_completecanopy_baseline_oktrue when the aerial assessment covers ≥99% of the area
land_coverlandDominant land cover (ESA WorldCover) for undeveloped areas
redlining_gradeholc1930s HOLC grade A–D where a map exists
ward_idward_idCouncil ward or district number, where the city publishes boundaries
ward_nameward_nameCouncil ward or district name; blank = outside every ward
sb535_dac_share_pctdacShare of the area inside an SB 535 disadvantaged community (CalEPA, September 2026), %
sb535_dac_criteriondac_typeDesignation criterion of the tract covering most of the area
sb535_dac_tractdac_tractCensus tract GEOID of that designated tract
priority_population_share_pctppShare of the area inside a California Climate Investments priority population area (CARB Priority Populations 5.0: SB 535 disadvantaged or AB 1550 low-income community), %; empty where the build does not carry the layer
priority_population_designationpp_typeDesignation covering most of the area: disadvantaged, disadvantaged and low-income, low-income, or low-income within half a mile of a disadvantaged community
schools_in_areaschoolsOpen schools in the area (city school layer); empty where the build does not count places
school_namesschool_namesNames of up to three of those schools
bus_stops_in_areabus_stopsTransit stops in the area
park_share_pctparkShare of the area inside a public park, %
park_namepark_nameName of the park covering most of that share
park_city_ownedpark_citytrue where that park belongs to the city itself
fire_perimeter_share_pctfireShare of the area inside the perimeter of a wildfire newer than the tree-cover and census inputs, %; empty or 0 where none
fire_namefire_nameName of that fire (CAL FIRE perimeter)
fire_yearfire_yearYear of that fire
planting_share_pctplanting_shareShare of street capacity planted in this scenario, %
scenario_trees_plantedtreesTrees planted in this scenario
scenario_trees_survivingtrees_survivingTrees assumed to reach maturity (survival_share_pct in planting_assumptions)
scenario_tree_cover_gain_pointscanopy_gain_pointsAdded tree cover at maturity from surviving trees, percentage points
scenario_cost_usdcost_usdIndicative cost for all planted trees at cost_per_tree_usd; cost_scope says what that figure is taken to cover
field_check_statusfield_statusField-check status entered in the app (To visit / Checked · feasible / partly / not feasible / Planted)
field_check_notefield_noteField-check note entered in the app
field_check_updatedfield_note_updatedWhen the field check was last edited (ISO time)
scenario_air_cooling_ccooling_cIllustrative summer air cooling at maturity, °C
scenario_future_tree_cover_pctfuture_canopy_pctTree cover at maturity, % (only when the baseline is complete)
study_area_slugstudy_area_slugBuild (study area) this row was exported from
exported_atexported_atExport time (ISO 8601)
dataset_sha256dataset_sha256Fingerprint of the data file
dataset_versiondataset_versionData version tag
dataset_acs_yeardataset_acs_yearACS vintage of the data file
presetpresetPreset in force, or custom
population_weightpopulation_weightHow strongly population counts (0–1)
cost_per_tree_usdcost_per_tree_usdPer-tree figure behind scenario_cost_usd
cost_scopecost_scopeWhat the per-tree figure is taken to cover
survival_share_pctsurvival_share_pctShare of planted trees assumed to reach maturity, %
tree_spacing_mtree_spacing_mSpacing that turns mapped street length into tree positions, m
crown_m2_per_treecrown_m2_per_treeMature crown area credited per surviving tree, m²
cooling_c_per_10_canopy_pointscooling_c_per_10_canopy_pointsIllustrative summer air cooling per 10 canopy points, °C
weight_hotter_groundw_heatShare of the ranking given to hotter ground
weight_fewer_treesw_greenShare given to fewer trees
weight_homes_without_acw_acShare given to homes without A/C
weight_older_residentsw_age65Share given to older residents
weight_far_from_coolingw_accessShare given to distance from cooling
weight_sb535_communityw_dacShare given to SB 535 disadvantaged-community designation

Planning note An export documents an exploratory scenario. It does not verify planting sites, costs or facility status, and it carries the same limitations as the map it came from.

Field checks Each ranked area has a Field check box in its detail panel: a status (To visit; Checked · feasible, partly feasible or not feasible; Planted) and a free-text note. They are saved in the browser you typed them in, per city, and are never uploaded. Every area and shortlist export carries them as field_check_status, field_check_note and field_check_updated, and the printed briefing shows them under each shortlisted area, so a colleague can see what was verified on the ground and what was seen. Clearing the browser’s site data clears them; export first.

Data

Vegetation greenness & supporting fields

Explore satellite greenness separately from tree canopy.

Use it to

Compare living vegetation with tree cover to identify areas worth investigating for shade. A greener area can contain grass or shrubs and still need trees; the two layers help staff ask that question without confusing greenness with canopy.

Why this approach

Satellite greenness supplies broad vegetation context across the grid, including outside aerial canopy coverage. It is publicly available in Explore, leaving the default priority workflow focused. The active planting calculator uses mapped street length, not the buffered right-of-way area fields.

Source & calculation details
The greenness display rescales the legacy veg field from 0–45 to an index of 0–100. The source linearly maps clamped Sentinel-2 NDVI 0.05–0.65 to 0–45; this is an index, not a measured vegetation fraction. Subtracting canopy from it does not estimate lawn or non-tree cover; row_m2 and row_canopy describe buffered street areas in the canopy pipeline. Current planting scenarios use street_m and whole-cell area, not row_m2. canopy_m2 is pixel-derived area for usfs-2022, and an older whole-cell percentage × area estimate for chm-legacy. Assessed extent is unknown for the latter. See canopy_source and canopy_quality before combining sources.

Planning note Greenness does not establish percent cover or planting feasibility; exported street-buffer fields do not establish ownership or plantability.

Using the map

By district

The ranking rolled up by district, with the starred areas’ planting totals.

Use it to

Answer “how many trees are we planting in District 9, what does it cost, and how many residents does it reach” in one row, under whatever priorities are in force and with the areas you starred.

Why this approach

The City of Los Angeles publishes its fifteen council districts on the Bureau of Engineering GIS service; the app rolls the ranking up by district and can outline them on the map. Boundaries are the 2021 redistricting map (Ordinance 187279, effective December 10, 2021). Member names are fetched with the boundaries (November 11, 2026) and dated; they change at elections. Each area belongs to the district containing its center; 392 ranked areas on the city line whose center falls outside the limit (40,995 residents, 1.1% of the city) are grouped as “City-line areas” rather than dropped, because their residents are in the ranking. Need per district is the mean of its areas’ 0–100 index; “top 100” counts its areas among the 100 highest. Trees and cost add up the starred areas at their own planting shares.

One page per district

“District one-page summaries” under the table opens a printable Letter page for each district: residents in ranked areas, how many of the study area’s top 100 areas it holds, mean need and tree cover beside the study-area figures, surface heat and residents 65+ where people live, the share of residents in SB 535 communities (and in state priority population areas where the build carries them), a small map of its areas, its ten highest-ranked areas, and the trees, cost and SB 535 share of the areas you starred. It is computed from the map as it stands, under the priorities in force; with a district chosen in the list filter it prints that one alone.

Planning note Districts are political boundaries. The need lives where it lives; an even split across districts is a policy choice, not a finding. Boundaries and member names are re-fetched by the pipeline, never edited by hand, and SOURCES.md in the data folder records the fetch.

Using the map

Check planting locations

Paste coordinates of trees planted or planned and see which are inside an SB 535 disadvantaged community, and in which ward or district.

Use it to

Show, tree by tree, how much of a planting falls inside SB 535 disadvantaged communities. Paste a list of coordinates (or open a spreadsheet with latitude and longitude columns) and each location comes back with yes or no, the census tract and why it qualifies, and the ward or district it is in. The summary line gives the count and the share for the whole list, and the results save as a spreadsheet.

Why this approach

The map’s hexagons cannot answer this for a single tree. A hexagon on the edge of a designated tract is only partly inside it, and a hexagon belongs to the ward its center falls in, so a tree near an edge could be counted on the wrong side. This check skips the hexagons and tests each coordinate against the tract outlines themselves, the same CalEPA file the SB 535 layer is drawn from, and against the ward or district boundaries the city or county publishes.

What to paste

  • One location per line: 35.3733, -119.0187, Tree 1. The name is optional and can come first or last.
  • Latitude and longitude in either order; they are told apart by their size.
  • Or a table copied from a spreadsheet, with a header row naming latitude and longitude columns.

Nothing you paste leaves your browser: the outlines are downloaded once and the test runs on your computer.

Source & calculation details
Each point is tested for containment in the SB 535 polygons cached by pipeline step 04f (CalEPA, final designation September 2026; tract layer plus tribal-land layers) and in the ward or district polygons from step 04e, by ray casting, with holes respected. Where the build carries CARB priority populations, the designation at the point is reported too. A location within 15 m of any tract edge is flagged: a phone’s GPS is often off by 5–10 m, and the published outlines are simplified, so an answer that close to a line should be confirmed on the CalEPA map. A longitude typed without its minus sign is read as west. Tested on every build: the center of every hexagon wholly inside or wholly outside a designated tract must give the matching answer, and every center must fall in the ward the map assigns its hexagon.

Planning note This is a convenience check from the published outlines, not a determination. The CalEPA map is the authority for eligibility, and a grant program’s own rules decide what counts as benefiting a disadvantaged community. The list is not stored anywhere: save the results spreadsheet if you need a record.

Using the map

Places people go

Schools, bus stops and public parks measured on their own ground, in builds that carry the list.

Use it to

Where a build carries the list, find the bus stops, school grounds and parks with the least shade and the hottest ground, whoever lives nearby.

Why this approach

The ranking is about where people live, so an area with no homes is never ranked, yet people wait, walk and play in such places and cities plant on land they control. A build with the list measures tree cover inside each park, on each school property and within 30 m of each bus stop. This build does not carry it: its map shows no “Places people go” section and its exports leave the place columns empty.

Source & calculation details
Not built for this study area. Where built (pipeline step 04j, from a city’s own school, bus-stop and park layers), the Bakersfield guide documents the method.

Planning note Whether a tree can be planted at a place is for a site visit.

Using the map

Street room

How many trees the mapped streets in an area could hold, drawn as a layer and read as a word on every row.

Use it to

See need and feasibility together. An area that needs shade and has plenty of street room is an early win; one that needs shade and has little room needs parks, schoolyards or private planting instead, and should be planned differently rather than dropped.

Why this approach

Street room is the number of tree spots that the mapped street centrelines inside the study boundary could hold on both sides at the spacing you set (10 m to start with; change it beside the cost). It is the same ceiling the planting scenario starts from, shown directly. Streets come from OpenStreetMap; utilities, driveways, sidewalk width and existing trees are not known, so it is an upper bound, not a surveyed count. The words “little”, “some” and “plenty” are thirds of this study area’s ranked areas that have any mapped street; “no mapped street” means none inside the boundary. On the map, deeper colour means less room, keeping the rule that deeper always means more need.

Planning note Street room is a planning screen for where to look first, not a count of plantable sites. A city’s own right-of-way, utility and sidewalk layers turn it into a planting plan; ask public works for them.