In Google Earth Engine, I am having a trouble with my chart. Gets only one value as photo below. Is there any solution?
My code is as follows:
//cloud mask
function maskL8sr(col) {
// Bits 3 and 5 are cloud shadow and cloud, respectively.
var cloudShadowBitMask = (1 << 3);
var cloudsBitMask = (1 << 5);
// Get the pixel QA band.
var qa = col.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 col.updateMask(mask);
}
//vis params
var vizParams = {
bands: ['B5', 'B6', 'B4'],
min: 0,
max: 4000,
gamma: [1, 0.9, 1.1]
};
var vizParams2 = {
bands: ['B4', 'B3', 'B2'],
min: 0,
max: 3000,
gamma: 1.4,
};
//load the collection:
var col = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.map(maskL8sr)
.filterDate('2020-07-01','2020-08-1')
.filterBounds(geometry)
.map(function(image){return image.clip(geometry)});
print(col, 'coleccion');
//imagen reduction
{
var image = col.median();
print(image, 'image');
Map.addLayer(image, vizParams2);
}
//median
{
var ndvi = image.normalizedDifference(['B5',
'B4']).rename('NDVI');
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white',
'green']};
print(ndvi,'ndvi');
Map.addLayer(ndvi, ndviParams, 'ndvi');
}
//select thermal band 10(with brightness tempereature), no calculation
var thermal= image.select('B10').multiply(0.1);
var b10Params = {min: 291.918, max: 302.382, palette: ['blue',
'white', 'green']};
Map.addLayer(thermal, b10Params, 'thermal');
// find the min and max of NDVI
{
var min = ee.Number(ndvi.reduceRegion({
reducer: ee.Reducer.min(),
geometry: geometry,
scale: 30,
maxPixels: 1e9
}).values().get(0));
print(min, 'min');
var max = ee.Number(ndvi.reduceRegion({
reducer: ee.Reducer.max(),
geometry: geometry,
scale: 30,
maxPixels: 1e9
}).values().get(0));
print(max, 'max')
}
//fractional vegetation
{
var fv =(ndvi.subtract(min).divide(max.subtract(min))).pow(ee.Number(2)).rename('FV');
print(fv, 'fv');
Map.addLayer(fv);
}
//Emissivity
var a= ee.Number(0.004);
var b= ee.Number(0.986);
var EM=fv.multiply(a).add(b).rename('EMM');
var imageVisParam3 = {min: 0.9865619146722164, max:0.989699971371314};
Map.addLayer(EM, imageVisParam3,'EMM');
//LST in Celsius Degree bring -273.15
//NB: In Kelvin don't bring -273.15
var LST = col.map(function(image){
return image.select().addBands(thermal.expression(
'(Tb/(1 + (0.00115* (Tb / 1.438))*log(Ep)))-273.15', {
'Tb': thermal.select('B10'),
'Ep':EM.select('EMM')
}).float()).rename('LST')});
Map.addLayer(LST, {min: 20.569706944223423, max:29.328077233404645, palette: [
'040274', '040281', '0502a3', '0502b8', '0502ce', '0502e6',
'0602ff', '235cb1', '307ef3', '269db1', '30c8e2', '32d3ef',
'3be285', '3ff38f', '86e26f', '3ae237', 'b5e22e', 'd6e21f',
'fff705', 'ffd611', 'ffb613', 'ff8b13', 'ff6e08', 'ff500d',
'ff0000', 'de0101', 'c21301', 'a71001', '911003'
]},'LST');
print(
ui.Chart.image.series({
imageCollection: LST,
region: geometry,
reducer: ee.Reducer.mean(), // default
scale: 30, // nominal scale Landsat imagery
xProperty: 'system:time_start' // default
}));
Best Answer
It looks like you are reusing code in a wrong way. You need individual values for ndvi, thermal and fv images and, ndvi minimums and ndvi maximums values for each ndvi image. You get only one value because you are computing each LST value by using the same image (col.median). You need to map your collection by using a function that computes all differences. Following code snippet does the job (complete code here).
By using a particular very hot area in Mexico (I also used a different dates range), I got following result after running above code in GEE editor.
If you don't get a result in your area, it can be due to nulls in minimum and maximum values for some ndvi images. It needs to be handle appropriately before getting whatever result.
Editing Note:
I slightly modified my code for printing min and max ndvi values in your roi. It can be observed in the following image that there are several nulls y for this reason you get "ImageCollection (Error) Number.subtract: Parameter 'left' is required" error message. Where nulls are produced, there is not ndvi image (I corroborated that returning ndvi images instead min and max values).
So, for avoiding null values, you need an If statement in return of function as follows:
Complete code is in this new link.
After running this code in GEE editor, it can be observed in following image, printed desired chart without any error.