GEE:基于Landsat8计算陆地表面温度(Land Surface Temperature,LST)

本文详细介绍了如何在Google Earth Engine平台上利用Landsat 8卫星数据,通过单窗算法计算陆地表面温度。作者提供了计算植被覆盖率、辐射率的公式,并给出了完整的示例代码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者: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

博客:https://medium.com/@ridhomuh002/analyzing-land-surface-temperature-lst-with-landsat-8-data-in-google-earth-engine-f4dd7ca28e70

主要公式包括:

植被覆盖率(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 ((NDVINDVImin)/(NDVImaxNDVImin))2
辐射率(EM)计算公式: 0.004 ∗ F V + 0.986 0.004 * FV + 0.986 0.004FV+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');

### 使用 Google Earth Engine (GEE) 计算 Landsat 8 地表温度 (LST) 为了在 GEE计算 Landsat 8 的地表温度(LST),可以通过一系列预处理步骤来获取表面反射率并应用单通道算法。具体过程如下: #### 数据准备 首先,加载 Landsat 8 表面反射率产品(如 `LANDSAT/LC08/C02/T1_L2`)。这类数据已经过大气校正,提供了更精确的基础输入。 ```javascript var l8sr = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2'); ``` #### 辐射亮度转换 接着,将表面反射率转换为辐射亮度。此操作基于特定波段的增益和偏移参数完成[^1]。 ```javascript function getRadiance(image){ var ML = image.select(['B10']).multiply(0.0003342).add(0.1); return ML; } ``` #### 温度反演 通过普朗克方程由热红外波段(TIRS)得到亮温,并进一步修正至真实地表温度。考虑到传感器特性与观测角度的影响,在实际编程实现时会引入额外的经验系数进行调整[^2]。 ```javascript // Convert radiance to brightness temperature. function bt(image){ var k1 = 774.89; // K1 constant for Band 10 from metadata var k2 = 1321.08; // K2 constant for Band 10 from metadata var rad = getRadiance(image); var BT = rad.expression( 'K2 / log(K1/band + 1)', { 'band': rad, 'K1' : k1, 'K2' : k2}); return BT.rename('BT').copyProperties(image,['system:time_start']); } // Apply the function over a collection and take median value as output. var lst = l8sr.filterDate('2022-01-01','2022-12-31') .map(bt) .median(); Map.addLayer(lst,{min:300,max:350,palette:'blue,green,yellow,red'},'Land Surface Temperature'); ``` 上述代码片段展示了如何从 Landsat 8 影像中提取 LST 并可视化显示出来。注意这里的日期范围可以根据需求灵活设置。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_养乐多_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值