Tuesday, September 23, 2025

Estimasi Suhu Permukaan Tanah di Google Earth Engine

Berikut ini skrip Google Earth Engine (GEE) untuk estimasi suhu permukaan tanah/land surface temperature (LST).

Data yang digunakan adalah citra Landsat Tahun 1995,  2000, 2005, 2010, 2015, 2020, 2025.


// Year list to map

Map.centerObject(table,12);

var yearList = [1995, 2000, 2005, 2010, 2015, 2020, 2025];

// ------------1995-----------

var citra1995 = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2')

     .filterBounds(table)

     .filterDate('1995-01-01','1995-12-31')

     .filterMetadata('CLOUD_COVER_LAND', 'less_than', 50)

     .sort('CLOUD_COVER', false);


var sortir_citra = ee.Image(citra1995.sort('CLOUD_COVER').first());

print(sortir_citra);

var image95 = ee.Image('LANDSAT/LT05/C02/T1_L2/LT05_113060_19950505');

Map.addLayer(image95.clip(table),FCC543_1995,'Landsat5_1995');


//hitung ndvi

var ndvi1995 = image95.expression('(a-b)/(a+b)',{

 a: image95.select('SR_B4'),

 b: image95.select('SR_B3'),

 }).rename('ndvi');

 Map.addLayer(ndvi1995.clip(table),ndvi_1995,'ndvi 1995');


// histogram ndvi

 var histo95 = ui.Chart.image.histogram({

           image : ndvi1995,

           region : table,

           scale : 30

 });

     print(histo95);

Export.image.toDrive({

 image : image95.select(['SR_B1','SR_B2','SR_B3','SR_B4','SR_B5','SR_B7']),

 description : 'L5_1995',

  scale : 30,

  region : table,

  folder : 'GEE',

  fileFormat : 'GeoTIFF',

  maxPixels :1e13,

  formatOptions : {

  cloudOptimized : true}

 });

 Export.image.toDrive({

   image : ndvi1995,

   description : 'ndvi1995',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });


 var min = ee.Number(image95.select(['ST_B6']).multiply(0.1).reduceRegion({

 reducer: ee.Reducer.min(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(min, 'minLST');


 var max = ee.Number(image95.select(['ST_B6']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.max(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(max, 'maxLST');


 var histo = ui.Chart.image.histogram({

           image : image95,

           region : table,

           scale : 60

   });

 print(histo);

    

// ------------------2000-------------

 var citra2000 = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2')

     .filterBounds(table)

     .filterDate('2000-01-01','2000-12-31')

     .filterMetadata('CLOUD_COVER_LAND', 'less_than', 50)

     .sort('CLOUD_COVER', false);


 var sortir_citra = ee.Image(citra2000.sort('CLOUD_COVER').first());

 print(sortir_citra);


 var image00 = ee.Image('LANDSAT/LE07/C02/T1_L2/LE07_113060_20001017');

 Map.addLayer(image00.clip(table),FCC543_2000,'Landsat7_2000');


// hitung ndvi

 var ndvi2000 = image00.expression('(a-b)/(a+b)',{

 a: image20.select('SR_B4'),

 b: image20.select('SR_B3'),

 }).rename('ndvi');

 Map.addLayer(ndvi2000.clip(table),ndvi_2000, 'ndvi 2000');


// histogram ndvi

 var histo00 = ui.Chart.image.histogram({

           image : ndvi2000,

           region : table,

           scale : 30

   });

     print(histo00);


 Export.image.toDrive({

   image : image00.select(['SR_B1','SR_B2','SR_B3','SR_B4','SR_B5','SR_B7']),

   description : 'L7_2000',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });


 Export.image.toDrive({

   image : ndvi2000,

   description : 'ndvi2000',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

   cloudOptimized : true}

 });


 var min = ee.Number(image00.select(['ST_B6']).multiply(0.1).reduceRegion({

 reducer: ee.Reducer.min(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(min, 'minLST');


 var max = ee.Number(image00.select(['ST_B6']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.max(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(max, 'maxLST');


 var histo = ui.Chart.image.histogram({

           image : image00,

           region : table,

           scale : 60

   });

 print(histo);

    

    

// ---------2005-------------

 var citra2005 = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2')

     .filterBounds(table)

     .filterDate('2005-01-01','2005-12-31')

     .filterMetadata('CLOUD_COVER_LAND', 'less_than', 50)

     .sort('CLOUD_COVER', false);


 var sortir_citra = ee.Image(citra2005.sort('CLOUD_COVER').first());

 print(sortir_citra);


 var image05 = ee.Image('LANDSAT/LE07/C02/T1_L2/LE07_113060_20050217');

 Map.addLayer(image05.clip(table),FCC543_2005,'Landsat 7_2005');


// hitung ndvi

 var ndvi2005 = image05.expression('(a-b)/(a+b)',{

 a: image05.select('SR_B4'),

 b: image05.select('SR_B3'),

 }).rename('ndvi');

 Map.addLayer(ndvi2005.clip(table),ndvi_2005, 'ndvi 2005');


// histogram ndvi

 var histo05 = ui.Chart.image.histogram({

           image : ndvi2005,

           region : table,

           scale : 30

   });

     print(histo05);


 Export.image.toDrive({

   image : image05.select(['SR_B1','SR_B2','SR_B3','SR_B4','SR_B5','SR_B7']),

   description : 'citraL7_2000',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });

 Export.image.toDrive({

   image : ndvi2005,

   description : 'ndvi2005',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });


 var min = ee.Number(image05.select(['ST_B6']).multiply(0.1).reduceRegion({

 reducer: ee.Reducer.min(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(min, 'minLST');


 var max = ee.Number(image05.select(['ST_B6']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.max(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(max, 'maxLST');


 var histo = ui.Chart.image.histogram({

           image : image05,

           region : table,

           scale : 60

   });

 print(histo);

    

// --------------------------2010-----------------

var citra2010 = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2')

     .filterBounds(table)

     .filterDate('2010-01-01','2010-12-31')

     .filterMetadata('CLOUD_COVER_LAND', 'less_than', 90)

     .sort('CLOUD_COVER', false);

 var sortir_citra = ee.Image(citra2010.sort('CLOUD_COVER').first());

 print(sortir_citra);


 var image10 = ee.Image('LANDSAT/LE07/C02/T1_L2/LE07_113060_20101013');

 Map.addLayer(image10.clip(table),FCC543_2010,'Landsat 7_2010');


// hitung ndvi

 var ndvi2010 = image10.expression('(a-b)/(a+b)',{

 a: image10.select('SR_B4'),

 b: image10.select('SR_B3'),

 }).rename('ndvi');

 Map.addLayer(ndvi2010.clip(table),ndvi_2010, 'ndvi 2010');


// histogram ndvi

 var histo10 = ui.Chart.image.histogram({

           image : ndvi2010,

           region : table,

           scale : 30

   });

     print(histo10);


 Export.image10.toDrive({

   image : image10.select(['SR_B1','SR_B2','SR_B3','SR_B4','SR_B5','SR_B7']),

   description : 'citraL7_2010',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });

Export.image.toDrive({

   image : ndvi2010,

   description : 'ndvi2010',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });


 var min = ee.Number(image10.select(['ST_B6']).multiply(0.1).reduceRegion({

 reducer: ee.Reducer.min(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(min, 'minLST');


 var max = ee.Number(image10.select(['ST_B6']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.max(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(max, 'maxLST');


 var histo = ui.Chart.image.histogram({

           image : image10,

           region : table,

           scale : 60

   });

 print(histo);

    

// -----2015----------

 var citra2015 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')

     .filterBounds(table)

     .filterDate('2015-01-01','2015-12-31')

     .filterMetadata('CLOUD_COVER_LAND', 'less_than', 90)

     .sort('CLOUD_COVER', false);


 var sortir_citra = ee.Image(citra2015.sort('CLOUD_COVER').first());

 print(sortir_citra);


 var image15 = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_113060_20151019');

 Map.addLayer(image15.clip(table),FCC654_2015,'Landsat 8_2015');


// hitung ndvi

 var ndvi2015 = image15.expression('(a-b)/(a+b)',{

 a: image15.select('SR_B5'),

 b: image15.select('SR_B4'),

 }).rename('ndvi');

 Map.addLayer(ndvi2015.clip(table),ndvi_2015, 'ndvi 2015');


// histogram ndvi

 var histo15 = ui.Chart.image.histogram({

           image : ndvi2015,

           region : table,

           scale : 30

   });

     print(histo15);


 Export.image.toDrive({

   image : image15.select(['SR_B1','SR_B2','SR_B3','SR_B4','SR_B5','SR_B7']),

   description : 'citraL8_2015',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });

 Export.image.toDrive({

   image : ndvi2015,

   description : 'ndvi2015',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });


 var min = ee.Number(image15.select(['ST_B10']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.min(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(min, 'minLST');


 var max = ee.Number(image15.select(['ST_B10']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.max(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(max, 'maxLST');


 var histo = ui.Chart.image.histogram({

           image : image15,

           region : table,

           scale : 60

   });

 print(histo);

    

// ------2020------------

var citra2020 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')

     .filterBounds(table)

     .filterDate('2020-01-01','2020-12-31')

     .filterMetadata('CLOUD_COVER_LAND', 'less_than', 50)

     .sort('CLOUD_COVER', false);


 var sortir_citra = ee.Image(citra2020.sort('CLOUD_COVER').first());

 print(sortir_citra);


 var image20 = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_113060_20200829');

 Map.addLayer(image20.clip(table),FCC654_2020,'Landsat 8_2020');


// hitung ndvi

 var ndvi2020 = image20.expression('(a-b)/(a+b)',{

 a: image20.select('SR_B5'),

 b: image20.select('SR_B4'),

 }).rename('ndvi');

 Map.addLayer(ndvi2020.clip(table),ndvi_2020, 'ndvi 2020');


// histogram ndvi

 var histo20 = ui.Chart.image.histogram({

           image : ndvi2020,

           region : table,

           scale : 30

   });

     print(histo20);


 Export.image.toDrive({

   image : image20.select(['SR_B1','SR_B2','SR_B3','SR_B4','SR_B5','SR_B7']),

   description : 'citraL8_2020',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

    cloudOptimized : true}

 });

 Export.image.toDrive({

   image : ndvi2020,

   description : 'ndvi2020',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

    cloudOptimized : true}

 });


 var min = ee.Number(image20.select(['ST_B10']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.min(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(min, 'minLST');


 var max = ee.Number(image20.select(['ST_B10']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.max(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(max, 'maxLST');


 var histo = ui.Chart.image.histogram({

           image : image20,

           region : table,

           scale : 60

   });

 print(histo);


// ----------2025-------------

var citra2025 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')

    .filterBounds(table)

    .filterDate('2025-01-01','2025-06-18')

    .filterMetadata('CLOUD_COVER_LAND', 'less_than', 50)

    .sort('CLOUD_COVER', false);


// var sortir_citra = ee.Image(citra2025.sort('CLOUD_COVER').first());

// print(sortir_citra);


var image25 = ee.Image('LANDSAT/LC09/C02/T1_L2/LC09_113060_20250531');

Map.addLayer(image25.clip(table),FCC654_2025,'Landsat 9_2025');


// hitung ndvi

 var ndvi2025 = image25.expression('(a-b)/(a+b)',{

 a: image25.select('SR_B5'),

 b: image25.select('SR_B4'),

 }).rename('ndvi');

 Map.addLayer(ndvi2025.clip(table),ndvi_2025, 'ndvi 2025');


// histogram ndvi

 var histo25 = ui.Chart.image.histogram({

           image : ndvi2025,

           region : table,

           scale : 30

   });

     print(histo25);


Export.image.toDrive({

  image : image25.select(['SR_B1','SR_B2','SR_B3','SR_B4','SR_B5','SR_B7']),

  description : 'citraL9_20025',

  scale : 30,

  region : table,

  folder : 'GEE',

  fileFormat : 'GeoTIFF',

  maxPixels :1e13,

  formatOptions : {

    cloudOptimized : true}

});

Export.image.toDrive({

   image : ndvi2025,

   description : 'ndvi2025',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });


 var min = ee.Number(image25.select(['ST_B10']).multiply(0.1).reduceRegion({

 reducer: ee.Reducer.min(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(min, 'minLST');


 var max = ee.Number(image25.select(['ST_B10']).multiply(0.001).reduceRegion({

 reducer: ee.Reducer.max(),

 scale: 60,

 maxPixels: 1e9

 }).values().get(0));

 print(max, 'maxLST');


 var histo = ui.Chart.image.histogram({

           image : image25,

           region : table,

           scale : 60

   });

 print(histo);


// yearList.map(function(year){

//   var start = ee.Date.fromYMD(year, 1, 1);

//   var end = ee.Date.fromYMD(year, 12, 31);

//   var date = [start, end];});


// var lst = image25(table, date).multiply(0.00341802).add(149).add(-273.15).toInt16();


    // var meanLST25 = ee.Number(image25.reduceRegion({

    //   geometry: table,

    //   scale: 60,

    //   bestEffort: true,

    //   reducer: ee.Reducer.mean()

    // }).get('LST'));

// print(meanLST25, 'meanLST');    


// ************LST********************************************************

var startDate = '2025-05-25';

var endDate = '2025-06-01';


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

}


function maskL8sr(col) {


var cloudShadowBitMask = (1 << 3);

var cloudsBitMask = (1 << 5);


var qa = col.select('QA_PIXEL');


var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)

             .and(qa.bitwiseAnd(cloudsBitMask).eq(0));

return col.updateMask(mask);

}


var image = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')

.filterDate(startDate, endDate)

.filterBounds(table)

.map(applyScaleFactors)

.map(maskL8sr)

.median();


var visualization = {

bands: ['SR_B6', 'SR_B5', 'SR_B4'],

min: 0.0,

max: 0.3,

};


// Map.addLayer(image.clip(table), visualization, 'False Color (432)');


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

// Map.addLayer(ndvi.clip(table), {min:-1, max:1, palette: ['blue', 'white', 'green']}, 'ndvi');


var ndvi_min = ee.Number(ndvi.reduceRegion({

reducer: ee.Reducer.min(),

geometry: table,

scale: 30,

maxPixels: 1e9

}).values().get(0));


var ndvi_max = ee.Number(ndvi.reduceRegion({

reducer: ee.Reducer.max(),

geometry: table,

scale: 30,

maxPixels: 1e9

}).values().get(0));



var pv = (ndvi.subtract(ndvi_min).divide(ndvi_max.subtract(ndvi_min))).pow(ee.Number(2))

      .rename('PV');

var em = pv.multiply(ee.Number(0.004)).add(ee.Number(0.986)).rename('EM');

var thermal = image.select('ST_B10').rename('thermal');

var lst = thermal.expression(

'(tb / (1 + (0.00115 * (tb/0.48359547432)) * log(em))) - 273.15',

{'tb':thermal.select('thermal'),

'em': em}).rename('LST');


var lst_vis = {

min: 05,

max: 50,

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']

};


Map.addLayer(lst.clip(table), lst_vis, 'LST2025');

Export.image.toDrive({

   image : lst,

   description : 'lst2025',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });

Export.image.toDrive({

   image : em,

   description : 'em2025',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

   cloudOptimized : true}

 });


Export.image.toDrive({

   image : pv,

   description : 'pv2025',

   scale : 30,

   region : table,

   folder : 'GEE',

   fileFormat : 'GeoTIFF',

   maxPixels :1e13,

   formatOptions : {

     cloudOptimized : true}

 });


// ----------HITUNG LST---------

// var cities = ['Kota Gorontalo'];

// function filterCol(col, table, date){

//   return col.filterDate(date[0], date[1]).filterBounds(table);

// }


// function landsat457(table, date){

//   var col = filterCol(l4, table, date).merge(filterCol(l5, table, date)).merge(filterCol(l7, table, date));

//   var image = col.map(cloudMaskTm).median().clip(table);

//   return image;

// }


// function landsat89(table, date){

//   var col = filterCol(l8, table, date).merge(filterCol(l9, table, date));

//   var image = col.map(cloudMaskOli).median().clip(table);

//   return image;}


// function cloudMaskTm(image){

//   var qa = image.select('QA_PIXEL');

//   var dilated = 1 << 1;

//   var cloud = 1 << 3;

//   var shadow = 1 << 4;

//   var mask = qa.bitwiseAnd(dilated).eq(0)

//     .and(qa.bitwiseAnd(cloud).eq(0))

//     .and(qa.bitwiseAnd(shadow).eq(0));

  

//   return image.select(['ST_B10'], ['LST']).updateMask(mask);

// }


// function cloudMaskOli(image){

//   var qa = image.select('QA_PIXEL');

//   var dilated = 1 << 1;

//   var cirrus = 1 << 2;

//   var cloud = 1 << 3;

//   var shadow = 1 << 4;

//   var mask = qa.bitwiseAnd(dilated).eq(0)

//     .and(qa.bitwiseAnd(cirrus).eq(0))

//     .and(qa.bitwiseAnd(cloud).eq(0))

//     .and(qa.bitwiseAnd(shadow).eq(0));

  

//   return image.select(['ST_B10'], ['LST']).updateMask(mask);

// }


// var lstMeanCol = ee.FeatureCollection([]);


// yearList.map(function(year){

//   var start = ee.Date.fromYMD(year, 1, 1);

//   var end = ee.Date.fromYMD(year, 12, 31);

//   var date = [start, end];});

  

//   var landsat;

//   if (year < 2014) {

//     landsat = landsat457;

//   } else {

//     landsat = landsat89;

//   }

  

//   cities.map(function(city){

//     var roi = table.geometry();

    

//     var lst = landsat(table, date).multiply(0.00341802).add(149).add(-273.15).toInt16();

    

//     Map.addLayer(lst, { min: 20, max: 50, palette: ['purple', 'blue', 'cyan', 'green', 'yellow', 'red'] }, 'LST_' + city + '_' + year, false);

    

//     var image = ee.Image(lst.set('year', year, 'city', city));

   

//     var meanLST = ee.Number(image.reduceRegion({

//       geometry: table,

//       scale: 60,

//       bestEffort: true,

//       reducer: ee.Reducer.mean()

//     }).get('LST'));

    

//     lstMeanCol = lstMeanCol.merge(ee.FeatureCollection(ee.Feature(null , { LST: meanLST, year: year, city: city }))); 

//   });

// });


// var chartLST = ui.Chart.feature.groups(lstMeanCol, 'year', 'LST', 'city')

//   .setOptions({

//     title: 'Average LST per 5 Years',

//   });

// print(chartLST);


// var histo = ui.Chart.image.histogram({

//           image : image20,

//           region : table,

//           scale : 60

// });

// print(histo);


No comments:

Post a Comment