教程| 批量下载逐月哨兵2号(Sentinel-2)NDVI数据

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


前言

哨兵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米分辨率,满足精细化监测需求。
  • 高效去云处理: 使用云概率数据,提高影像质量。批量自动化:
  • 一次性处理全年的影像,自动下载结果。
### 使用 Google Earth Engine API 批量下载 Sentinel 卫星数据 #### 准备工作 在开始之前,确保已经安装并配置好了 `earthengine-api` 和 `geemap` 库。这些库提供了访问 GEE 平台以及管理任务的功能。 对于 Python 用户来说,可以通过 pip 安装上述依赖项: ```bash pip install earthengine-api geemap ``` 初始化 Earth Engine: ```python import ee ee.Initialize() ``` #### 构建影像集合查询条件 定义感兴趣区域 (AOI),设置时间范围和其他筛选参数来构建特定的影像集合作为后续操作的基础[^1]。 ```python # 设置研究区 aoi = ee.Geometry.Polygon( [[[70.89, 26.54], [70.89, 27.30], [72.27, 27.30], [72.27, 26.54]]]) # 创建Sentinel-1 影像集合 sentinel1_collection = ( ee.ImageCollection('COPERNICUS/S1_GRD') .filterBounds(aoi) .filterDate('2023-01-01', '2023-12-31') # 时间区间可以根据需求调整 ) print(f'Found {sentinel1_collection.size().getInfo()} images.') ``` #### 下载单张图片作为测试 先尝试导出一张图片到 Google Drive 或本地文件系统验证流程是否正常工作[^2]。 ```python from geemap import ee_export_image image_to_download = sentinel1_collection.first() task_config = { 'region': aoi.getInfo()['coordinates'], 'scale': 10, 'folder': 'gee_downloads', } ee_export_image(image=image_to_download, filename='test_sentinel.tif', **task_config) ``` #### 实现批量下载功能 当确认单独图像可以成功下载之后,则可通过循环遍历整个影像集合完成批量化作业。这里展示了一个简单的例子,其中包含了基本错误处理逻辑以应对可能出现的问题。 ```python def batch_download(collection, folder_name): """Batch download all images from an image collection.""" try: size = collection.size().getInfo() if not size: print("No images found.") return for i in range(size): img = ee.Image(collection.toList(100).get(i)) task_params = dict( region=aoi.getInfo()["coordinates"], scale=10, maxPixels=1e13, fileFormat="GeoTIFF", description=f'sentinel_{i}', folder=folder_name ) export_task = ee.batch.Export.image.toDrive(**{ "image": img.select(['VV', 'VH']), **task_params }) export_task.start() print(f'Started exporting image {i}') except Exception as e: print(e) batch_download(sentinel1_collection, 'my_folder') ``` 此脚本会将符合条件的所有 Sentinel-1 GRD 类型的数据逐个上传至指定目录下保存成 GeoTiff 文件格式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值