0

I am calculating Land surface temperature(LST) using Landsat-8 data LANDSAT/LC08/C02/T1_L2 since LANDSAT/LC08/C01/T1_SR has been deprecated. I am following the example here. I have modified the same code but it is giving different and possibly incorrect results.

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

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


function applyScaleFactors(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}

//loading 
 {
var dataset = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
.filterDate('2018-01-01','2018-12-31')
.filterBounds(geometry);
}
//applying scaling factor
dataset = dataset.map(applyScaleFactors);

var image = dataset.median();

var ndvi = image.normalizedDifference(['SR_B5', 
'SR_B4']).rename('NDVI');


//selecting thermal band ST_B10
var thermal= image.select('ST_B10');
;

// 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'); 


//Emissivity

var a= ee.Number(0.004);
var b= ee.Number(0.986);
var EM=fv.multiply(a).add(b).rename('EMM');

//LST in Celsius Degree bring -273.15
//NB: In Kelvin don't bring -273.15
var LST = thermal.expression(
'(Tb/(1 + (0.00115* (Tb / 1.438))*log(Ep)))-273.15', {
 'Tb': thermal.select('ST_B10'),
'Ep': EM.select('EMM')
}).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');

Result using collection1, which seems accurate, Result using LANDSAT/LC08/C01/T1_SR

Result using collection2 which seems incorrect, Result using collection 2

Ayaz49
  • 325
  • 2
  • 4
  • 18

1 Answers1

0

As I understand it, collection 2 landsat has already been preprocessed so B10 is already converted into thermal. All that needs to be done is to use the following multipliers to convert it into Kelvin. Someone correct me if this is wrong?

var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
buddemat
  • 4,552
  • 14
  • 29
  • 49