How the Environmental Analysis Map Works

This walkthrough shows, step by step, how we build the CHCCS Environmental Analysis Map — from raw public data to the final combined visualization.

We use Glenwood Elementary as a running example to illustrate each step, but the exact same methodology is applied equally to all 11 CHCCS elementary schools.

The map on the right shows the CHCCS school district boundary. All data is loaded from public sources and cached locally.

Data: CHCCS district boundary from Census TIGER/Line shapefiles

1Starting Point: School Locations

We begin with the locations of all 11 CHCCS elementary schools, downloaded from the National Center for Education Statistics (NCES) EDGE Public School Locations dataset (2023-24 school year).

The blue marker highlights Glenwood Elementary, our focus school. All other schools appear as smaller gray markers.

Source: NCES EDGE 2023-24 (LEAID 3700720)
These are building centroid coordinates, not property boundaries. A school's environmental exposure depends on its full property extent, not just one point.

2Data: Road Network

We download the complete road network from OpenStreetMap via the OSMnx library. Roads are color-coded by their OSM classification (motorway, primary, secondary, etc.).

Each road type receives a proxy weight reflecting its expected traffic volume. Motorways (weight 1.0) carry the most traffic; residential streets (0.01) carry the least.

Road TypeWeightExample
Motorway1.000I-40
Primary0.300US-15-501
Secondary0.150Estes Dr
Tertiary0.060Weaver Dairy Rd
Residential0.010Local streets
Source: OpenStreetMap via OSMnx (network_type="drive_service")
OSM road classifications are community-maintained and may be inconsistent. Weights are proxies, not measured traffic volumes.
Full road weight table
motorway: 1.000, motorway_link: 0.800
trunk: 0.600, trunk_link: 0.480
primary: 0.300, primary_link: 0.240
secondary: 0.150, secondary_link: 0.120
tertiary: 0.060, tertiary_link: 0.048
unclassified: 0.020
residential: 0.010
service: 0.005, living_street: 0.005

3Data: Traffic Counts (AADT)

Where available, we replace proxy weights with actual traffic counts from the North Carolina Department of Transportation (NCDOT). AADT = Annual Average Daily Traffic.

Each orange diamond on the map marks an NCDOT counting station. When a station is within 50 meters of an OSM road segment, its measured traffic count overrides the proxy weight.

The AADT-derived weight is: AADT / 50,000 (where 50,000 is the motorway reference baseline).

Source: NCDOT AADT Stations (ArcGIS REST API, Orange County)
AADT stations cover major roads well but leave many minor roads with only proxy weights. Coverage is sparse in residential areas.

4Processing: Final Road Weights

Roads are now recolored by their final weight — a blend of proxy classifications and AADT overrides where available. Brighter red = higher weight = more expected pollution.

This gives us a pollution source map: every road segment has a weight proportional to its expected traffic-related emissions (NOx, black carbon, ultrafine particles).

Even with AADT overrides, weights remain approximations. Actual emissions depend on vehicle fleet composition, congestion, grade, and meteorology — none of which are modeled here.

5Processing: Distance Decay

Traffic pollution doesn't stay on the road — it disperses with distance. We model this as exponential decay: pollution drops off rapidly in the first 100-200 meters, then tails off more slowly.

The concentric rings show decay distances from Glenwood Elementary:

DistanceRemaining
100 m74%
250 m47%
500 m22%
1,000 m5%

The school's TRAP score sums contributions from every nearby road segment, each decayed by distance.

Literature: Karner et al. (2010), HEI consensus on 300-500m primary impact zone
Decay formula
contribution = weight × exp(-λ × distance)
λ = 0.003 m-1 (composite NOx/BC/UFP rate)
Total score = Σ contributions from all road sub-segments within radius

6Result: Raw Pollution Grid

Applying the decay model to every road segment produces a continuous pollution surface across the district at 100-meter resolution.

Warmer colors (yellow → red) indicate higher cumulative TRAP exposure. The hottest zones follow major road corridors.

This is the raw pollution index — before accounting for any mitigating factors like tree cover.

Computed: Sum of weighted exponential decay from all road segments at 100m grid resolution
This is a RELATIVE index for comparing locations, not an absolute health risk measure. Grid resolution (100m) smooths sub-block variation.

7Data: Satellite Land Cover

To account for tree canopy mitigation, we use the ESA WorldCover satellite land cover dataset (10-meter resolution, 2021).

The map shows land cover classes near Glenwood: green = tree cover, red = built-up/impervious surfaces, blue = water, etc.

Trees reduce air pollution through particle deposition on leaves and aerodynamic dispersion. More canopy = more pollution reduction.

Source: ESA WorldCover V2 2021 via Microsoft Planetary Computer (10m resolution)
10m satellite classification has accuracy limits. Deciduous trees provide less mitigation in winter. The dataset is from 2021 and doesn't reflect recent development or tree removal.

8Processing: Tree Canopy Mitigation

We compute tree canopy percentage around each grid cell and reduce the raw pollution score accordingly:

net = raw × (1 − α × canopy%)

With α = 0.56 (2.8% PM2.5 reduction per 5% canopy increase, from Nowak et al. 2014) and a maximum 80% reduction cap.

The result is the net pollution grid — raw scores reduced by local tree cover. Areas with dense canopy show noticeably lower values.

Literature: Nowak et al. (2014), urban tree air quality effects meta-analysis
Mitigation factors are from national meta-analyses, not Chapel Hill-specific measurements. Actual mitigation depends on tree species, leaf area, wind patterns, and season.
Mitigation formula
mitigation = min(α × canopy_fraction, MAX_MITIGATION)
α = 0.56 (literature-based)
MAX_MITIGATION = 0.80 (cap at 80%)
net_score = raw_score × (1 − mitigation)

9Data: FEMA Flood Zones

Flood risk is the second environmental layer. We load FEMA National Flood Hazard Layer polygons, classified into:

These polygons show areas with significant flood risk according to FEMA's flood insurance rate maps.

Source: FEMA NFHL (ArcGIS REST API, layer 28 = S_FLD_HAZ_AR)
FEMA maps may not reflect recent development, drainage improvements, or climate change impacts on flood frequency.

10Processing: School Property Flood Overlap

We overlay flood zones on school property parcels from Orange County GIS data to determine what percentage of each school's land falls within a flood zone.

The green polygon shows Glenwood's property boundary. Any red-highlighted area indicates overlap with a flood zone.

This intersection is computed in UTM coordinates (EPSG:32617) for accurate area measurements, then converted to acres.

Parcels: Orange County GIS. Flood: FEMA NFHL. Intersection computed in EPSG:32617 (UTM 17N).
Parcel boundaries may not exactly match school-owned land. Flood overlap doesn't account for elevation, drainage, or building placement within the parcel.

11Processing: Urban Heat Island Proxy

The third environmental layer uses the same ESA WorldCover data to estimate relative heat exposure (Urban Heat Island effect).

Each land cover class receives a thermal weight: built-up surfaces contribute heat (+1.0), while trees provide cooling (-0.6). The weighted sum is normalized to a 0-100 scale.

Land CoverWeightEffect
Built-up+1.00Heat source
Bare/sparse+0.40Heat absorption
Tree cover−0.60Cooling
Water−0.50Thermal buffer
Literature: Oke (1982), Stewart & Oke (2012) Local Climate Zones
This is a PROXY based on land cover, NOT measured surface temperature. Actual UHI depends on building height, wind, albedo, and anthropogenic heat — none modeled here.
All UHI weights
Tree cover (10): -0.60
Shrubland (20): -0.30
Herbaceous (30): -0.10
Cropland (40): -0.05
Built-up (50): +1.00
Bare/sparse (60): +0.40
Water (80): -0.50
Wetland (90): -0.40
Woody wetland (95): -0.40

12Combined: All Layers Together

The final environmental analysis map combines all three layers:

  1. Net TRAP — traffic pollution (after tree mitigation)
  2. Flood zones — FEMA 100-year and 500-year
  3. UHI proxy — relative heat exposure from land cover

In the full map, users toggle between layers using radio buttons (TRAP, UHI) and checkboxes (flood, tree canopy). This zoom-out shows the district-wide view with all data visible.

Each school receives scores at 500m and 1,000m radii, enabling direct comparison across all 11 schools.

All layers combined.

Limitations & Context

This analysis has important limitations that users should understand:

For the full list of 23 known limitations, see the Environmental Analysis documentation.

All source code is available in this repository. Each data source is documented with its provider, access date, and refresh method.