提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
哨兵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平台,我们可以通过以下几个步骤实现哨兵影像的批量处理与下载:
-
影像预处理:
筛选影像并裁剪到研究区域。 -
云去除:
使用云概率数据,去除云覆盖区域。 -
NDVI计算:
计算归一化植被指数(NDVI)。 影像拼接与时间序列化: 按月份拼接影像,生成年度NDVI时序数据。 -
批量化导出
自动化逐年逐月下载。
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。
总结与应用
本代码实现了哨兵2号影像的批量化处理与自动化导出,主要特点包括
- 高精度NDVI计算: 基于10米分辨率,满足精细化监测需求。
- 高效去云处理: 使用云概率数据,提高影像质量。批量自动化:
- 一次性处理全年的影像,自动下载结果。