What You'll Learn
- Extract environmental variables relevant to disease modeling (precipitation, temperature, wetness)
- Import and filter satellite data for specific regions and time periods
- Join two data products to incorporate quality information
- Compute zonal summaries for FeatureCollection elements
- Export summarized data as CSV for use in modeling software
Why This Matters
Remote sensing supports public health in powerful ways:
- Disease forecasting: Environmental conditions predict outbreaks weeks in advance
- Resource allocation: Target prevention efforts to high-risk areas and times
- One Health approach: Links environmental, animal, and human health
- Climate change adaptation: Monitor changing disease transmission patterns
Before You Start
- Prerequisites: Complete Lab 16 and understand zonal statistics concepts.
- Estimated time: 75 minutes
- Materials: Earth Engine account and understanding of malaria transmission factors.
Key Terms
- Vector-borne Disease
- Diseases transmitted by living organisms (vectors) like mosquitoes, ticks, or fleas.
- EPIDEMIA
- Epidemic Prognosis Incorporating Disease and Environmental Monitoring for Integrated Assessment - a malaria forecasting system.
- Woreda
- An administrative division of Ethiopia, roughly equivalent to a county in the United States.
- NDWI (Normalized Difference Water Index)
- A spectral index measuring vegetation water content, relevant for mosquito habitat assessment.
- LST (Land Surface Temperature)
- Temperature of the Earth's surface measured by satellite, affecting vector life cycles.
Attribution: This lab is adapted from work by Dr. Dawn Nekorchuk, a Ph.D. alum of UF Geography.
Background: Remote Sensing and Disease
Vector-borne Diseases
Vector-borne diseases cause more than 700,000 deaths annually, of which approximately 400,000 are due to malaria. The WHO estimates around 229 million clinical malaria cases worldwide in 2019. Environmental factors - temperature, humidity, and rainfall - are key determinants of malaria risk as they affect:
- Mosquito larval habitats
- Mosquito fecundity and growth rates
- Plasmodium parasite development rates
Remote Sensing for Health
Earth-observing satellites monitor spatial and temporal changes in temperature, humidity, and rainfall. These data can be incorporated into disease modeling as lagged functions to develop early warning systems for forecasting outbreaks.
Part 1: Getting Base Data into GEE
Start by loading the study area - woredas (districts) in the Amhara region of Ethiopia:
// Import study area data
var woredas = ee.FeatureCollection("users/sounny/amhara_woredas_20170207");
// Create region outer boundary to filter products on
var amhara = woredas.geometry().bounds();
Visualize the woreda boundaries on the map:
// Create an empty image into which to paint the features
var empty = ee.Image().byte();
// Paint all the polygon edges
var outline = empty.paint({
featureCollection: woredas,
color: 1,
width: 1
});
// Add woreda boundaries to the map
Map.setCenter(38, 11.5, 7);
Map.addLayer(outline, {palette: '000000'}, 'Woredas');
Loading Remote Sensing Data
We'll use four data products for disease modeling:
| Dataset | Variable | Purpose |
|---|---|---|
| GPM IMERG v6 | Precipitation | Mosquito breeding habitat |
| MOD11A2 | Land Surface Temperature | Vector/parasite development |
| MCD43A4 | BRDF Reflectance | Calculate NDWI |
| MCD43A2 | BRDF Quality | Quality filtering |
var gpm = ee.ImageCollection('NASA/GPM_L3/IMERG_V06');
var LSTTerra8 = ee.ImageCollection('MODIS/061/MOD11A2')
.filterDate('2001-06-26', Date.now());
var brdfReflect = ee.ImageCollection('MODIS/006/MCD43A4');
var brdfQa = ee.ImageCollection('MODIS/006/MCD43A2');
Part 2: Data Preparation
Define your analysis date range:
// Define requested start and end dates
var reqStartDate = ee.Date('2021-10-01');
var reqEndDate = ee.Date('2021-11-30');
Note on Data Lags: Different products have different data availability. The script handles cases where data may not be available within your requested range.
Handle LST 8-day composite dates:
// Get date of first LST image
var LSTEarliestDate = LSTTerra8.first().date();
// Filter collection to dates before requested start
var priorLstImgCol = LSTTerra8.filterDate(LSTEarliestDate, reqStartDate);
// Get the latest date of earlier images
var LSTPrevMax = priorLstImgCol.reduceColumns({
reducer: ee.Reducer.max(),
selectors: ['system:time_start']
});
var LSTStartDate = ee.Date(LSTPrevMax.get('max'));
print('LSTStartDate', LSTStartDate);
Part 3: Zonal Statistics on Precipitation
Filter and calculate daily precipitation:
// Filter GPM by date
var gpmFiltered = gpm
.filterDate(precipStartDate, reqEndDate.advance(1, 'day'))
.filterBounds(amhara)
.select('precipitationCal');
// Function to calculate daily precipitation
function calcDailyPrecip(curdate) {
curdate = ee.Date(curdate);
var curyear = curdate.get('year');
var curdoy = curdate.getRelative('day', 'year').add(1);
var totprec = gpmFiltered
.filterDate(curdate, curdate.advance(1, 'day'))
.select('precipitationCal')
.sum()
.multiply(0.5) // Convert from mm/hr to mm (every half-hour)
.rename('totprec');
return totprec
.set('doy', curdoy)
.set('year', curyear)
.set('system:time_start', curdate);
}
Summarize precipitation by woreda:
// Function to calculate zonal statistics by woreda
function sumZonalPrecip(image) {
var image2 = image.addBands([
image.metadata('doy').int(),
image.metadata('year').int()
]);
var output = image2.select(['year', 'doy', 'totprec'])
.reduceRegions({
collection: woredas,
reducer: ee.Reducer.mean(),
scale: 1000
});
return output;
}
var precipWoreda = precipSummary.map(sumZonalPrecip);
var precipFlat = precipWoreda.flatten();
Part 4: Land Surface Temperature
Calculate mean LST from day and night observations with quality filtering:
// Filter by QA information
function filterLstQa(image) {
var qaday = image.select(['QC_Day']);
var qanight = image.select(['QC_Night']);
var daymask = qaday.rightShift(6).lte(2);
var nightmask = qanight.rightShift(6).lte(2);
var outimage = image.select(['LST_Day_1km', 'LST_Night_1km']);
var outmask = ee.Image([daymask, nightmask]);
return outimage.updateMask(outmask);
}
// Rescale and convert to Celsius
function rescaleLst(image) {
var LST_day = image.select('LST_Day_1km')
.multiply(0.02).subtract(273.15).rename('LST_day');
var LST_night = image.select('LST_Night_1km')
.multiply(0.02).subtract(273.15).rename('LST_night');
var LST_mean = image.expression(
'(day + night) / 2', {
'day': LST_day.select('LST_day'),
'night': LST_night.select('LST_night')
}).rename('LST_mean');
return image.addBands(LST_day).addBands(LST_night).addBands(LST_mean);
}
Part 5: Spectral Index - NDWI
Calculate NDWI (Normalized Difference Water Index) to assess vegetation moisture:
// Calculate spectral indices
function calcBrdfIndices(image) {
var curyear = ee.Date(image.get('system:time_start')).get('year');
var curdoy = ee.Date(image.get('system:time_start'))
.getRelative('day', 'year').add(1);
var ndwi6 = image.normalizedDifference(['nir_r', 'swir2_r'])
.rename('ndwi6');
return image.addBands(ndwi6)
.set('doy', curdoy)
.set('year', curyear);
}
Part 6: Map Display
Visualize the calculated environmental variables:
var displayDate = ee.Date('2021-10-01');
// Filter to display date
var precipImage = dailyPrecip
.filterDate(displayDate, displayDate.advance(1, 'day'))
.first().select('totprec');
var LSTmImage = dailyLst
.filterDate(displayDate, displayDate.advance(1, 'day'))
.first().select('LST_mean');
var ndwi6Image = dailyBrdf
.filterDate(displayDate, displayDate.advance(1, 'day'))
.first().select('ndwi6');
// Add layers to map
Map.addLayer(precipImage, {min: 0, max: 20, palette: ['f7fbff', '08306b']},
'Precipitation', true, 0.75);
Map.addLayer(LSTmImage, {min: 0, max: 40, palette: ['fff5f0', '67000d']},
'LST Mean', false, 0.75);
Map.addLayer(ndwi6Image, {min: 0, max: 1, palette: ['ffffe5', '004529']},
'NDWI6', false, 0.75);
Part 7: Exporting Data
Export the summarized data as CSV files to Google Drive:
// Export precipitation data
Export.table.toDrive({
collection: precipFlat,
description: precipFilename,
selectors: ['wid', 'woreda', 'doy', 'year', 'totprec']
});
// Export LST data
Export.table.toDrive({
collection: LSTFlat,
description: LSTFilename,
selectors: ['wid', 'woreda', 'doy', 'year', 'LST_day', 'LST_night', 'LST_mean']
});
// Export spectral data
Export.table.toDrive({
collection: brdfFlat,
description: brdfFilename,
selectors: ['wid', 'woreda', 'doy', 'year', 'ndwi6']
});
Remember: Click RUN in the Tasks tab to configure and start each export.
Check Your Understanding
- Why do we use environmental variables like precipitation and temperature for disease modeling?
- What is the purpose of joining the BRDF reflectance and quality datasets?
- Why do we multiply GPM precipitation by 0.5 to get daily totals?
- How does the 8-day LST composite affect our daily value calculations?
Troubleshooting
Solution: Make sure you click RUN in the Tasks tab. Large exports may take time to process.
Solution: Try reducing the date range or using a smaller study area for testing.
Solution: Check the data availability dates for each product. Some products have data lags.
Pro Tips
- Lag variables: In disease modeling, environmental variables are often lagged 1-8 weeks before disease outcomes
- Scale matters: Use appropriate scales for each data product (GPM: ~10km, LST: 1km, BRDF: 500m)
- Quality flags: Always apply quality filtering before using remotely sensed data
- Operationalize: This workflow can be scheduled to run regularly for operational forecasting
References
- Ford TE, et al. (2009) Using satellite images of environmental changes to predict infectious disease outbreaks. Emerg Infect Dis 15:1341-1346
- Franklinos LHV, et al. (2019) The effect of global change on mosquito-borne disease. Lancet Infect Dis 19:e302-e312
- Wimberly MC, et al. (2021) Satellite observations and malaria. Trends Parasitol 37:525-537
- Wimberly MC, et al. (2022) Cloud-based applications for accessing satellite Earth observations to support malaria early warning. Sci Data 9:1-11
- World Health Organization (2020) World Malaria Report 2020
📋 Lab Submission
Subject: Lab 17 - Health Applications Part 1 - [Your Name]
Submit:
Upload the three CSV files you exported:
- Precipitation data CSV
- Land Surface Temperature data CSV
- Spectral (NDWI) data CSV