提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

哨兵2号(Sentinel-2)卫星提供了高空间分辨率、多光谱影像,是遥感领域的重要数据来源。利用这些数据,研究者可以进行土地覆盖分类、植被指数(NDVI)计算等多种应用。然而,受制于影像云层覆盖问题以及数据处理的复杂性,如何精确处理、分析并批量下载哨兵影像成为关键问题。

网上有很多关于MDVI下载的示例,如何获取更高精度的NDVI数据,今天分享一下GEE中进行哨兵2号10米分辨率的NDVI月度数据下载。

涵盖逐年批量化NDVI数据生成、去云处理,以及如何利用Google Earth Engine(GEE)实现全流程自动化。

一、哨兵2号影像的优势

1.高空间分辨率
哨兵2号影像提供10米分辨率的可见光与近红外波段,使得植被指数(NDVI)等精细计算成为可能。
2.多光谱数据
包含13个光谱波段,覆盖从可见光到短波红外的广泛光谱范围。
3.免费获取
通过GEE等平台,可以轻松访问并处理这些高质量数据。

二、NDVI计算与去云问题

哨兵影像常受云覆盖影响,需要利用云概率数据***(COPERNICUS/S2_CLOUD_PROBABILITY)***进行云掩膜去除。影像拼接:
同一天的影像可能覆盖多区域,需要拼接处理。批量化处理:
对于长期多年的NDVI监测,单次下载无法满足需求,需要实现批量化处理。

1.解决方案:利用GEE实现批量化影像处理

基于GEE平台,我们可以通过以下几个步骤实现哨兵影像的批量处理与下载:

  1. 影像预处理:
    筛选影像并裁剪到研究区域。

  2. 云去除:
    使用云概率数据,去除云覆盖区域。

  3. NDVI计算:
    计算归一化植被指数(NDVI)。 影像拼接与时间序列化: 按月份拼接影像,生成年度NDVI时序数据。

  4. 批量化导出
    自动化逐年逐月下载。
    在这里插入图片描述

2.代码实现

1. 同日期影像拼接

在同一天的影像中,可能存在多块影像覆盖不同区域,因此需要对影像进行拼接操作。以下代码实现了这一功能:

// 将同一天的影像拼接为一张完整影像
var mosaicSameDate = function(img_col) {
  // 提取影像集合中的所有时间,并格式化为 YYYY-MM-DD
  var dates = img_col.aggregate_array('system:time_start')
    .map(function(date) { return ee.Date(date).format('YYYY-MM-dd'); }) // 将时间戳格式化
    .distinct(); // 去重,得到唯一日期列表

  // 定义按日期拼接的函数
  var mosaicByDate = function(img_date) {
    var date = ee.Date(img_date); // 当前处理的日期
    // 定义日期范围(前后各一天,用于安全地提取当天数据)
    var start_date = date.advance(-1, 'day').format('YYYY-MM-dd');
    var end_date = date.advance(1, 'day').format('YYYY-MM-dd');
    // 过滤影像集合,获取该日期附近的数据
    var filteredCollection = img_col.filterDate(start_date, end_date);
    // 对筛选出的影像进行拼接
    var mosaic = filteredCollection.mosaic();
    // 为拼接影像添加日期属性
    return mosaic.set('system:time_start', date.format('YYYY-MM-dd'));
  };

  // 遍历所有日期,按日期拼接影像
  var img_col_mosaic = dates.map(mosaicByDate);
  // 返回拼接后的影像集合
return ee.ImageCollection.fromImages(img_col_mosaic);
};
  • 通过 aggregate_array 提取影像时间戳,并将其格式化为日期字符串。
  • 利用 **.mosaic()**函数,将同一日期的影像拼接为单张影像。每张拼接影像的日期属性被保留,用于后续按时间分析。

2.去除云层

哨兵影像经常受到云层影响,参考公众号上另一位大佬的方法:https://mp.weixin.qq.com/s/TIfgTT0KIaJJSUmjEu36g,用以下代码使用云概率数据 (COPERNICUS/S2_CLOUD_PROBABILITY) 去除云层:

在这里插入图片描述

在这里插入图片描述

// 使用云概率波段去除影像中的云层
var maskClouds = function(img) {
  // 从影像属性中获取云概率波段
  var clouds = ee.Image(img.get('cloud_mask')).select('probability');
  // 设置云去除阈值(小于44认为无云)
  var isNotCloud = clouds.lt(44);
  // 使用云掩膜更新影像
  return img.updateMask(isNotCloud);
};
  • 云概率数据存储在附加影像中,通过 get(‘cloud_mask’) 获取。
  • lt(44)表示将云概率小于44的像素标记为有效像素。 使用
  • updateMask 应用云掩膜。

3.NDVI计算

NDVI(归一化植被指数)是遥感植被监测的重要指标。以下代码基于哨兵2号的红光和近红外波段计算NDVI:

// 基于红光(B4)和近红外(B8)计算NDVI
var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI'); // 计算NDVI
  return image.addBands(ndvi); // 将NDVI作为新波段添加到影像
};

NDVI 公式为 (NIR - Red) / (NIR + Red)。
normalizedDifference方法直接实现NDVI计算,并命名为 NDVI

4. 按月份批量处理影像

以下代码实现2023年逐月处理NDVI影像,并自动下载结果:

// 设置年份与研究区域
var year = 2023;
var region = geometry; // 替换为研究区域
var months = ee.List.sequence(1, 12); // 按月循环

months.evaluate(function(monthList) {
  // 遍历每个月
  monthList.forEach(function(month) {
    var start_date = ee.Date.fromYMD(year, month, 1); // 月初日期
    var end_date = start_date.advance(1, 'month').advance(-1, 'second'); // 月末日期
    // 获取当前月份的影像集合并计算NDVI
    var s2_ndvi_img_col = getNDVICol(start_date.format('YYYY-MM-dd'), end_date.format('YYYY-MM-dd'), region);
    var max_ndvi = s2_ndvi_img_col.map(function(image) { return image.select('NDVI'); }).max(); // 最大NDVI

    // 可视化NDVI
    Map.addLayer(max_ndvi, {bands: ['NDVI'], min: -1, max: 1}, 'NDVI Max ' + start_date.format('YYYY-MM').getInfo());
  • ee.Date.fromYMD 用于生成指定月份的起始日期
  • advance(-1, ‘second’) 确保结束时间覆盖整
  • getNDVICol 提取影像集合并计算NDVI。

在这里插入图片描述
在这里插入图片描述
局部NDVI

总结与应用

本代码实现了哨兵2号影像的批量化处理与自动化导出,主要特点包括

  • 高精度NDVI计算: 基于10米分辨率,满足精细化监测需求。
  • 高效去云处理: 使用云概率数据,提高影像质量。批量自动化:
  • 一次性处理全年的影像,自动下载结果。
Logo

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

更多推荐