基于 Google Earth Engine 的地表温度计算与对比

一、引言

 本文利用 Landsat 8 Level 2 数据,通过两种不同的方法计算地表温度,并对结果进行可视化对比 。

二、研究区域与数据来源

1. 研究区域

 在 GEE 中,通过定义一个多边形来精准表示该区域的地理范围,具体的坐标范围如下:

// 研究区域
var roi = ee.Geometry.Polygon([
  [[118.60, 31.80], [118.60, 32.00], [118.90, 32.00], [118.90, 31.80]]
]);

2. 数据来源

通过对这些数据进行中位数合成和裁剪操作,消除了云覆盖等因素的影响,得到最终用于计算地表温度的影像。具体代码如下:

// 加载Landsat 8 Level 2数据
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
  .filterDate('2020-01-01', '2020-12-31')
  .filterBounds(roi)
  .median()
  .clip(roi);

三、地表温度计算方法

方法 1:直接转换

1. 理论依据

这种方法是基于 Landsat 8 数据的辐射定标原理。Landsat 8 的热红外波段(ST_B10)记录的是传感器接收到的辐射亮度值,该值需要经过一系列的转换才能得到地表温度。直接转换方法是一种简化的处理方式,它假设地表比辐射率为一个常数,并且忽略了大气校正等复杂因素的影响。

2. 计算公式

首先,将 ST_B10 波段的数字量化值(DN 值)转换为辐射亮度值(L),公式为:

其中,DN为 ST_B10 波段的数字量化值,0.00341802 为增益系数,149.0 为偏移系数。

然后,将辐射亮度值转换为开尔文温度(TK​),假设地表比辐射率为 1,可使用普朗克定律的简化形式:

最后,将开尔文温度转换为摄氏度(TC​):

综合以上公式,得到直接转换的计算公式为:

在 GEE 中实现的代码如下:

// 方法1:直接转换ST_B10为摄氏度
var lst_simple = landsat.select('ST_B10')
  .multiply(0.00341802)
  .add(149.0)
  .subtract(273.15)
  .rename('LST_Simple');

方法 2:手动计算亮度温度

1. 理论依据

手动计算亮度温度的方法基于普朗克定律和辐射传输理论。普朗克定律描述了黑体在不同温度下的辐射能量分布,而辐射传输理论则考虑了大气对热红外辐射的吸收、散射和发射等影响。在实际应用中,需要对传感器接收到的辐射亮度进行大气校正和地表比辐射率校正,以得到准确的地表温度。

2. 计算公式

首先,将 ST_B10 波段的数字量化值(DN 值)转换为辐射亮度值(L),公式与方法 1 相同:

然后,根据普朗克定律的反演公式,计算亮度温度(Tb​):

其中,h为普朗克常数(6.626×10−34Js),c为光速(2.998×108m/s),λ为热红外波段的中心波长(对于 Landsat 8 的 ST_B10 波段,λ=10.904×10−6m),k为玻尔兹曼常数(1.381×10−23J/K)。

为了简化计算,在实际应用中通常使用近似公式:
Tb​=ln(LK1​​+1)K2​​
其中,K1​和K2​为 Landsat 8 的定标常数,对于 ST_B10 波段,

最后,考虑地表比辐射率(ϵ)的影响,对亮度温度进行校正,得到地表温度(LST):

其中,14388 是由普朗克常数、光速和玻尔兹曼常数推导得到的常数。

在 GEE 中实现的代码如下:

// 方法2:手动计算亮度温度(验证用)
var thermal = landsat.select('ST_B10')
  .multiply(0.00341802)
  .add(149.0);

var lst_manual = thermal.expression(
  'Tb / (1 + (lambda * Tb / 14388) * log(epsilon)) - 273.15', {
    'Tb': thermal,
    'lambda': 10.904,
    'epsilon': 0.96
}).rename('LST_Manual');

结果可视化

将两种方法计算得到的地表温度结果进行可视化展示,使用 GEE 的地图功能,设置合适的可视化参数,将结果添加到地图上。通过可视化结果,可以直观地看到两种方法计算得到的地表温度分布情况,并且可以对两种方法的结果进行对比分析。具体代码如下:

// 可视化结果
Map.centerObject(roi, 10);
Map.addLayer(lst_simple, {min: 20, max: 40, palette: ['blue', 'yellow', 'red']}, 'Simple LST');
Map.addLayer(lst_manual, {min: 20, max: 40, palette: ['blue', 'yellow', 'red']}, 'Manual LST');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI_RSER

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

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

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

打赏作者

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

抵扣说明:

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

余额充值