GEE批量下载与预处理MODIS地表温度数据实战
1. 为什么选择GEE处理MODIS地表温度数据第一次接触遥感数据处理时我被各种复杂的软件和流程搞得晕头转向。直到发现了Google Earth EngineGEE这个云端平台彻底改变了我的工作方式。GEE最大的优势在于它集成了PB级别的遥感数据包括我们需要的MODIS地表温度产品而且不需要下载整个数据集到本地就能进行处理。MODIS MOD11A1.061这个数据集我用了三年多它的1000米分辨率对于区域尺度的地表温度研究非常合适。相比传统方法需要先下载几十GB的原始数据在GEE里可以直接在线处理最后只下载我们需要的计算结果这对硬盘空间有限的研究者简直是福音。我去年做黄河流域的温度分析时传统方法需要两周的数据准备时间在GEE上只用了两天就完成了。2. 准备GEE工作环境2.1 注册与基础设置开始前你需要一个Google账号来访问GEEhttps://earthengine.google.com/。注册开发者账号的过程很简单通常1-2个工作日就能通过审核。第一次登录后我建议先花半小时熟悉界面布局。左侧是脚本管理器中间是地图显示区右侧是代码编辑器和输出窗口。重要提示在Reader模式下你是无法运行代码的记得点击右上角切换到Writer模式。我刚开始时就因为这个卡了半天还以为是代码写错了。2.2 加载研究区域以郑州市为例我们有几种加载研究区边界的方法// 方法1手动绘制 var roi ee.Geometry.Rectangle([112.8, 34.5, 114.5, 35.5]); // 方法2上传Shapefile var roi ee.FeatureCollection(users/yourname/zhengzhou_boundary); // 方法3使用行政边界数据集 var roi ee.FeatureCollection(FAO/GAUL/2015/level2) .filter(ee.Filter.eq(ADM2_NAME, Zhengzhou));我通常推荐第三种方法因为行政边界更精确。不过要注意GAUL数据集中的地名是英文的郑州市要写Zhengzhou。3. 批量下载MODIS地表温度数据3.1 构建数据筛选代码核心代码其实就几行但每个参数都很关键var dataset ee.ImageCollection(MODIS/061/MOD11A1) .filter(ee.Filter.date(2021-01-01, 2021-12-31)) // 时间筛选 .filterBounds(roi) // 空间筛选 .select(LST_Day_1km); // 选择白天温度波段 // 计算年平均温度 var annualMean dataset.mean().clip(roi);这里有几个我踩过的坑MOD11A1包含多个波段我们只需要LST_Day_1km白天温度数据集版本要用061这是目前最稳定的版本clip操作要在最后进行提前clip会影响统计计算3.2 可视化与质量检查在下载前一定要先可视化检查数据var visParams { min: 13000.0, max: 16500.0, palette: [040274, 040281, 0502a3, 0502b8, 0502ce, 0502e6, 0602ff, 235cb1, 307ef3, 269db1, 30c8e2, 32d3ef, 3be285, 3ff38f, 86e26f, 3ae237, b5e22e, d6e21f, fff705, ffd611, ffb613, ff8b13, ff6e08, ff500d, ff0000, de0101, c21301, a71001, 911003] }; Map.addLayer(annualMean, visParams, Annual Mean LST); Map.centerObject(roi, 8);如果图像出现大面积空白可能是云覆盖太严重需要考虑使用质量控制波段进行过滤。4. 数据导出与本地处理4.1 配置导出任务GEE允许直接导出到Google DriveExport.image.toDrive({ image: annualMean, description: Zhengzhou_LST_2021, folder: GEE_Exports, region: roi, scale: 1000, // 与MODIS分辨率一致 crs: EPSG:4326, // WGS84坐标系 maxPixels: 1e13 });点击运行后记得在Tasks面板中手动启动导出任务。根据我的经验郑州市范围的导出大约需要10-30分钟。4.2 单位换算处理导出的数据需要两步处理乘以0.02的缩放系数减去273.15将开尔文转为摄氏度在ArcGIS中可以用栅格计算器(LST_Day_1km.tif * 0.02) - 273.15或者在QGIS中使用Raster Calculator(LST_Day_1km1 * 0.02) - 273.15我建议保存为浮点型GeoTIFF这样能保留小数精度。如果后续要做统计分析记得检查一下NoData值的处理情况。5. 常见问题与优化技巧5.1 处理超大面积区域当研究区很大时比如全省范围可能会遇到内存不足的问题。我的解决方案是分块处理用ee.FeatureCollection的map函数分块处理降低分辨率临时改为2000或4000米分辨率进行初步分析使用reduceResolution对结果进行降采样// 分块处理示例 var grid ee.FeatureCollection(users/yourname/grid_100km); var lstCollection grid.map(function(feature){ return dataset.mean().clip(feature.geometry()); });5.2 时间序列分析技巧如果需要多年数据可以封装成函数function getAnnualLST(year) { var start ee.Date.fromYMD(year, 1, 1); var end start.advance(1, year); return ee.ImageCollection(MODIS/061/MOD11A1) .filterDate(start, end) .select(LST_Day_1km) .mean() .set(year, year); } // 生成2001-2021年序列 var years ee.List.sequence(2001, 2021); var timeSeries ee.ImageCollection(years.map(getAnnualLST));这样就能一次性处理21年的数据效率比单独处理每年高得多。5.3 质量控制进阶MOD11A1自带质量控制(QC)波段可以用来过滤低质量像元var qcFiltered dataset.map(function(image) { var qc image.select(QC_Day); var mask qc.bitwiseAnd(0x3).eq(0); // 只保留最高质量数据 return image.updateMask(mask); });这个技巧在城市热岛效应研究中特别有用因为城市区域经常受云污染影响。