I want to be able to classify my image using bands for prediction (B2, B3, B4, etc.) but I also want to use indices as "bands" (B2, B3, B4, NDVI, EBBI, MSAVI2, etc.). Unfortunately, I can't seem to think of the proper script for this and it keeps giving me the error:
Here is my script:
// Creating a buffer around my region of interest
var buffer = ee.Geometry.Point([103.83841283715412,1.3736828122619071]).buffer(10000);
Map.centerObject(buffer, 12);
// Load Landsat 8 surface reflectance data
// Look for adequate image filtered by date and cloud cover and region
var l8sr = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.filterBounds(buffer)
.filter(ee.Filter.calendarRange(2018,2019,'year'))
.filter(ee.Filter.calendarRange(4,5,'month'))
.map(function(image){return image.clip(buffer)});
// Function to cloud mask from the Fmask band of Landsat 8 SR data.
function maskL8sr(image) {
// Bits 3 and 5 are cloud shadow and cloud, respectively.
var cloudShadowBitMask = ee.Number(2).pow(3).int();
var cloudsBitMask = ee.Number(2).pow(5).int();
// Get the pixel QA band.
var qa = image.select('pixel_qa');
// Both flags should be set to zero, indicating clear conditions.
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
.and(qa.bitwiseAnd(cloudsBitMask).eq(0));
// Return the masked image, scaled to [0, 1].
return image.updateMask(mask).divide(10000);
}
// Map the function over years of data and take the median.
var composite = l8sr.map(maskL8sr)
.median();
//The Band Variables for Landsat 8
var B2_Blue = composite.select('B2');
var B3_Green = composite.select('B3');
var B4_Red = composite.select('B4');
var B5_NIR = composite.select('B5');
var B6_SWIR1 = composite.select('B6');
var B7_SWIR2 = composite.select('B7');
var B10_TIR1 = composite.select('B10');
var B11_TIR2 = composite.select('B11');
// Creating an add variable function for Landsat 8 NDVI.
var addNDVI_L8 = function(image) {
var ndvi = composite.expression(
'(B5-B4)/(B5+B4)', {
'B5': B5_NIR,
'B4': B4_Red
}).rename('ndvi');
return composite.addBands(ndvi);
};
// Creating an add variable function for Landsat 8 MSAVI2.
var addMSAVI2_L8 = function(image) {
var msavi2 = composite.expression(
'(2 * B5 + 1 - sqrt(pow((2 * B5 + 1), 2) - 8 * (B5 - B4)) ) / 2', {
'B5': B5_NIR,
'B4': B4_Red
}).rename('msavi2');
return composite.addBands(msavi2);
};
// Creating an add variable function for Landsat 8 EBBI.
var addEBBI_L8 = function(image) {
var ebbi = composite.expression(
'(B6-B5)/(sqrt(B6+B10)*(10))', {
'B5': B5_NIR,
'B6': B6_SWIR1,
'B10': B10_TIR1
}).rename('ebbi');
return composite.addBands(ebbi);
};
//Defining the composite image with the added NDVI band
var composite_NDVI = addNDVI_L8(composite);
//printing to see if it has 13 bands (i.e. with the NDVI band added) (THIS WORKS!)
print(composite_NDVI, 'Image with added NDVI band')
//THIS CODE DOESN'T WORK "composite.map is not a function"
var composite_indices = composite.map(addNDVI_L8).map(addMSAVI2_L8).map(addEBBI_L8);
print(composite_indices, 'composite indices');
so my script, doesn't seem to work:
var composite_indices = composite.map(addNDVI_L8).map(addMSAVI2_L8).map(addEBBI_L8);