GEE批量下载与处理全球地表温度数据实战
1. 从零开始理解GEE与地表温度数据第一次接触Google Earth Engine简称GEE时我被它强大的云端计算能力震撼到了。这个由谷歌开发的平台存储了海量的遥感数据而且不需要你把数据下载到本地就能直接处理。对于研究地表温度变化的环境学者来说这简直是天赐良物。MOD11A1.061数据集是GEE平台上最常用的地表温度数据之一它来自NASA的MODIS卫星空间分辨率为1000米。虽然听起来分辨率不算高但对于城市热岛效应这样的大尺度研究已经足够。我刚开始用的时候最头疼的就是数据单位问题——原始数据是以开尔文K为单位的而且还有个0.02的缩放系数需要手动转换才能得到我们熟悉的摄氏度。2. 准备GEE开发环境2.1 注册与基础配置要使用GEE首先得有个谷歌账号。注册过程很简单但有个小坑要注意有时候国内访问不太稳定建议在工作日的上午操作成功率会高很多。注册成功后打开GEE的代码编辑器https://code.earthengine.google.com/你会看到一个网页版的IDE界面。第一次使用时建议先浏览一下左侧的Docs标签页这里有所有可用数据集的文档。搜索MOD11A1就能找到我们要用的地表温度数据集。我习惯先看看数据集的元数据了解每个波段的含义这能避免后续处理时走弯路。2.2 理解关键参数MOD11A1.061数据集有几个关键参数需要注意LST_Day_1km白天的地表温度LST_Night_1km夜晚的地表温度QC_Day和QC_Night质量控制波段用来筛选高质量数据在实际操作中我强烈建议先查看QC波段过滤掉质量差的数据。很多新手会忽略这一步导致结果出现异常值。质量控制的具体方法我们会在后面详细讲解。3. 编写数据筛选与下载代码3.1 基础数据筛选下面这段代码是我在实际项目中反复优化过的版本比原始文章中的更完善// 定义研究区域 - 以郑州市为例 var roi ee.FeatureCollection(users/your_username/zhengzhou_boundary); // 加载MOD11A1数据集 var dataset ee.ImageCollection(MODIS/061/MOD11A1) .filterDate(2021-01-01, 2021-12-31) // 时间过滤 .filterBounds(roi) // 空间过滤 .select(LST_Day_1km); // 选择白天温度波段 // 质量控制过滤 var dataset dataset.map(function(image) { var qc image.select(QC_Day); var mask qc.bitwiseAnd(0b11).eq(0); // 只保留最高质量数据 return image.updateMask(mask); }); // 计算年平均温度 var meanTemp dataset.mean().clip(roi);这段代码有几个改进点增加了质量控制过滤确保只使用高质量数据使用了更规范的空间过滤方法添加了区域裁剪(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.centerObject(roi, 8); Map.addLayer(meanTemp, visParams, Mean Temperature 2021);如果地图显示的温度分布符合预期比如城市中心温度较高就可以继续下载步骤了。4. 批量下载与格式转换4.1 配置下载任务GEE的下载功能藏在不太显眼的位置。在代码编辑器中找到右上角的Tasks选项卡点击后会弹出一个面板。这里可以创建导出任务。我推荐使用GeoTIFF格式下载因为它能保留所有元数据信息。下面是完整的导出代码// 配置导出参数 Export.image.toDrive({ image: meanTemp, description: Zhengzhou_LST_2021, folder: GEE_Exports, region: roi, scale: 1000, // MODIS分辨率 crs: EPSG:4326, // WGS84坐标系 maxPixels: 1e13 });点击运行后需要在Tasks面板中手动启动导出任务。一个小技巧如果数据量很大可以分月份导出这样成功率更高。4.2 单位转换实战下载的数据是开尔文温度需要转换为摄氏度。原始文章提到了转换公式但实际操作中还有几个细节需要注意在ArcGIS中可以使用栅格计算器(Raster Calculator)进行单位转换。具体步骤打开下载的GeoTIFF文件打开Spatial Analyst工具中的栅格计算器输入公式(LST_Day_1km.tif * 0.02) - 273.15设置输出文件名和位置如果使用Python处理代码会更简洁import rasterio import numpy as np with rasterio.open(LST_Day_1km.tif) as src: data src.read(1) meta src.meta # 单位转换 data_c data * 0.02 - 273.15 # 保存结果 with rasterio.open(LST_Day_1km_C.tif, w, **meta) as dst: dst.write(data_c, 1)5. 进阶技巧与常见问题排查5.1 处理大数据量时的优化策略当研究区域较大或时间跨度较长时可能会遇到GEE的内存限制问题。我总结了几种解决方法分块处理将研究区域划分为多个小块分别导出后再合并时间分段按季度或月份导出数据减少单次处理的数据量降低分辨率对于大尺度研究可以先用resample()方法降低分辨率// 示例降低分辨率到5000米 var lowRes meanTemp.resample(bilinear).reproject({ crs: EPSG:4326, scale: 5000 });5.2 质量控制深度解析MOD11A1的质量控制波段(QC)使用位掩码(bitmask)存储信息。理解这一点对数据筛选至关重要第0-1位数据质量00最高质量01中等质量10较低质量11质量差第2位云覆盖情况第3位是否经过地形校正更严格的质量过滤可以这样写var dataset dataset.map(function(image) { var qc image.select(QC_Day); var qualityMask qc.bitwiseAnd(0b11).eq(0); // 最高质量 var cloudMask qc.bitwiseAnd(0b100).eq(0); // 无云 return image.updateMask(qualityMask.and(cloudMask)); });6. 数据应用实例城市热岛效应分析有了温度数据后最常见的应用就是分析城市热岛效应。这里分享一个简单的分析方法城乡温度对比在城市中心和郊区各选几个采样点比较温度差异时间序列分析比较不同年份的温度数据观察变化趋势土地利用关联叠加土地覆盖数据分析不同地表类型的温度特征在ArcGIS中可以使用分区统计(Zonal Statistics)工具计算不同行政区的平均温度加载行政区划矢量数据和温度栅格数据打开Spatial Analyst工具中的分区统计选择行政区划作为分区字段选择温度栅格作为输入统计类型选择MEAN这样就能得到每个区的平均温度方便制作热岛强度分布图。7. 其他相关数据获取建议除了地表温度城市热岛研究通常还需要辅助数据。GEE上几个常用的数据集土地利用数据MCD12Q1.006提供了年度全球土地覆盖数据NDVI数据MOD13A1.006植被指数数据反映绿化情况夜间灯光数据DMSP和VIIRS数据可以反映城市发展程度获取这些数据的代码结构与温度数据类似主要区别在于数据集名称和波段选择。例如获取NDVI数据的代码var ndvi ee.ImageCollection(MODIS/006/MOD13A1) .filterDate(2021-01-01, 2021-12-31) .select(NDVI) .mean();把这些数据叠加分析能更全面地理解城市热岛效应的形成机制。