[GIS] NDWI generation from google earth engine

google-earth-enginenormalized-difference-water-index

I want to generate the median composite image of ndwi images of several dates in google earth engine. How can I do that and how to shorten the code itelf?

var image5 = L5.filterDate('1987-01-01','2003-12-31').filterMetadata('CLOUD_COVER', 'less_than', 5)
.filterBounds(geometry)

var image8 = L8.filterDate('2013-01-01','2019-12-31').filterMetadata('CLOUD_COVER', 'less_than', 5)
.filterBounds(geometry)
var image5_set2 = L5.filterDate('2008-01-01','2012-12-31').filterMetadata('CLOUD_COVER', 'less_than', 5)
.filterBounds(geometry)
var collection = image5.merge(image5_set2).merge(image8)//sort('system:time_start');
print(collection)
// Export.table.toDrive(collection)
// Load an image.
var image1 = ee.Image('LANDSAT/LT05/C01/T1_SR/LT05_150044_19930211')
var image2 = ee.Image('LANDSAT/LC08/C01/T1_SR/LC08_150044_20170402')
var image3 = ee.Image('LANDSAT/LT05/C01/T1_SR/LT05_150044_19950321')
var image4 = ee.Image('LANDSAT/LC08/C01/T1_SR/LC08_150044_20180421')
var image5 = ee.Image('LANDSAT/LC08/C01/T1_SR/LC08_150044_20140205')
var image6 = ee.Image('LANDSAT/LT05/C01/T1_SR/LT05_150045_19960408')
var image7 = ee.Image('LANDSAT/LT05/C01/T1_SR/LT05_150045_19970411')
var image8 = ee.Image('LANDSAT/LC08/C01/T1_SR/LC08_150044_20190424')
.select(['B1','B2', 'B3', 'B4', 'B5', 'B6', 'B7']);

// Define the visualization parameters.
// var vizParams = {
//   bands: ['B4', 'B3', 'B2' ],
//   min: 300,
//   max: 1500,
//   gamma: [0.95, 1.1, 1]
// };

// // Center the map and display the image.
// Map.setCenter(69.704, 22.546, 10);
// Map.addLayer(image.clip(geometry), vizParams, 'false color composite');
// Export.image.toDrive({image:image,
// scale: 30,
// region: roi
// })
var green1 = image1.select('B2')
var nir1 = image1.select('B4')
var ndwi1 = green1.subtract(nir1).divide(green1.add(nir1));
var green2 = image2.select('B3')
var nir2 = image2.select('B5')
var ndwi2 = green2.subtract(nir2).divide(green2.add(nir2));
var green3 = image3.select('B2')
var nir3 = image3.select('B4')
var ndwi3 = green3.subtract(nir3).divide(green3.add(nir3));
var green4 = image4.select('B3')
var nir4 = image4.select('B5')
var ndwi4 = green4.subtract(nir4).divide(green4.add(nir4));
var green5 = image5.select('B3')
var nir5 = image5.select('B5')
var ndwi5 = green5.subtract(nir5).divide(green5.add(nir5));
var green6 = image6.select('B2')
var nir6 = image6.select('B4')
var ndwi6 = green6.subtract(nir6).divide(green6.add(nir6));
var green7 = image7.select('B2')
var nir7 = image7.select('B4')
var ndwi7 = green7.subtract(nir7).divide(green7.add(nir7));
var green8 = image.select('B3')
var nir8 = image.select('B5')
var ndwi8 = green8.subtract(nir8).divide(green8.add(nir8));

Map.addLayer(ndwi1.clip(geometry))
Map.addLayer(ndwi2.clip(geometry))
Map.addLayer(ndwi3.clip(geometry))
Map.addLayer(ndwi4.clip(geometry))
Map.addLayer(ndwi5.clip(geometry))
Map.addLayer(ndwi6.clip(geometry))
Map.addLayer(ndwi7.clip(geometry))
Map.addLayer(ndwi8.clip(geometry))

Best Answer

The following is a more efficient version of your operation and includes an example of calculating a median composite.

Code Editor script link: https://code.earthengine.google.com/4af664091ef27ed549077ae590b29362

// Function to get and rename bands of interest from OLI.
function renameOli(img) {
  return img.select(
      ['B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'pixel_qa'],
      ['Blue', 'Green', 'Red', 'NIR', 'SWIR1', 'SWIR2', 'pixel_qa'])}

// Function to get and rename bands of interest from TM.
function renameTm(img) {
  return img.select(
      ['B1', 'B2', 'B3', 'B4', 'B5', 'B7', 'pixel_qa'],
      ['Blue', 'Green', 'Red', 'NIR', 'SWIR1', 'SWIR2', 'pixel_qa'])}

// Function to calculate NDWI and add it as a band.
function addNdwi(img) {
  var ndwi = img.normalizedDifference(['Green', 'NIR']).rename('NDWI');
  return img.addBands(ndwi)}

// Build a Landsat 5 collection.
var col5 = ee.ImageCollection([
  'LANDSAT/LT05/C01/T1_SR/LT05_150044_19930211',
  'LANDSAT/LT05/C01/T1_SR/LT05_150044_19950321',
  'LANDSAT/LT05/C01/T1_SR/LT05_150045_19960408',
  'LANDSAT/LT05/C01/T1_SR/LT05_150045_19970411'])
  // Make band names equal across sensors.
  .map(renameTm);

// Build a Landsat 8 collection.
var col8 = ee.ImageCollection([
  'LANDSAT/LC08/C01/T1_SR/LC08_150044_20170402',
  'LANDSAT/LC08/C01/T1_SR/LC08_150044_20180421',
  'LANDSAT/LC08/C01/T1_SR/LC08_150044_20140205',
  'LANDSAT/LC08/C01/T1_SR/LC08_150044_20190424'])
  // Make band names equal across sensors.
  .map(renameOli);

// Merge the collections.
var mergedCol = col5.merge(col8);

// Add NDWI to each image.
var mergedNdwiCol = mergedCol.map(addNdwi);

// Make a dictionary of info used for adding each image to the Map.
var evalInfo = ee.Dictionary({
  imgNames: mergedNdwiCol.aggregate_array('system:index'),
  nImgs:mergedNdwiCol.size()});

// NDWI visualization arguments.
var visArgs = {
  bands: ['NDWI'],
  min: -0.44,
  max: 0.08,
  palette: ['ff3f06', 'f0ff06', '08ff26', '0afff4', '0625ff']};

// Center the map on the scene.
Map.centerObject(mergedNdwiCol.first());

// Loop through the collection to add each image to the Map.
evalInfo.evaluate(function(info){
  for(var i=0; i<info.nImgs; i++) {
    var imgName = info.imgNames[i];
    var img = mergedNdwiCol.filter(ee.Filter.eq('system:index', imgName))
      .first();
    Map.addLayer(img, visArgs, imgName)}});

// Example of a median composite.
var medianNdwi = mergedNdwiCol.filter(ee.Filter.or(
  ee.Filter.eq('system:index', '2_LC08_150044_20180421'),
  ee.Filter.eq('system:index', '2_LC08_150044_20190424')))
  .select('NDWI')
  .median()
  .rename('NDWI');

// Redefine the band name in the visualization arguments.
Map.addLayer(medianNdwi, visArgs, 'Median NDWI');
Related Question