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