别再手动处理了!用GEE+Python脚本批量下载MODIS地表温度数据(MOD11A1.061)

张开发
2026/4/19 1:56:12 15 分钟阅读

分享文章

别再手动处理了!用GEE+Python脚本批量下载MODIS地表温度数据(MOD11A1.061)
基于GEE与Python的MODIS地表温度数据自动化处理全流程科研工作者在处理MODIS地表温度数据时常常面临批量下载、多时相数据拼接和单位换算等繁琐操作。本文将介绍如何利用Google Earth Engine(GEE)和Python构建一套完整的自动化工作流从数据获取到最终分析应用实现高效、精准的地表温度数据处理。1. GEE数据获取基础与优化策略MODIS MOD11A1.061数据集作为地表温度研究的重要数据源提供了全球覆盖、每日更新的观测结果。传统手动下载方式不仅效率低下还容易出错。通过GEE平台我们可以直接访问这些数据无需下载整个数据集到本地。核心数据集参数解析空间分辨率1000米时间分辨率每日可用波段LST_Day_1km(日间地表温度)、LST_Night_1km(夜间地表温度)数据单位开尔文(K)需乘以0.02的缩放系数# 基础GEE数据获取代码示例 import ee ee.Initialize() # 定义研究区域(以郑州市为例) roi ee.Geometry.Rectangle([112.9, 34.6, 114.5, 35.2]) # 获取MOD11A1.061数据集 dataset ee.ImageCollection(MODIS/061/MOD11A1) \ .filterDate(2021-01-01, 2021-12-31) \ .filterBounds(roi) \ .select(LST_Day_1km)提示首次使用GEE需要注册账号并完成身份验证Python环境下需安装earthengine-api包并运行ee.Initialize()进行初始化。2. 高效批量下载策略实现单次下载少量数据尚可手动操作但当需要长时间序列或多区域数据时自动化批量下载成为必需。我们通过Python脚本实现这一过程主要解决三个关键问题分时段下载避免单次请求数据量过大导致失败自动重试机制处理网络不稳定情况任务状态监控实时跟踪下载进度# 批量下载函数实现 def batch_download_lst_data(start_date, end_date, roi, interval30, output_diroutput): 参数: start_date: str, 开始日期 YYYY-MM-DD end_date: str, 结束日期 YYYY-MM-DD roi: ee.Geometry, 研究区域 interval: int, 分批下载的天数间隔 output_dir: str, 输出目录 current_date ee.Date(start_date) end_date ee.Date(end_date) while current_date.millis().lt(end_date.millis()): next_date current_date.advance(interval, day) batch_end ee.Date(ee.Algorithms.Min(next_date, end_date)) # 创建该批次的数据集 batch_collection ee.ImageCollection(MODIS/061/MOD11A1) \ .filterDate(current_date, batch_end) \ .filterBounds(roi) \ .select(LST_Day_1km) # 创建下载任务 task ee.batch.Export.image.toDrive( imagebatch_collection.mean(), descriptionfLST_{current_date.format(YYYYMMdd)}_{batch_end.format(YYYYMMdd)}, folderoutput_dir, scale1000, regionroi, fileFormatGeoTIFF ) task.start() # 更新日期 current_date batch_end批量下载优化技巧根据网络状况调整interval参数(建议30-60天)添加任务状态检查逻辑避免重复提交实现自动重试机制提高成功率添加邮件通知功能及时获知任务完成情况3. 数据处理与单位转换自动化下载后的数据需要进行单位转换(K→℃)和格式整理传统ArcGIS手动操作方式效率低下。我们通过Python实现全自动处理流程标准转换公式℃ (K × 0.02) - 273.15# 自动化处理脚本 import os import rasterio import numpy as np def process_lst_files(input_dir, output_dir): 处理下载的LST数据进行单位转换和重命名 if not os.path.exists(output_dir): os.makedirs(output_dir) for filename in os.listdir(input_dir): if filename.endswith(.tif): input_path os.path.join(input_dir, filename) output_path os.path.join(output_dir, fprocessed_{filename}) with rasterio.open(input_path) as src: # 读取数据并应用转换公式 data src.read(1) data data * 0.02 - 273.15 # 更新元数据 profile src.profile profile.update(dtyperasterio.float32) # 写入新文件 with rasterio.open(output_path, w, **profile) as dst: dst.write(data.astype(rasterio.float32), 1)处理流程优化建议添加异常值处理(-9999等)实现并行处理加速大批量文件转换自动生成元数据记录处理历史添加质量控制步骤验证转换结果4. 高级应用与数据分析技巧基础数据处理完成后科研人员通常需要进行更深入的分析。以下是几种常见的高级应用场景4.1 时间序列分析# 时间序列分析示例 import pandas as pd import matplotlib.pyplot as plt def analyze_time_series(file_dir): 分析处理后的LST数据时间序列 dates [] mean_temps [] for filename in sorted(os.listdir(file_dir)): if filename.startswith(processed_) and filename.endswith(.tif): date_str filename.split(_)[2][:8] # 从文件名提取日期 date pd.to_datetime(date_str, format%Y%m%d) with rasterio.open(os.path.join(file_dir, filename)) as src: data src.read(1) valid_data data[data -50] # 过滤无效值 mean_temp np.nanmean(valid_data) dates.append(date) mean_temps.append(mean_temp) # 创建DataFrame并绘图 df pd.DataFrame({Date: dates, Temperature: mean_temps}) df.set_index(Date, inplaceTrue) plt.figure(figsize(12, 6)) df[Temperature].plot() plt.title(Daily Land Surface Temperature Time Series) plt.ylabel(Temperature (°C)) plt.grid(True) plt.show()4.2 空间格局分析# 空间分析示例 import geopandas as gpd from rasterstats import zonal_stats def spatial_analysis(lst_file, boundary_file): 基于行政区划的空间统计分析 # 读取行政区划数据 boundaries gpd.read_file(boundary_file) # 计算各区域统计量 stats zonal_stats(boundary_file, lst_file, stats[mean, min, max, std]) # 将结果添加到GeoDataFrame for i, stat in enumerate(stats): for key, value in stat.items(): boundaries.loc[i, key] value return boundaries4.3 热岛效应评估# 城市热岛效应评估 def urban_heat_island(urban_lst, rural_lst): 计算城市热岛强度 with rasterio.open(urban_lst) as src: urban_data src.read(1) urban_mean np.nanmean(urban_data[urban_data -50]) with rasterio.open(rural_lst) as src: rural_data src.read(1) rural_mean np.nanmean(rural_data[rural_data -50]) uhi_intensity urban_mean - rural_mean return uhi_intensity5. 工作流整合与自动化调度将上述各环节整合为完整工作流实现从数据获取到最终分析的全自动化# 完整工作流示例 def complete_workflow(start_date, end_date, roi, output_base_dir): 完整的地表温度数据处理工作流 # 1. 创建目录结构 raw_dir os.path.join(output_base_dir, raw_data) processed_dir os.path.join(output_base_dir, processed_data) results_dir os.path.join(output_base_dir, analysis_results) for dir_path in [raw_dir, processed_dir, results_dir]: if not os.path.exists(dir_path): os.makedirs(dir_path) # 2. 批量下载数据 print(Starting data download...) batch_download_lst_data(start_date, end_date, roi, output_dirLST_raw_data) # 3. 处理下载的数据 print(Processing downloaded data...) process_lst_files(raw_dir, processed_dir) # 4. 执行分析 print(Performing time series analysis...) analyze_time_series(processed_dir) # 5. 空间分析(示例) if os.path.exists(boundary.shp): print(Performing spatial analysis...) stats spatial_analysis( os.path.join(processed_dir, processed_LST_20210101_20210131.tif), boundary.shp ) stats.to_file(os.path.join(results_dir, spatial_stats.shp)) print(Workflow completed successfully!)自动化调度进阶方案使用Apache Airflow等工具实现定期自动运行添加错误处理与报警机制集成到Jupyter Notebook中实现交互式分析开发Web界面简化操作流程6. 性能优化与大规模处理当处理大区域或长时间序列数据时性能成为关键考量。以下是几种优化策略6.1 并行处理实现from multiprocessing import Pool def parallel_process_files(input_dir, output_dir, num_processes4): 并行处理多个LST文件 files [f for f in os.listdir(input_dir) if f.endswith(.tif)] def process_file(filename): input_path os.path.join(input_dir, filename) output_path os.path.join(output_dir, fprocessed_{filename}) with rasterio.open(input_path) as src: data src.read(1) data data * 0.02 - 273.15 profile src.profile profile.update(dtyperasterio.float32) with rasterio.open(output_path, w, **profile) as dst: dst.write(data.astype(rasterio.float32), 1) with Pool(num_processes) as p: p.map(process_file, files)6.2 内存优化技巧使用分块处理(chunking)大文件采用内存映射(memory mapping)技术优化数据类型减少内存占用及时释放不再需要的数据6.3 GEE服务器端预处理# 服务器端预处理示例 def preprocess_on_server(collection, roi): 在GEE服务器端执行预处理减少下载数据量 # 计算年度平均温度 annual_mean collection.mean() # 裁剪到研究区域 clipped annual_mean.clip(roi) # 直接应用单位转换 lst_c clipped.expression( (b(LST_Day_1km) * 0.02) - 273.15, {LST_Day_1km: clipped.select(LST_Day_1km)} ) return lst_c7. 质量控制与验证确保数据质量是科研工作的关键环节以下是常用的质量控制方法7.1 数据质量评估指标指标计算方法可接受范围有效数据比例有效像元数/总像元数80%温度合理范围最小值、最大值-50℃~60℃空间连续性变异系数(标准差/均值)0.3时间一致性相邻时段变化幅度10℃7.2 验证方法实现# 数据质量验证函数 def validate_lst_data(lst_file): 验证LST数据质量 with rasterio.open(lst_file) as src: data src.read(1) # 计算有效数据比例 valid_pixels np.sum(data -50) total_pixels data.size valid_ratio valid_pixels / total_pixels # 计算温度范围 valid_data data[data -50] temp_range (np.nanmin(valid_data), np.nanmax(valid_data)) # 计算变异系数 cv np.nanstd(valid_data) / np.nanmean(valid_data) return { valid_ratio: valid_ratio, temperature_range: temp_range, coefficient_of_variation: cv }7.3 交叉验证策略与气象站观测数据对比与其他卫星产品(如Landsat LST)比较检查季节变化模式合理性验证空间分布是否符合预期8. 实际应用案例分享在实际项目中应用这套自动化工作流我们处理了华北地区2010-2020年的地表温度数据发现了几个有价值的应用点城市扩张的热环境效应通过对比不同年份的温度数据清晰展示了城市化进程对地表温度的影响。处理过程中自动化脚本节省了约80%的手动操作时间。极端高温事件分析2018年夏季的热浪事件在数据中表现明显自动化流程使我们能够快速提取并分析这一事件的空间范围和强度。植被降温效应评估将地表温度数据与NDVI植被指数结合量化了不同植被类型的降温效果为城市规划提供了科学依据。# 实际案例中的自定义函数 def analyze_urban_expansion(temp_files, urban_mask, years): 分析城市扩张对地表温度的影响 results [] for file, year in zip(temp_files, years): with rasterio.open(file) as src: data src.read(1) urban_temp np.nanmean(data[urban_mask]) rural_temp np.nanmean(data[~urban_mask]) results.append({ year: year, urban_temp: urban_temp, rural_temp: rural_temp, uhi_intensity: urban_temp - rural_temp }) return pd.DataFrame(results)这套自动化处理方法不仅提高了科研效率还确保了数据处理的一致性和可重复性为长期环境监测研究奠定了坚实基础。

更多文章