Landsat 8热红外数据?地表温度如何计算?
很多同学拿到影像后会直接问:Landsat 8热红外数据?地表温度如何计算? 这个问题的关键不只是套一个公式,而是要弄清楚你手里的数据级别、热红外波段、辐射定标参数、发射率以及温度单位。本文按 GIS 实操流程,说明如何用 Landsat 8 热红外数据计算地表温度,并指出最容易算错的地方。

引言:Landsat 8热红外数据计算地表温度的基本思路
Landsat 8 的热红外传感器是 TIRS,常用于反演地表温度。对初学者来说,最常见的数据是从 USGS 下载的 Level-1 产品,其中热红外波段仍然是数字量化值,也就是 DN 值。要得到地表温度,需要完成辐射定标、亮温转换和地表发射率校正。
如果你下载的是 Landsat Collection 2 Level-2 Surface Temperature 产品,官方已经提供了地表温度波段,通常不需要再从 Band 10 手动反演。但在教学、论文复现或只拿到 Level-1 数据时,仍然需要掌握手工计算流程。
背景:为什么不能直接把Landsat 8热红外波段当作地表温度
Landsat 8 热红外数据中的 Band 10 和 Band 11 记录的不是摄氏温度,而是传感器接收到的热辐射信息。影像像元值经过量化存储,必须结合 MTL 元数据文件中的定标系数,才能转换为物理意义明确的辐射亮度。
常见的计算链条如下:
- 读取 Landsat 8 Level-1 数据中的 Band 10。
- 从 MTL 文件获取辐射定标参数。
- 将 DN 值转换为顶部大气光谱辐射亮度。
- 利用热常数将辐射亮度转换为传感器亮温。
- 根据 NDVI 或土地覆盖类型估算地表发射率。
- 对亮温进行发射率校正,得到地表温度。
- 将开尔文温度转换为摄氏度。
需要注意的是,Landsat 8 Band 11 曾受杂散光影响较大,在很多地表温度反演教程中更推荐使用 Band 10。除非你使用的是经过可靠校正的数据或特定算法,否则初学实操建议优先使用 Band 10。
原理:Landsat 8地表温度计算涉及的三个核心公式
1. DN值转换为辐射亮度
对于 Landsat 8 Level-1 数据,热红外波段 DN 值需要先转换为顶部大气光谱辐射亮度。公式为:
Lλ = ML × Qcal + AL
其中:
- Lλ:顶部大气光谱辐射亮度。
- ML:辐射亮度乘法系数,对应 MTL 文件中的 RADIANCE_MULT_BAND_10。
- AL:辐射亮度加法系数,对应 MTL 文件中的 RADIANCE_ADD_BAND_10。
- Qcal:Band 10 的 DN 值。
在 MTL 文件中,你通常会看到类似参数:
RADIANCE_MULT_BAND_10 = 0.0003342
RADIANCE_ADD_BAND_10 = 0.10000
K1_CONSTANT_BAND_10 = 774.8853
K2_CONSTANT_BAND_10 = 1321.0789
不同影像的参数可能不同,实际计算时必须读取该景影像对应的 MTL 文件,不要直接复制别人文章里的系数。
2. 辐射亮度转换为亮温
完成辐射定标后,使用热常数将辐射亮度转换为传感器亮温。公式为:
BT = K2 / ln(K1 / Lλ + 1)
其中:
- BT:传感器亮温,单位通常为开尔文。
- K1:Band 10 热常数 K1_CONSTANT_BAND_10。
- K2:Band 10 热常数 K2_CONSTANT_BAND_10。
- Lλ:上一步得到的辐射亮度。
亮温不是严格意义上的地表温度。它可以理解为传感器“看到”的等效黑体温度,还没有考虑不同地物发射率的影响。
3. 亮温进行地表发射率校正
真实地表不是理想黑体,水体、植被、裸土、建筑物的热红外发射率不同。因此,Landsat 8 热红外数据计算地表温度时通常还要加入地表发射率校正。
常用的校正公式为:
LST = BT / (1 + (λ × BT / ρ) × ln(ε))
其中:
- LST:地表温度,单位为开尔文。
- BT:亮温。
- λ:Band 10 有效波长,常用约 10.895 微米。
- ρ:常数,约 1.438 × 10^-2 m·K。
- ε:地表发射率。
如果公式中 λ 使用米作为单位,应写作 10.895 × 10^-6 m。单位不统一会造成明显错误。
最后将开尔文转换为摄氏度:
LST_Celsius = LST - 273.15
步骤:用Landsat 8热红外数据计算地表温度
步骤一:准备数据
建议准备以下文件:
- Landsat 8 Level-1 影像的 Band 10 文件,通常文件名包含 B10。
- 红光波段 Band 4,用于计算 NDVI。
- 近红外波段 Band 5,用于计算 NDVI。
- 该景影像对应的 MTL.txt 元数据文件。
- 研究区边界,可选,用于裁剪结果。
如果你只想快速得到温度结果,也可以直接下载 Landsat Collection 2 Level-2 的地表温度产品。但如果目的是学习地表温度反演过程,建议从 Level-1 数据开始练习。
步骤二:读取MTL文件中的Band 10参数
打开 MTL.txt,找到与 Band 10 相关的参数:
RADIANCE_MULT_BAND_10
RADIANCE_ADD_BAND_10
K1_CONSTANT_BAND_10
K2_CONSTANT_BAND_10
这四个参数是 Landsat 8 热红外数据计算地表温度的基础。不要把 Band 10 的参数和 Band 11 的参数混用。
步骤三:用Band 10计算辐射亮度
在 QGIS 栅格计算器、ArcGIS Pro 栅格计算器或 Python 中,都可以使用同一公式:
Lλ = RADIANCE_MULT_BAND_10 × B10 + RADIANCE_ADD_BAND_10
以 QGIS 为例,可以在“栅格计算器”中输入类似表达式:
0.0003342 * "LC08_B10@1" + 0.10000
这里的系数只是示例。实际项目中应替换为你的 MTL 文件对应值。
步骤四:把辐射亮度转换为亮温
继续使用栅格计算器,输入亮温公式:
1321.0789 / ln((774.8853 / Lλ) + 1)
得到的结果单位是开尔文。如果此时你直接减去 273.15,只能得到未做发射率校正的亮温摄氏值,不能简单等同于地表温度。
步骤五:计算NDVI并估算地表发射率
常见做法是使用 NDVI 阈值法估算地表发射率。NDVI 的公式为:
NDVI = (Band5 - Band4) / (Band5 + Band4)
其中 Band 5 是近红外波段,Band 4 是红光波段。计算前最好使用表观反射率或地表反射率数据,而不是直接使用原始 DN 值。若只是入门练习,很多教程会直接用波段值计算,但严谨项目不建议这样处理。
一种常见的发射率估算思路如下:
- 水体或低 NDVI 区域:发射率可按经验值设置。
- 裸土区域:发射率通常低于植被。
- 高植被覆盖区域:发射率通常接近 0.99。
- 混合像元:可使用植被覆盖度 Pv 估算。
植被覆盖度可按下式估算:
Pv = ((NDVI - NDVImin) / (NDVImax - NDVImin))^2
常用发射率估算公式之一为:
ε = 0.004 × Pv + 0.986
这里的 NDVImin 和 NDVImax 应根据研究区影像统计确定,不建议机械使用固定值。城市、农田、山区和湿地的 NDVI 分布差异很大。
步骤六:进行发射率校正得到地表温度
有了亮温 BT 和发射率 ε 后,可计算地表温度:
LST = BT / (1 + (10.895e-6 × BT / 1.438e-2) × ln(ε))
再转换为摄氏度:
LST_C = LST - 273.15
得到结果后,建议先检查温度范围。大多数陆地区域的日间地表温度一般不会出现大面积低于零下几十摄氏度或高于八九十摄氏度的异常值。如果出现这种结果,通常是参数、单位、NoData 或发射率处理出了问题。
步骤七:裁剪、渲染与结果检查
完成地表温度栅格后,可以按研究区边界裁剪,并使用连续色带进行渲染。制图时建议标明:
- 影像日期。
- 传感器和数据级别。
- 使用的热红外波段。
- 温度单位。
- 是否进行了发射率校正。
如果用于论文或报告,还应说明云掩膜、异常值处理、NDVI 阈值和发射率估算方法。
常见坑:Landsat 8地表温度计算最容易出错的地方
1. 把DN值直接当作温度
Band 10 的像元值不是摄氏度,也不是开尔文。它必须先经过辐射定标和亮温转换。直接查看像元值并解释为温度,是 Landsat 8 热红外数据计算地表温度中最典型的错误。
2. 使用了错误的MTL参数
不同景影像的定标参数可能不同。复制别人影像的 RADIANCE_MULT_BAND_10、RADIANCE_ADD_BAND_10、K1 和 K2,可能导致结果偏差。正确做法是读取当前影像自带的 MTL 文件。
3. Band 10和Band 11混用
Band 10 和 Band 11 的定标参数不同,不能用 Band 10 的 K1、K2 去计算 Band 11,也不能把两个波段随意平均。入门实操建议使用 Band 10。
4. 忘记开尔文与摄氏度转换
亮温和地表温度公式通常输出开尔文。若最终要得到摄氏度,需要减去 273.15。若发现结果集中在 290 到 320 左右,这通常是开尔文温度,不是摄氏度。
5. 发射率取值过于粗糙
如果整幅图统一设置 ε = 1,相当于把所有地物都当作理想黑体,结果只能作为粗略亮温参考。城市热岛、农田、裸地等场景中,发射率差异会影响地表温度结果。
6. 没有处理云、云影和水体异常
云和云影会明显干扰热红外反演。建议使用 QA 波段、官方质量掩膜或云检测结果剔除云区。水体区域的发射率和热特征也与陆地不同,研究城市热环境时应单独考虑。
方法比较:手动反演、QGIS、ArcGIS Pro与官方地表温度产品
| 方法 | 适用场景 | 优点 | 注意事项 |
|---|---|---|---|
| 手动公式反演 | 教学、论文复现、理解算法 | 过程透明,便于检查每一步 | 需要正确处理参数、单位、发射率和云掩膜 |
| QGIS栅格计算器 | 无代码快速计算 | 免费开源,适合入门练习 | 复杂表达式容易写错,需注意 NoData |
| ArcGIS Pro栅格计算器 | 已有 ArcGIS 工作流的项目 | 与空间分析、制图流程衔接方便 | 需要正确设置环境范围、像元大小和掩膜 |
| Python批处理 | 多景影像、长时间序列 | 自动化程度高,适合批量处理 | 需要管理投影、NoData、数据类型和内存 |
| USGS Level-2地表温度产品 | 快速分析、区域对比 | 官方预处理,减少手动错误 | 需理解比例因子、质量控制和产品适用条件 |
如果你是初学者,建议先用一景 Level-1 数据在 QGIS 中完整做一遍公式计算。理解流程后,再考虑用 Python 批处理或直接使用官方 Level-2 产品。
检查清单:计算完成后如何判断结果是否可靠
- 是否使用了 Landsat 8 Band 10,而不是误选 Band 11 或其他波段?
- 是否读取了当前影像对应的 MTL 文件参数?
- RADIANCE_MULT_BAND_10 和 RADIANCE_ADD_BAND_10 是否正确代入?
- K1_CONSTANT_BAND_10 和 K2_CONSTANT_BAND_10 是否来自同一景影像?
- 亮温结果是否为开尔文,最终是否转换为摄氏度?
- 是否进行了地表发射率校正?
- NDVI 的红光和近红外波段是否选对?
- 是否处理了云、云影、NoData 和异常值?
- 输出温度范围是否符合研究区季节和地表类型?
- 制图图例是否清楚标明单位为 ℃ 或 K?
FAQ:Landsat 8热红外数据地表温度计算常见问题
问:Landsat 8计算地表温度应该用Band 10还是Band 11?
一般建议优先使用 Band 10。Band 11 在早期资料中常被提到,但由于杂散光问题,很多常规地表温度反演教程会选择 Band 10。除非你明确知道所用算法和数据产品如何处理 Band 11,否则不要随意使用双通道平均。
问:亮温和地表温度有什么区别?
亮温是传感器接收到辐射后换算出的等效黑体温度,尚未充分考虑真实地物发射率。地表温度是在亮温基础上结合地表发射率等因素修正后的结果。简单说,亮温是中间结果,地表温度才是更接近地表热状态的结果。
问:为什么我算出来的温度是300多?
如果结果在 280 到 330 左右,通常说明单位还是开尔文。转换为摄氏度需要减去 273.15。例如 303.15 K 对应约 30 ℃。
问:可以不做发射率校正吗?
可以得到亮温或近似结果,但不建议把它严格称为地表温度。对于教学演示可以先不做发射率校正,但在城市热岛、生态环境评价、论文分析等场景中,应尽量进行发射率校正并说明方法。
问:Landsat 8 Level-2地表温度产品还需要这些公式吗?
通常不需要从 Band 10 重新计算。Level-2 产品已经包含官方处理后的地表温度相关数据,但使用时要查看产品说明,正确应用比例因子、偏移量和质量控制波段。
问:QGIS和ArcGIS Pro计算结果不一致怎么办?
先检查输入波段、MTL 参数、NoData、数据类型、表达式括号和温度单位是否一致。很多差异不是软件算法造成的,而是环境范围、像元对齐、掩膜或表达式写法不同导致的。
结论:计算Landsat 8地表温度要重视参数、单位和发射率
Landsat 8 热红外数据计算地表温度的核心流程并不复杂:Band 10 的 DN 值先转辐射亮度,再转亮温,最后结合地表发射率校正并转换为摄氏度。真正容易出错的是 MTL 参数混用、单位不统一、Band 10 和 Band 11 混淆,以及忽略云和发射率。
如果你的目标是理解原理和掌握 GIS 栅格计算,建议按本文流程手动做一遍。如果你的目标是稳定生产结果或做大范围时序分析,可以优先考虑官方 Level-2 地表温度产品,并结合质量控制波段进行筛选。这样既能减少人为错误,也能让地表温度分析更可靠。