基于 GEE 的 MODIS 昼夜地表温度数据可视化与导出全流程解决方案
目录
一、研究区域(ROI)设置与地图初始化
(一)研究区域定义(ROI)
(二)地图定位与 ROI 可视化
二、时间范围设置(数据时间筛选依据)
三、MODIS LST 数据读取与预处理(核心步骤)
(一)数据集选择与筛选
(二)白天温度数据处理(从原始数据到摄氏度)
(三)夜间温度数据处理(与白天逻辑一致)
(四)昼夜平均温度计算(衍生指标)
四、可视化参数设置(地图显示优化)
(一)白天温度可视化(viz_day)
(二)夜间温度可视化(viz_night)
(三)平均温度可视化(viz_mean)
五、地图图层添加与显示控制
六、数据导出到 Google Drive(结果保存)
(一)关键参数深度解析
(二)导出操作流程
七、运行结果
若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!
本代码基于Google Earth Engine(GEE) 平台编写,使用 GEE 的 JavaScript API 实现功能。GEE 是谷歌推出的云平台,集成了海量遥感数据(如 MODIS、Landsat 等)和地理空间分析工具,无需本地下载数据即可完成大规模空间数据处理。本代码的核心应用场景是地表温度(LST)时空分析,适用于农业干旱监测、城市热岛效应研究、生态环境评估等领域,针对特定区域的月度昼夜温度进行提取、计算、可视化与导出。
一、研究区域(ROI)设置与地图初始化
var roi = table;
// var roi = geometry; // 手绘ROI时替换
Map.centerObject(roi, 9);
Map.addLayer(roi, { color: 'red' }, 'ROI');
(一)研究区域定义(ROI)
var roi = table
:table
是 GEE 中的 “矢量表格数据” 变量,需提前导入(如从本地上传 Shapefile、KML 等矢量边界文件,或从 GEE 内置矢量数据集(如国家 / 省界)中筛选),代表研究的空间范围(如某城市、某流域)。// var roi = geometry
:注释行中的geometry
是 GEE 中 “手绘几何图形” 的变量,若用户在 GEE 地图界面通过 “绘图工具” 手动绘制矩形、多边形等区域,需删除第一行var roi = table
的注释,同时为该行添加注释,确保roi
指向手绘区域。- 技术细节:ROI 的类型是
ee.Geometry
(几何对象)或ee.FeatureCollection
(要素集合),后续所有数据处理(筛选、裁剪)均基于该范围,避免无关区域数据干扰。
(二)地图定位与 ROI 可视化
Map.centerObject(roi, 9)
:Map
是 GEE 的地图对象,用于控制地图显示;centerObject(roi, 9)
:将地图视角自动定位到 ROI 的几何中心,第二个参数 “9” 是地图缩放级别(GEE 缩放级别范围为 0-24,0 代表全球视角,24 代表米级细节,9 约对应 “区域级” 视角,可根据 ROI 大小调整,如小区域设 12-15,大区域设 6-8)。
Map.addLayer(roi, { color: 'red' }, 'ROI')
:addLayer
是地图添加图层的核心函数,参数依次为 “待添加数据”“样式配置”“图层名称”;{ color: 'red' }
:设置 ROI 的显示颜色为红色(可替换为#ff0000
十六进制色值或'blue'
等英文色名);'ROI'
:图层在地图图例中的名称,便于用户识别和切换。
二、时间范围设置(数据时间筛选依据)
var startDate = '2025-07-01';
var endDate = '2025-07-31';
- 格式要求:GEE 中日期需采用
'YYYY-MM-DD'
(年 - 月 - 日)字符串格式,若写成'2025/07/01'
会导致筛选失败。 - 时间筛选逻辑:后续读取 MODIS 数据时,会仅保留 “拍摄时间在
startDate
(含)到endDate
(不含)之间” 的影像 —— 即本代码提取 2025 年 7 月 1 日至 7 月 31 日的完整月度数据(注:GEE 日期筛选为 “左闭右开”,endDate
设为'2025-08-01'
可实现相同效果)。 - 应用场景:若需分析季节温度变化,可将
startDate
设为'2025-06-01'
、endDate
设为'2025-08-31'
(夏季);若需逐年对比,可固定月份(如 7 月)、修改年份(如'2024-07-01'
)。
三、MODIS LST 数据读取与预处理(核心步骤)
(一)数据集选择与筛选
var modis = ee.ImageCollection("MODIS/061/MOD11A2").filterDate(startDate, endDate).filterBounds(roi);
-
数据集说明:
"MODIS/061/MOD11A2"
:GEE 中的 MODIS 地表温度数据集 ID,其中 “061” 代表数据版本(V6.1,是当前(截至 2024 年 5 月)的最新稳定版),“MOD11A2” 是产品名称 —— 该产品是8 天合成的 1 公里分辨率昼夜地表温度数据(即每 8 天生成 1 幅影像,避免单天云污染导致的数据缺失)。- 该数据集包含多个波段,核心波段为
LST_Day_1km
(白天地表温度)和LST_Night_1km
(夜间地表温度),此外还有质量控制波段(如QC_Day
)用于筛选有效数据(本代码未涉及质量控制,若需提升精度,可添加filter
筛选高质量像元)。
-
双重筛选逻辑:
filterDate(startDate, endDate)
:按时间范围筛选,仅保留 7 月内的影像(2025 年 7 月共 31 天,会筛选出 4 幅影像:7 月 1-8 日、9-16 日、17-24 日、25-31 日);filterBounds(roi)
:按空间范围筛选,仅保留 “影像覆盖范围与 ROI 有交集” 的影像,剔除完全不包含研究区域的冗余数据。
(二)白天温度数据处理(从原始数据到摄氏度)
var lst_day = modis.select('LST_Day_1km').mean().multiply(0.02).subtract(273.15).rename('LST_Day_C');
该段代码是数据预处理的核心,每一步均针对 MODIS 数据的格式特点设计,具体解析如下:
步骤 | 代码片段 | 功能与原理 | 技术细节 |
---|---|---|---|
1 | select('LST_Day_1km') | 从影像集合中提取 “白天温度波段” | 若需同时处理质量控制波段,可写为select(['LST_Day_1km', 'QC_Day']) |
2 | .mean() | 计算时间范围内所有影像的平均值 | 将 7 月的 4 幅白天温度影像取平均,得到 “7 月白天平均温度”,消除单幅影像的云污染或异常值影响 |
3 | .multiply(0.02) | 原始数据缩放还原 | MODIS LST 原始数据以 “整数” 形式存储(为减少存储空间),真实值 = 原始值 ×0.02(该系数是 MODIS 数据手册规定的固定值) |
4 | .subtract(273.15) | 单位转换(开尔文→摄氏度) | MODIS 原始温度单位为 “开尔文(K)”,摄氏度(℃)= 开尔文 - 273.15,转换后的数据更符合实际应用习惯 |
5 | .rename('LST_Day_C') | 波段重命名 | 命名格式为 “数据类型_时间_单位”,LST_Day_C 代表 “白天地表温度(摄氏度)”,便于后续识别和导出 |
(三)夜间温度数据处理(与白天逻辑一致)
var lst_night = modis.select('LST_Night_1km').mean().multiply(0.02).subtract(273.15).rename('LST_Night_C');
唯一差异是select('LST_Night_1km')
:提取 “夜间温度波段”,其余步骤(求平均、缩放、单位转换、重命名)与白天温度完全一致,最终得到 “7 月夜间平均温度(摄氏度)” 数据。
(四)昼夜平均温度计算(衍生指标)
var lst_mean = lst_day.add(lst_night).divide(2).rename('LST_Mean_C');
- 计算逻辑:基于 “白天平均温度” 和 “夜间平均温度”,通过逐像元运算得到 “昼夜平均温度”—— 即每个空间像元的温度值 =(该像元白天温度 + 该像元夜间温度)÷2。
- GEE 运算特性:GEE 的影像运算(
add
/divide
)是 “逐像元并行计算”,无需循环遍历每个像元,效率极高,适合大规模区域(如全国、全球)的数据处理。 - 应用价值:昼夜平均温度比单一白天 / 夜间温度更能反映区域整体热状况,是农业作物生长、生态系统呼吸分析的常用指标。
四、可视化参数设置(地图显示优化)
为不同温度数据设计差异化的可视化方案,核心是 “匹配数据取值范围 + 选择辨识度高的颜色渐变”,避免因温度范围不匹配导致的 “一片空白” 或 “颜色溢出” 问题。
(一)白天温度可视化(viz_day)
var viz_day = {min: 15, // 最低显示温度(℃)max: 55, // 最高显示温度(℃)palette: ['#001aff', '#00bfff', '#7fff00', '#ffff00', '#ff7f00', '#ff0000'] // 颜色渐变方案
};
- 温度范围设计依据:7 月为夏季,多数地区白天地表温度在 15-55℃之间(如温带地区约 15-35℃,热带沙漠地区可达 50℃以上),设置
min=15
和max=55
可覆盖绝大多数场景;若研究区域为高纬度地区,可将min
下调至 10℃。 - 颜色方案逻辑:采用 “冷色→暖色→暖色” 的渐变,对应温度 “低→中→高”:
#001aff
(深蓝色)→#00bfff
(浅蓝色):15-25℃(低温区,如高海拔或高纬度地区);#7fff00
(浅绿色)→#ffff00
(黄色):25-35℃(中温区,如温带农田);#ff7f00
(橙色)→#ff0000
(红色):35-55℃(高温区,如城市建成区、沙漠)。
(二)夜间温度可视化(viz_night)
var viz_night = {min: 5,max: 35,palette: ['#001a66', '#0073e6', '#66ccff', '#ffff99', '#ff9933', '#cc0000']
};
- 温度范围调整:夜间无太阳辐射,温度普遍低于白天,故
min=5
、max=35
(如热带地区夜间约 20-35℃,温带地区约 5-20℃,寒带地区可能低于 5℃,低于 5℃的像元会显示为最浅的冷色)。 - 颜色方案调整:采用 “更深的冷色→更暗的暖色”,与白天形成区分:
#001a66
(深海军蓝)→#0073e6
(中蓝色):5-15℃(夜间低温区);#66ccff
(浅蓝)→#ffff99
(浅黄):15-25℃(夜间中温区);#ff9933
(深橙)→#cc0000
(深红):25-35℃(夜间高温区,如城市热岛中心)。
(三)平均温度可视化(viz_mean)
var viz_mean = {min: 10,max: 45,palette: ['#003366', '#0099cc', '#66ff66', '#ffff66', '#ff9900', '#ff0000']
};
- 温度范围折中:昼夜平均温度介于白天和夜间之间,故
min=10
、max=45
,覆盖绝大多数场景; - 颜色方案平衡:冷色端比白天深、比夜间浅,暖色端与白天一致,确保视觉上与白天 / 夜间图层有区分但不突兀。
五、地图图层添加与显示控制
Map.addLayer(lst_day.clip(roi), viz_day, 'LST Daytime (°C)', true);
Map.addLayer(lst_night.clip(roi), viz_night, 'LST Nighttime (°C)', false);
Map.addLayer(lst_mean.clip(roi), viz_mean, 'LST Mean (°C)', false);
Map.addLayer(image, visParams, name, shown)
的 4 个参数功能如下:
参数 | 示例 | 功能 |
---|---|---|
image | lst_day.clip(roi) | 待显示的影像数据,clip(roi) 是 “裁剪” 操作 —— 仅保留 ROI 范围内的像元,ROI 外的像元设为 “无数据”,避免无关区域干扰视觉 |
visParams | viz_day | 可视化参数,即上文定义的viz_day /viz_night /viz_mean ,控制影像的颜色和显示范围 |
name | 'LST Daytime (°C)' | 图层名称,显示在 GEE 地图界面的 “图层列表” 中,需包含数据类型和单位,便于用户识别 |
shown | true /false | 图层默认显示状态:true 代表加载代码后自动显示该图层,false 代表默认隐藏,需用户手动在图层列表中勾选才能显示 |
默认显示lst_day
(白天温度),隐藏lst_night
(夜间)和lst_mean
(平均):原因是白天温度的空间差异更明显(如城市热岛、沙漠与农田的对比),适合作为 “初始查看图层”;用户可根据需求切换显示,例如需分析城市热岛的昼夜差异时,可同时勾选白天和夜间图层,通过 “透明度调整”(GEE 图层列表中可设置)叠加对比。
六、数据导出到 Google Drive(结果保存)
将处理后的温度数据导出为GeoTIFF 格式(遥感数据标准格式,可在 ArcGIS、QGIS 等软件中进一步分析),核心是配置导出参数,确保数据完整性和可用性。以下以白天温度导出为例,夜间和平均温度的导出逻辑完全一致,仅变量名不同。
Export.image.toDrive({image: lst_day.clip(roi), // 待导出影像(裁剪后的白天温度数据)description: 'LST_Day_' + startDate + '_to_' + endDate, // 导出任务描述folder: 'GEE_LST', // 目标文件夹(需提前在Google Drive中创建)fileNamePrefix: 'LST_Day_' + startDate + '_' + endDate, // 导出文件前缀region: roi, // 导出区域(与ROI一致)scale: 1000, // 导出分辨率(米)maxPixels: 1e13, // 最大像素数量限制crs: 'EPSG:4326' // 坐标系
});
(一)关键参数深度解析
image: lst_day.clip(roi)
:必须与显示图层一致,确保导出的是 “裁剪后的 ROI 范围内数据”,避免导出全图导致文件过大。description
:显示在 GEE “任务列表” 中的任务名称,需包含数据类型和时间范围,便于区分多个导出任务(如同时导出 7 月和 8 月的数据,可通过description
快速识别)。folder: 'GEE_LST'
:Google Drive 中的目标文件夹名称,需提前在 Google Drive 中手动创建该文件夹(路径:Google Drive → 新建 → 文件夹 → 命名为GEE_LST
),否则导出会失败。fileNamePrefix
:导出文件的名称前缀,最终生成的文件名格式为fileNamePrefix.tif
(如LST_Day_2025-07-01_2025-07-31.tif
),包含数据类型和时间,便于后续管理。region: roi
:定义导出的空间范围,需与clip(roi)
的范围一致,确保导出数据的空间完整性。scale: 1000
:导出分辨率(单位:米),需与原始 MODIS 数据的分辨率一致(MOD11A2 原始分辨率为 1 公里,即 1000 米),若设为 500,会导致数据 “重采样”(精度无提升但文件变大);若设为 2000,会导致精度降低。maxPixels: 1e13
:GEE 默认限制导出影像的最大像素数量为 1e8(约 1000×1000 像元),若 ROI 范围较大(如省级、国家级),需提高该值(1e13 足够覆盖全球范围),否则会提示 “像素数量超过限制” 并失败。crs: 'EPSG:4326'
:导出数据的坐标系,EPSG:4326
是 “WGS84 坐标系”(全球通用的地理坐标系,经纬度单位),若需用于投影坐标系(如 UTM),可替换为'EPSG:32649'
(UTM 49N,根据研究区域的 UTM 带调整)。
(二)导出操作流程
代码运行后,需在 GEE 界面完成以下步骤:
- 点击右上角 “Tasks”(任务)按钮,找到 3 个导出任务(分别对应白天、夜间、平均温度);
- 对每个任务点击 “Run”(运行),在弹出的对话框中确认参数(无需修改),点击 “Run”;
- 等待导出完成(时间取决于 ROI 大小,小区域约 1-5 分钟,大区域约 10-30 分钟);
- 导出完成后,在 Google Drive 的
GEE_LST
文件夹中找到 GeoTIFF 文件,下载到本地即可使用。
七、运行结果





若觉得代码对您的研究 / 项目有帮助,欢迎点击打赏支持!需要完整代码的朋友,打赏后可在后台私信(复制文章标题发给我),我会尽快发您完整可运行代码,感谢支持!