当前位置:首页>python>使用 Python+GEE分析某地地表温度(LST)与热异常(FIRMS 火点)

使用 Python+GEE分析某地地表温度(LST)与热异常(FIRMS 火点)

  • 2026-10-21 13:26:39
使用 Python+GEE分析某地地表温度(LST)与热异常(FIRMS 火点)
本文简要记录这套代码的实现逻辑,并以山东省为例,展示地表温度与热异常点的监测结果。

一、数据源说明

本案例使用了两套公开的卫星数据产品,分别用于监测地表的热环境和高温异常点。

(一)地表温度(LST)

  1. 数据集名称:Landsat 8 Collection 2 Level-2 (LANDSAT/LC08/C02/T1_L2)
  2. 数据来源:USGS (美国地质调查局)
  3. 原始数据时间跨度:2013年4月11日 至今
  4. 本例使用时间:2023年6月 - 2023年9月(夏季)
  5. 处理说明:使用了 Level-2 地表反射率产品,已完成大气校正。代码中进行了云量掩膜处理,并利用 Band 10 热红外波段反演摄氏度。该数据拥有 30 米分辨率,适合观察城市内部或工业园区的精细热分布。

(二)热异常点(Thermal Anomalies)

  1. 数据集名称:FIRMS (FIRMS)
  2. 数据来源:NASA LANCE (近实时应用陆地与大气能力系统)
  3. 原始数据时间跨度:2000年11月1日 至今
  4. 本例使用时间:2023年1月 - 2023年12月(全年)
  5. 处理说明:该数据整合了 MODIS 和 VIIRS 传感器的观测结果。它对高温目标极其敏感,在山东省范围内,主要用于捕捉农事用火(秸秆焚烧)和工业高温源(工厂烟囱、火炬等)。

二、区域分析

GEE代码运行后,通过分屏对比功能,可以观察到的空间特征。下面以山东省为例。

(一)地表温度分布特征

山东省夏季地表温度呈现明显的“西高东低”梯度。济南、聊城、德州等鲁西北及中部地区,受地形闭塞和城市化效应影响,地表温度较高,省会济南主城区呈现出典型的高温聚集形态。而青岛、威海、烟台等胶东半岛区域,受海洋调节作用明显,整体温度较低。

(二)热异常点分布特征

热异常点在空间上主要呈现两种形态。一种是散落在鲁西南(菏泽、济宁)平原农耕区的点位,多与特定季节的生物质处理有关。另一种是聚集在淄博、东营及滨海工业区的常亮热点,经地理位置比对,这些点位多对应大型工业设施的高温排放口。

三、03 代码实现逻辑

本流程基于Python的geemap和earthengine-api库。

关键步骤1:读取本地Shapefile

利用geemap.shp_to_ee函数,直接将本地路径下的.shp文件转换为GEE的FeatureCollection对象,完全省去了上传Assets的步骤。

关键步骤2:数据清洗与反演

对Landsat 8数据进行去云处理,并利用公式计算摄氏度。同时提取FIRMS数据的最大值合成,以保留全年发生过的最高温记录。

关键步骤3:成果导出

将计算好的LST栅格图和提取的火点数据,通过API直接提交导出任务到Google Drive,便于后续在ArcGIS中制图。

四、代码分享

以下gee是全部代码,python部分需要关注回复获取。修改shp_path为你本地的矢量文件路径即可运行。

(一)GEE处理LST与热异常代码

// ================= 1. 导入 Shapefile =================// ★★★ 请在这里替换为你上传的 Shapefile 路径 ★★★// 例如: var roi = ee.FeatureCollection("users/yourname/Beijing_Boundary");//var roi = ee.FeatureCollection("users/你的用户名/你的Shapefile名称");// 将地图中心聚焦到你的 ShapefileMap.centerObject(roi, 8);Map.addLayer(roi, {color: 'black', fillColor: '00000000'}, '我的研究区边界');// ================= 2. 左图:夏季地表温度 (Landsat 8 LST) =================// 2.1 云量掩膜函数 (只保留晴空像素)functionmaskL8sr(image) {  var qa = image.select('QA_PIXEL');  var mask = qa.bitwiseAnd(1 << 3).eq(0)             .and(qa.bitwiseAnd(1 << 4).eq(0));  return image.updateMask(mask);}// 2.2 LST 反演计算函数functionaddLST(image) {  // Landsat 8 Band 10 是热红外波段  // 转换公式: DN * 0.003418 + 149.0 - 273.15 = 摄氏度  var lst = image.select('ST_B10').multiply(0.003418).add(149.0).subtract(273.15);  return image.addBands(lst.rename('LST_Celsius'));}// 2.3 数据筛选与处理// 筛选 6-9 月夏季数据,云量小于 30%var l8 = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")           .filterBounds(roi)           .filterDate('2023-06-01', '2023-09-01')            .filter(ee.Filter.lt('CLOUD_COVER', 30))           .map(maskL8sr)           .map(addLST);// 合成平均值,并裁剪到 Shapefile 形状var lstImage = l8.select('LST_Celsius').mean().clip(roi);// 温度可视化参数 (根据你的地区调整 min/max)var lstVis = {  min: 20,  max: 42,  palette: ['blue', 'cyan', 'yellow', 'orange', 'red', 'darkred']};// ================= 3. 右图:历史火点监测 (FIRMS) =================// 3.1 加载全年火点数据var fire = ee.ImageCollection("FIRMS")             .filterBounds(roi)             .filterDate('2023-01-01', '2023-12-31')             .select('T21'); // 3.2 合成最大值视图,并裁剪var fireImage = fire.max().clip(roi);// 火点可视化参数var fireVis = {  min: 300,   max: 450,  palette: ['black', 'red', 'orange', 'yellow', 'white']};// ================= 4. 创建左右分屏对比 =================// 左侧地图 (温度)var leftMap = ui.Map();leftMap.centerObject(roi, 8);leftMap.add(ui.Label('夏季地表温度 (LST)'));leftMap.addLayer(lstImage, lstVis, 'LST 温度');leftMap.addLayer(roi, {color: 'black', fillColor: '00000000'}, '边界'); // 叠加边界线// 右侧地图 (火点)var rightMap = ui.Map();rightMap.centerObject(roi, 8);rightMap.add(ui.Label('全年火点监测 (FIRMS)'));rightMap.addLayer(fireImage, fireVis, 'FIRMS 火点');rightMap.addLayer(roi, {color: 'white', fillColor: '00000000'}, '边界'); // 叠加边界线// 联动与分割var linker = ui.Map.Linker([leftMap, rightMap]);var splitPanel = ui.SplitPanel({  firstPanel: leftMap,  secondPanel: rightMap,  orientation: 'horizontal',  wipe: true,  style: {stretch: 'both'}});ui.root.widgets().reset([splitPanel]);// ================= 5. 导出数据 (下载到云盘) =================// 导出 LST 温度图 (GeoTIFF)Export.image.toDrive({  image: lstImage,  description: 'MyRegion_LST_Summer_2023',  folder: 'GEE_Export',  scale: 30,             // 保持 Landsat 30米分辨率  region: roi.geometry(), // 严格按照 Shapefile 边界导出  crs: 'EPSG:4326',  maxPixels: 1e13});// 导出 火点矢量表 (CSV Excel)// 筛选出边界内的火点,导出具体经纬度和时间var firePoints = fire.map(function(img){  return img.reduceRegions({    collection: roi,    reducer: ee.Reducer.max(),    scale: 1000  });}).flatten();Export.table.toDrive({  collection: fire, // 导出原始火点集合  description: 'MyRegion_Fire_Points_List',  folder: 'GEE_Export',  fileFormat: 'CSV',  selectors: ['acq_date', 'confidence', 'latitude', 'longitude'] // 只导出关键列});print("代码运行完毕!请点击右侧 'Tasks' 栏运行下载任务。");

(二)Python本地处理LST与热异常代码

import eeimport geemapimport os# 初始化 GEE# ee.Authenticate() # 首次运行需验证ee.Initialize()# ================= 1. 加载本地 Shapefile =================# 请将路径修改为电脑中真实的 .shp 文件路径# 注意:文件夹内必须包含同名的 .shx 和 .dbf 文件shp_path = r'D:\Data\Shandong\shandong_province.shp'print("正在读取本地矢量文件...")roi = geemap.shp_to_ee(shp_path)# ================= 2. 处理 LST (地表温度) =================def process_lst(image):

五、总结

该工作流适用于需要频繁更换研究区、或涉及保密数据无法上传云端的场景。代码具有通用性,通过更换Shapefile路径,可快速应用于其他省市或特定区域的生态监测。
获取资源:
如需获取python代码文件,请在后台回复关键词:LST与FIRMS,或者回复:C002。

最新文章

随机文章