Land Surface Temperature in Uganda

Author(s): hiyer09  Published: Oct 23, 2019

Open In Code Editor

Objectives:

  • Import land surface temperature (LST) data for one year in Uganda.
  • Observe temporal patterns in temperature using a time series chart.
  • Calculate mean annual temperature for display and export.

Remote sensing (satellite-derived) data are a rich source of information about land cover, vegetation, rainfall, temperature, and other climate variables. Satellite data are available going back to the 1980s in many cases, and so provide a means for doing historical analyses of changing geographies.

In this exercise, you will learn how to acquire remote sensing data from Google Earth Engine. You will learn how to perform time series analysis to study changes in climate variables over a selected geography and time period. You will also apply some common geospatial procedures (zonal, focal statistics). Finally, you will learn how to export Earth Engine raster files to Google Drive.

ChartMap
Time series of land surface temperature in UgandaMean 8-day land surface temperature in Uganda

A workflow to explore spatiotemporal temperature patterns

You will analyze land surface temperature (LST) data derived from the Moderate Resolution Imaging Spectroradiometer (MODIS) satellites. This dataset represents an 8-day composite of 1-2 day observation intervals, with spatial resolution of 1000m. Data are available from March 5, 2000 to present.

In addition to temperature, there are many other MODIS products available in the Earth Engine Data Catalog. These datasets can be filtered to your preference of date range and region. This example will restrict data to all observations in 2015 and focus on the region of Uganda.

1. Define the border of Uganda as a feature

In the following code snippet, you will create a new variable called "region". Concretely, you are importing a FeatureCollection object, and filtering by "Country" to select "Uganda". FeatureCollections are groups of features (spatial data and attributes). Filter is the method to extract a specific set of features from a feature collection. You then display it to the map it using Map.addLayer().

// Import country boundaries feature collection.
var dataset = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017');

// Apply filter where country name equals Uganda.
var ugandaBorder = dataset.filter(ee.Filter.eq('country_na', 'Uganda'));

// Print new "ugandaBorder" object and explorer features and properties.
// There should only be one feature representing Uganda.
print(ugandaBorder);

// Add Uganda outline to the Map as a layer.
Map.centerObject(ugandaBorder, 6);
Map.addLayer(ugandaBorder);

2. Import land surface temperature data

Next, you need to import land surface temperature data. It is organized as an ImageCollection object, which is a container for a collection of individual images. The ImageCollection you are importing in the following code snippet is the LST data, but you can use the same method to import an ImageCollection for other types of data (e.g., vegetation index, or rainfall, light at night). The code below applies a date filter to restrict images to observations within 2015.

// Import LST image collection.
var modis = ee.ImageCollection('MODIS/MOD11A2');

// Define a date range of interest; here, a start date is defined and the end
// date is determined by advancing 1 year from the start date.
var start = ee.Date('2015-01-01');
var dateRange = ee.DateRange(start, start.advance(1, 'year'));

// Filter the LST collection to include only images intersecting the desired
// date range.
var mod11a2 = modis.filterDate(dateRange);

// Select only the 1km day LST data band.
var modLSTday = mod11a2.select('LST_Day_1km');

3. Define a function to convert temperature units

Converting temperature from Kelvin to Celsius will make results easier to interpret. Note that for remote sensing data, sometimes equations required to convert between different units have data-specific scaling factors, so you should always refer to appropriate documentation. In this case, refer to the MODIS LST User Guide documentation. After referring to the documentation, you will learn that this particular MODIS data must be multiplied by 0.02 to return the units to Kelvin. Subtract 273.15 to convert Kelvin to Celsius.

In addition, you will need to set the image acquisition time as a property of the resulting raster. Most image operations generate a new image with only an index property, so adding additional properties is often a necessary step. The image acquisition time will serve as the x-axis variable in time series plotting.

Both steps can be accomplished together by wrapping them in a single function that performs the conversion, and sets the start times using the copyProperties() image method. Map the function over the ImageCollection to apply it to all images. Running this code will generate a new ImageCollection called "modLSTc" (MODIS LST converted) with LST in Celsius, along with the specific start time needed for the chart.

// Scale to Kelvin and convert to Celsius, set image acquisition time.
var modLSTc = modLSTday.map(function(img) {
  return img
    .multiply(0.02)
    .subtract(273.15)
    .copyProperties(img, ['system:time_start']);
});

4. Chart land surface temperature as a time series

It can be helpful to describe your data using a time series graph. You can plot the mean land surface temperature over the year using the following code. Specifically, you will create a new chart called "TS1" (time series chart 1) using the ui.Chart.image.series() function. This function takes several arguments. First, you provide your converted ImageCollection (modLSTc). Next, you specify the geographic area by calling your ugandaBorder feature defining the boundary you are interested in. Next, you apply the ee.Reducer.mean() function to calculate the mean LST for each image. Specify 1000 (meters) as the scale (the LST data have 1km resolution). You should then specify the 'system:time_start' as the x-axis for your chart.

Calling the setOptions method allows you to specify labels for the title and y-axis of the chart.

// Chart time series of LST for Uganda in 2015.
var ts1 = ui.Chart.image.series({
  imageCollection: modLSTc,
  region: ugandaBorder,
  reducer: ee.Reducer.mean(),
  scale: 1000,
  xProperty: 'system:time_start'})
  .setOptions({
     title: 'LST 2015 Time Series',
     vAxis: {title: 'LST Celsius'}});
print(ts1);

5. Visualize temperature data on the map

The previous step generated a descriptive time series chart. In addition, you may want to visualize your data on the map. You can take the mean LST in Celsius, and clip it to Uganda. The following code produces a map of mean temperature.

// Calculate 8-day mean temperature for Uganda in 2015.
var clippedLSTc = modLSTc.mean().clip(ugandaBorder);

// Add clipped image layer to the map.
Map.addLayer(clippedLSTc, {
  min: 20, max: 40,
  palette: ['blue', 'limegreen', 'yellow', 'darkorange', 'red']},
  'Mean temperature, 2015');

6. Export data for further analysis

Finally, you can export your raster image file to perform further analysis in a GIS. You can use the export command below to export the processed image data to your Google Drive account. Concretely, calling Export.image.toDrive() will allow you to save the exported image in a Google Drive folder. The location is specified by the folder argument. As you have defined the description as "LST_Celsius_ug", this will be the name of the exported file. You can change the name by changing the description argument.

// Export the image to your Google Drive account.
Export.image.toDrive({
  image: clippedLSTc,
  description: 'LST_Celsius_ug',
  folder: 'my_folder',
  region: ugandaBorder,
  scale: 1000,
  crs: 'EPSG:4326',
  maxPixels: 1e10});

With that, you have successfully described, processed, and exported land surface temperature data for 2015 in Uganda.