使用Google Earth Engine下载Sentinel-2影像数据

本文将详细介绍如何使用Google Earth Engine(GEE)下载指定区域和时间的Sentinel-2卫星影像数据,并重点解析影像合成的不同方案。

代码概述

本代码实现了以下功能:

  • 设置感兴趣区域(ROI)
  • 定义影像导出函数
  • 生成指定时间范围的月度列表
  • 按月获取并处理Sentinel-2影像
  • 导出处理后的影像数据

代码详细解读

1. 设置感兴趣区域(ROI)

var collectionName = 'users/loyf0125/keerqin';
var roi = ee.FeatureCollection(collectionName);

这部分代码定义了要下载影像的地理区域。ROI是从GEE的资产库中加载的矢量数据集,指定了科尔沁区域的范围。

2. 定义导出函数

function exportImageByMonth(image, region, yearMonth, datasetType) {
  Export.image.toDrive({
    image: image,
    description: "Drive-Sentinel2-" + datasetType + "-" + yearMonth,
    fileNamePrefix: "Sentinel2_" + datasetType + "_" + yearMonth,
    folder: "sen2/" + "keerqin/" + yearMonth + "_" + datasetType,
    scale: 10,
    region: region,
    maxPixels: 1e13,
    fileFormat: "GeoTIFF",
    crs: "EPSG:4326"
  });
}

该函数负责将处理后的影像导出到Google Drive,关键参数包括:

  • scale: 10米分辨率
  • maxPixels: 允许导出的最大像素数
  • crs: 使用WGS84坐标系

3. 生成时间序列

var yearMonths = [];
for (var year = 2024; year <= 2025; year++) {
  var startMonth = (year === 2024) ? 1 : 1;
  var endMonth = (year === 2025) ? 8 : 12;
  
  for (var month = startMonth; month <= endMonth; month++) {
    var monthStr = month < 10 ? '0' + month : '' + month;
    yearMonths.push(year + '-' + monthStr);
  }
}

生成从2024年1月到2025年8月的月度时间序列,用于按月份获取影像。

4. 影像处理核心部分

var dataset = ee.ImageCollection('COPERNICUS/S2_HARMONIZED')
  .filterBounds(roi)
  .filterDate(startDate, endDate)
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))
  .select(['B4', 'B3', 'B2', 'B8']);

var mosaicImage = dataset.median().clip(roi);

影像合成的可选方案详解

当前方案:中值合成(Median Composite)

var mosaicImage = dataset.median().clip(roi);

优点

  • 有效去除异常值(如云、阴影等)
  • 保留典型的地物反射特征
  • 对噪声有较好的鲁棒性

缺点

  • 可能丢失某些重要的瞬时信息
  • 对于变化监测不够敏感

替代方案1:均值合成(Mean Composite)

var mosaicImage = dataset.mean().clip(roi);

适用场景

  • 需要平均反射率的研究
  • 大区域的地表覆盖分类

替代方案2:最大值合成(Max Composite)

var mosaicImage = dataset.max().clip(roi);

适用场景

  • 植被监测(突出植被最茂盛时期)
  • 洪水淹没范围识别

替代方案3:最小值合成(Min Composite)

var mosaicImage = dataset.min().clip(roi);

适用场景

  • 水体提取(水体的反射率通常最低)
  • 阴影区域分析

替代方案4:质量波段加权合成

// 首先添加质量评估波段
var datasetWithQA = dataset.map(function(image) {
  return image.addBands(image.select('QA60'));
});

// 使用质量波段进行合成
var mosaicImage = datasetWithQA.qualityMosaic('QA60').clip(roi);

优势

  • 自动选择质量最好的像素
  • 有效去除云和阴影的影响

替代方案5:按时间排序的最新影像

var mosaicImage = dataset.sort('system:time_start', false).first().clip(roi);

适用场景

  • 需要最新可用影像的情况
  • 应急响应和灾害监测

替代方案6:自定义 reducer 合成

var mosaicImage = dataset.reduce(ee.Reducer.percentile([25, 50, 75])).clip(roi);

优势

  • 可以同时获取多个百分位数值
  • 更灵活的数据统计分析

完整代码

// 设置感兴趣区域 ROI
var collectionName = 'users/loyf0125/keerqin';
var roi = ee.FeatureCollection(collectionName);

// 定义导出影像数据函数,包含年月参数
function exportImageByMonth(image, region, yearMonth, datasetType) {
  Export.image.toDrive({
    image: image,
    description: "Drive-Sentinel2-" + datasetType + "-" + yearMonth,
    fileNamePrefix: "Sentinel2_" + datasetType + "_" + yearMonth,
    folder: "sen2/" + "keerqin/" + yearMonth + "_" + datasetType,
    scale: 10,
    region: region,
    maxPixels: 1e13,
    fileFormat: "GeoTIFF",
    crs: "EPSG:4326"
  });
}

// 生成2024年1月至2025年8月的年月列表
var yearMonths = [];
for (var year = 2024; year <= 2025; year++) {
  var startMonth = (year === 2024) ? 1 : 1;
  var endMonth = (year === 2025) ? 8 : 12;
  
  for (var month = startMonth; month <= endMonth; month++) {
    var monthStr = month < 10 ? '0' + month : '' + month;
    yearMonths.push(year + '-' + monthStr);
  }
}

// 遍历每个月进行数据处理和导出
yearMonths.forEach(function(yearMonth) {
  // 计算月份的开始和结束日期
  var startDate = yearMonth + '-01';
  var endDate = ee.Date(startDate).advance(1, 'month').format('YYYY-MM-dd');
  
  // 获取 Sentinel-2 数据集
  var dataset = ee.ImageCollection('COPERNICUS/S2_HARMONIZED')
    .filterBounds(roi)
    .filterDate(startDate, endDate)
    .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))
    .select(['B4', 'B3', 'B2', 'B8']);

  // 对影像进行镶嵌和裁切(中值合成方案)
  var mosaicImage = dataset.median().clip(roi);

  // 导出影像数据
  exportImageByMonth(mosaicImage, roi, yearMonth, 'S2');

  // 可视化设置
  var visualization = {
    bands: ['B4', 'B3', 'B2'],
    min: 0.0,
    max: 3000,
    gamma: 1.4,
  };

  // 添加每月影像到地图
  Map.addLayer(mosaicImage, visualization, 'Sentinel-2 ' + yearMonth);
});

// 在地图中心显示感兴趣区
Map.centerObject(roi, 7);
Map.addLayer(roi, { color: "red" }, "ROI");

总结

本文详细介绍了使用GEE下载Sentinel-2影像的完整流程,并重点讨论了影像合成的多种方案。不同的合成方法适用于不同的研究目的,用户应根据具体需求选择合适的合成策略。中值合成作为默认方案,在大多数情况下都能提供较好的结果,但在特定应用场景下,其他合成方法可能更加合适。

通过灵活运用这些技术,研究人员可以高效地获取和处理大范围的遥感影像数据,为各种地学研究和应用提供数据支持。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐