What You'll Learn
- Retrieve and visualize land surface temperature (LST) from Landsat
- Compute population-weighted heat exposure at neighborhood scale
- Map access to green space as a proxy for heat mitigation
- Summarize results by administrative units with zonal statistics
Why This Matters
Environmental health inequities are measurable with remote sensing:
- Heat vulnerability: Extreme heat kills more people than any other weather event
- Environmental justice: Low-income neighborhoods often have less green space and higher temperatures
- Urban planning: Data can guide tree planting and cooling center placement
- Climate adaptation: Heat exposure will increase with climate change
Before You Start
- Prerequisites: Complete introductory modules on LST and zonal statistics.
- Estimated time: 75 minutes
- Materials: Earth Engine account and a city of interest.
Key Terms
- Land Surface Temperature (LST)
- Temperature of the Earth's surface as measured by thermal infrared sensors.
- Population-Weighted Exposure
- An exposure metric that accounts for where people actually live, not just spatial averages.
- Green Space Access
- Proximity to parks and vegetation, often measured as distance or percent population within buffer.
- Heat Island Effect
- The phenomenon where urban areas are warmer than surrounding rural areas due to buildings and pavement.
Datasets Used
| Dataset | Purpose | Resolution |
|---|---|---|
| Landsat 8/9 L2 | Land Surface Temperature | 100m thermal |
| WorldPop | Population density | 100m |
| OSM Landuse | Parks and green space | Vector |
| GADM/Census | Administrative boundaries | Vector |
Part A: Land Surface Temperature and Exposure
- Pick a city of interest and define an area of interest (AOI)
- Load Landsat 8/9 L2 imagery, filter by date and cloud cover
- Convert thermal band to temperature (Kelvin, then Celsius)
- Load population raster and compute population-weighted LST
Starter Code
// 1) Study area - San Francisco Bay example
var city = ee.Geometry.Rectangle([-122.6, 37.6, -121.7, 37.95]);
Map.centerObject(city, 9);
// 2) Landsat 8/9 L2 collection
var l2 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterBounds(city)
.filterDate('2021-06-01', '2021-09-30')
.filter(ee.Filter.lt('CLOUD_COVER', 20));
// Convert L2 thermal band (ST_B10) to Kelvin
function toKelvin(img) {
var kelvin = img.select('ST_B10').multiply(0.00341802).add(149.0)
.updateMask(img.select('QA_PIXEL').bitwiseAnd(1).not());
return kelvin.copyProperties(img, img.propertyNames());
}
var lst = l2.map(toKelvin).median().rename('LST_K').clip(city);
Map.addLayer(lst.subtract(273.15),
{min: 20, max: 45, palette: ['blue','cyan','yellow','red']},
'LST (C)');
// 3) Population grid (WorldPop 2020)
var pop = ee.ImageCollection('WorldPop/GP/100m/pop')
.filterDate('2020-01-01', '2020-12-31').mean()
.clip(city).rename('pop');
// 4) Administrative units
var admin = ee.FeatureCollection('FAO/GAUL/2015/level2')
.filterBounds(city)
.filter(ee.Filter.eq('ADM0_NAME','United States of America'));
// 5) Population-weighted exposure = sum(pop * LST) / sum(pop)
var lstC = lst.subtract(273.15).rename('LST_C');
var popLst = pop.multiply(lstC).rename('pop_x_lst');
var combined = popLst.addBands(pop);
var stats = combined.reduceRegions({
collection: admin,
reducer: ee.Reducer.sum().repeat(2),
scale: 100,
tileScale: 4
});
// Compute weighted mean
var results = stats.map(function(f){
var s = ee.Number(f.get('sum'));
var p = ee.Number(f.get('sum_1'));
return f.set({pw_mean_LST_C: s.divide(p)});
});
print('Population-weighted LST (C) by admin unit', results.limit(5));
Map.addLayer(admin.style({color: 'white', width: 1}), {}, 'Admin');
Part B: Access to Green Space
- Load parks/green space polygons from OpenStreetMap
- Create 300m buffers around green spaces
- Calculate percent of population within green buffers by admin unit
Starter Code
// Load OSM green space
var osm = ee.FeatureCollection('projects/sat-io/open-datasets/OSM/landuse')
.filterBounds(city)
.filter(ee.Filter.inList('fclass', ['park','recreation_ground','grass']));
// Create 300m buffer around green spaces
var greenBuf = osm.map(function(f){return f.buffer(300)});
var greenImg = ee.Image(1).updateMask(
ee.FeatureCollection(greenBuf).reduceToImage({
properties: [], reducer: ee.Reducer.count()
}).gt(0)
).rename('green');
// Calculate population within green buffer
var popInGreen = pop.updateMask(greenImg);
var s2 = ee.Image.cat(popInGreen.rename('pop_green'), pop.rename('pop_total'));
var greenStats = s2.reduceRegions({
collection: admin,
reducer: ee.Reducer.sum().repeat(2),
scale: 100,
tileScale: 4
});
// Calculate percentage
var withPct = greenStats.map(function(f){
var pg = ee.Number(f.get('sum'));
var pt = ee.Number(f.get('sum_1'));
return f.set({pct_pop_within_300m_green: pg.divide(pt).multiply(100)});
});
print('Population within 300m of green space (%)', withPct.limit(5));
Check Your Understanding
- Why use population-weighted LST instead of simple spatial average?
- What distance buffer would you use for "walkable" access to parks?
- How might green space access correlate with LST patterns?
- What other health-relevant variables could you derive from satellite data?
Troubleshooting
Problem: LST values seem unrealistic
Solution: Check the scale factor conversion. Landsat L2 thermal uses specific coefficients. Make sure you're subtracting 273.15 to convert from Kelvin to Celsius.
Problem: Population-weighted calculation returns null
Solution: Ensure popLst and pop bands align spatially. Use tileScale: 4 or higher for large areas.
Problem: No green spaces found
Solution: OSM coverage varies. Try different fclass values or use a different green space dataset.
Pro Tips
- Use summer imagery: Heat exposure is most relevant during hot months
- Time of day matters: Landsat passes around 10:30am local time
- Normalize by area: When comparing units of different sizes
- Consider nighttime LST: MODIS provides both day and night observations
📋 Lab Submission
Subject: Lab 28 - Health Applications - [Your Name]
Submit:
- Map layers: LST (C), administrative boundaries, green buffers
- Table: population-weighted LST and % within 300m of green space
- Short reflection (5-8 sentences): Where are the hotspots? Which neighborhoods have lower green access?
- Earth Engine script URL and export summary as CSV