目录
1 地表温度(LST)
2 数据准备
3 代码实现
3.1 加载研究区与数据集
3.2 数据预处理与标准化
3.3 逐年批量导出
3.4 可视化结果
4 运行结果
5 完整代码
1 地表温度(LST)
在遥感领域,地表温度(Land Surface Temperature, LST)是研究气候变化、城市热岛效应、农业干旱评估等方面的重要指标。本文将以Google Earth Engine(GEE)为工具,详细解析如何高效地批量下载MODIS地表温度数据,结合代码实现逐年地表温度指标的计算与导出。
地表温度(LST)是地表辐射热量的直接表现,MODIS数据产品(如MOD11A2
)为全球范围提供了高时间分辨率和高空间分辨率的LST观测数据。其优点包括:
高时空覆盖:
MODIS传感器提供连续的全球地表观测,时空分辨率适中(1公里)。
长期序列:
可获取2000年至今的地表温度数据,适用于长期趋势分析。
然而,由于数据量大、时间序列长,在传统本地化处理模式下会遇到存储与计算瓶颈。Google Earth Engine提供了云端计算平台,能够高效完成大范围、多年份地表温度数据的处理和下载。
2 数据准备
研究区定义:
ROI(Region of Interest)代表研究区域,可以通过矢量文件或手动绘制来定义。本文假设已经定义了一个研究区roi。
MODIS数据集:
MODIS LST数据集选择MOD11A2,其包含地表白天温度LST_Day_1km波段,数据分辨率为1公里。
数据范围:
时间范围:2000年至2023年。
空间范围:ROI覆盖范围内。
3 代码实现
以下代码展示了如何利用GEE平台逐年提取地表温度,并进行数据标准化与导出。
3.1 加载研究区与数据集
// 定义研究区ROI,中心化显示
Map.centerObject(roi);
// 加载MODIS地表温度数据
var LST_img = ee.ImageCollection('MODIS/061/MOD11A2')
.filterBounds(roi) // 筛选研究区范围
.select('LST_Day_1km'); // 选择白天地表温度波段
3.2 数据预处理与标准化
MODIS LST数据以0.02为缩放因子(scale factor),其单位为开尔文(Kelvin)。在使用过程中需要将其转换为摄氏度,并进行归一化处理。
// 数据标准化函数
function norm_img(image) {
var minmax = image.reduceRegion({
reducer: ee.Reducer.minMax(),
geometry: roi,
scale: 250,
maxPixels: 1e9
}).values();
return image.unitScale(minmax.get(1), minmax.get(0)); // 归一化处理
}
// 逐年获取地表温度
function getLST(year) {
var rawLST = LST_img.filter(ee.Filter.calendarRange(year, year, 'year'))
.filter(ee.Filter.calendarRange(4, 10, 'month')) // 筛选4月至10月
.mean().clip(roi) // 取均值并裁剪至研究区
.multiply(0.02).subtract(273.15) // 转换为摄氏度
.rename('lst'); // 重命名为LST
return norm_img(rawLST); // 返回归一化后的数据
}
3.3 逐年批量导出
批量导出功能是利用GEE的Export.image.toDrive
接口实现,代码如下:
// 定义研究年份范围
var years = ee.List.sequence(2000, 2023);
// 逐年导出地表温度
years.getInfo().forEach(function (year) {
var lst = getLST(year);
Export.image.toDrive({
image: lst.clip(roi), // 裁剪至研究区
description: year + '_LST', // 导出描述
folder: 'LST_Exports', // 导出文件夹
fileNamePrefix: year + '_LST', // 文件名前缀
region: roi.geometry().bounds(), // 导出区域
scale: 250, // 空间分辨率250米
maxPixels: 1e13 // 最大像素限制
});
});
3.4 可视化结果
为了方便验证数据质量,可以在地图中叠加可视化图层,展示某一年份的地表温度分布。
// 可视化2000年的LST
var lst2000 = getLST(2000);
Map.addLayer(lst2000, {min: 0, max: 1, palette: ["blue", "green", "yellow", "red"]}, '2000 LST');
4 运行结果
执行代码后,所有年份的LST数据会以GeoTIFF格式保存在Google Drive指定的LST_Exports文件夹中,文件名形如2000_LST.tif。
5 完整代码
// 定义研究区roi,中心化显示
var roi = table;
Map.centerObject(roi);
// 加载MODIS地表温度数据
var LST_img = ee.ImageCollection('MODIS/061/MOD11A2')
.filterBounds(roi) // 筛选研究区范围
.select('LST_Day_1km'); // 选择白天地表温度波段
// 数据标准化函数
function norm_img(image) {
var minmax = image.reduceRegion({
reducer: ee.Reducer.minMax(),
geometry: roi,
scale: 250,
maxPixels: 1e9
}).values();
return image.unitScale(minmax.get(1), minmax.get(0)); // 归一化处理
}
// 逐年获取地表温度
function getLST(year) {
var rawLST = LST_img.filter(ee.Filter.calendarRange(year, year, 'year'))
.filter(ee.Filter.calendarRange(4, 10, 'month')) // 筛选4月至10月
.mean().clip(roi) // 取均值并裁剪至研究区
.multiply(0.02).subtract(273.15) // 转换为摄氏度
.rename('lst'); // 重命名为LST
return norm_img(rawLST); // 返回归一化后的数据
}
// 定义研究年份范围
var years = ee.List.sequence(2000, 2023);
// 逐年导出地表温度
years.getInfo().forEach(function (year) {
var lst = getLST(year);
Export.image.toDrive({
image: lst.clip(roi), // 裁剪至研究区
description: year + '_LST', // 导出描述
folder: 'LST_Exports', // 导出文件夹
fileNamePrefix: year + '_LST', // 文件名前缀
region: roi.geometry().bounds(), // 导出区域
scale: 250, // 空间分辨率250米
maxPixels: 1e13 // 最大像素限制
});
});
// 可视化2000年的LST
var lst2000 = getLST(2000);
Map.addLayer(lst2000, {min: 0, max: 1, palette: ["blue", "green", "yellow", "red"]}, '2000 LST');