作者:CSDN @ _养乐多_
本文将介绍在Google Earth Engine(GEE)平台上使用 Landsat 8 卫星影像数据计算陆地表面温度(Land Surface Temperature,LST)的代码。
结果如下图所示,
一、参考内容
单窗算法:Google Earth Engine Open-Source Code for Land Surface Temperature Estimation from the Landsat Series
主要公式包括:
植被覆盖率(FV)计算公式:
(
(
N
D
V
I
−
N
D
V
I
m
i
n
)
/
(
N
D
V
I
m
a
x
−
N
D
V
I
m
i
n
)
)
2
((NDVI - NDVI_min) / (NDVI_max - NDVI_min))^2
((NDVI−NDVImin)/(NDVImax−NDVImin))2
辐射率(EM)计算公式:
0.004
∗
F
V
+
0.986
0.004 * FV + 0.986
0.004∗FV+0.986
陆地表面温度(LST)计算公式:
(
T
B
/
(
1
+
(
λ
∗
(
T
B
/
1.438
)
)
∗
l
n
(
e
m
)
)
)
−
273.15
(TB / (1 + (λ * (TB / 1.438)) * ln(em))) - 273.15
(TB/(1+(λ∗(TB/1.438))∗ln(em)))−273.15
其中,TB 代表热红外波段的亮度温度,em 代表辐射率,λ 代表波长(对应 Landsat 8 中的波段 10)。
二、示例代码链接
https://code.earthengine.google.com/9ce60d3992ea71ddd75c57e7de3acfa8?noload=true
三、完整示例代码
//#####################################################################################
//# #\\
//# Land Surface Temperature(LST) MAPPING #\\
//# #\\
//#####################################################################################
// date: 2024-03-11
// author: YangLeDuo
// 自定义研究区矢量边界的显示样式
var roi = table
var styling={color:'green',fillColor:'00000000'}
Map.addLayer(roi.style(styling),{},"roi");
Map.centerObject(roi, 8);
// 设置单波段配色方案
var Single_bandVisParam = {
min: 8,
max: 54,
palette: ['C2523C','F2B60E','77ED00','1BAA7D','0B2C7A',]
};
//利用QA波段生成云掩模
function maskclouds(image) {
var cloudShadowBitMask = (1 << 3);
var cloudsBitMask = (1 << 5);
var qa = image.select('QA_PIXEL');
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
.and(qa.bitwiseAnd(cloudsBitMask).eq(0));
return image.updateMask(mask);
}
function L8applyScaleFactors(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);
}
//#############################################################################################
//定义数据集
var L8_image = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterDate('2020-01-01', '2020-12-31')
.filter(ee.Filter.calendarRange(1,12,"month")) //选择月份
.filterBounds(roi)
.filter(ee.Filter.lt('CLOUD_COVER', 20))
.map(maskclouds).map(L8applyScaleFactors)
.median()
.clip(roi);
print('L8_dataset',L8_image)
//NDVI
var L8_NDVI = L8_image.expression('(NIR-Red)/(NIR+Red)', {
'NIR': L8_image.select('SR_B5'),
'Red': L8_image.select('SR_B4'),
})
// 计算AOI内的最小NDVI值
var ndviMin = ee.Number(L8_NDVI.reduceRegion({
reducer : ee.Reducer.min(),
geometry : roi,
scale : 30,
maxPixels : 1e9
}).values().get(0));
// 计算AOI内的最大NDVI值
var ndviMax = ee.Number(L8_NDVI.reduceRegion({
reducer : ee.Reducer.max(),
geometry : roi,
scale : 30,
maxPixels : 1e9
}).values().get(0));
// 植被覆盖率(FV)计算
// 公式: ((NDVI - NDVI_min) / (NDVI_max - NDVI_min))^2
// 使用指定范围内的NDVI值计算植被覆盖率(FV)。
// NDVI_min表示最小NDVI值,NDVI_max表示最大NDVI值
var fv = ((L8_NDVI.subtract(ndviMin)).divide(ndviMax.subtract(ndviMin)))
.pow(ee.Number(2))
.rename('FV');
// 辐射率计算
// 公式: 0.004 * FV + 0.986
// 使用植被覆盖率(FV)计算陆地表面辐射率(EM)。
// 0.004系数表示由于植被引起的辐射率变化,
// 0.986表示其他表面的基本辐射率。
var em = fv.multiply(ee.Number(0.004)).add(ee.Number(0.986)).rename('EM');
// 选择热带波段(波段10)并重命名
var thermal = L8_image.select('ST_B10').rename('thermal');
// 现在,让我们计算陆地表面温度(LST)
// 公式: (TB / (1 + (λ * (TB / 1.438)) * ln(em))) - 273.15
var L8_LST = thermal.expression(
'(TB / (1 + (0.00115 * (TB / 1.438)) * log(em))) - 273.15', {
'TB': thermal.select('thermal'), // 选择热带波段(TB)
'em': em // 分配辐射率(em)
}).rename('LST');
var lstMin = ee.Number(L8_LST.reduceRegion({
reducer : ee.Reducer.min(),
geometry : roi,
scale : 30,
maxPixels : 1e9
}).values().get(0));
// 计算AOI内的最大NDVI值
var lstMax = ee.Number(L8_LST.reduceRegion({
reducer : ee.Reducer.max(),
geometry : roi,
scale : 30,
maxPixels : 1e9
}).values().get(0));
print("最小陆地表面温度:", lstMin);
print("最大陆地表面温度:", lstMax);
Map.addLayer(L8_LST, Single_bandVisParam, 'LST');