【GEE笔记】按日合成计算和筛选下载遥感数据——哨兵2号(Sentinel-2)

此博客介绍了如何使用Google Earth Engine (GEE) 对Sentinel-2卫星数据进行每日合成,筛选出有效像元比例高于70%的影像,并计算NDVI值。它包括数据预处理、像元比例计算、值域映射和数据导出步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 主要功能:

  1. 数据每日合成
  2. 递归函数返回每个有数据日期的影像,组成数据集;筛选出有效像元大于70%的影像
  3. 值域映射
  4. 批量下载数据,整个数据集
  • 代码实现 

 1、传入矢量geometry,时间范围,进行数据每日合成,返回每个有数据日期的影像数据集

//定义样本点
var geometry =
    ee.Geometry.Polygon(
        [[[121.65456803004417, 40.9702377336333],
        [121.65456803004417, 40.787490369349094],
        [122.00338394801292, 40.787490369349094],
        [122.00338394801292, 40.9702377336333]]], null, false);

//时间范围
var start = ee.Date('2020-6-01');
var finish = ee.Date('2020-7-1');

// 载入 Sentinel-2 TOA reflectance data.
var dataset = ee.ImageCollection('COPERNICUS/S2')
    .filterDate(start, finish)
    .filterBounds(geometry)
    .map(maskS2clouds)
    .select(["B8", "B4"])

print("dataset", dataset)

var diff = finish.difference(start, 'day')

// Make a list of all dates
var range = ee.List.sequence(0, diff.subtract(1)).map(function (day) {
    return start.advance(day, 'day')
})
// print("range",range)

//递归函数返回每个有数据日期的影像,组成数据集
var newcol = ee.ImageCollection(ee.List(range.iterate(day_mosaics, ee.List([]))))

function maskS2clouds(image) {
    var qa = image.select('QA60');

    // Bits 10 and 11 are clouds and cirrus, respectively.
    var cloudBitMask = 1 << 10;
    var cirrusBitMask = 1 << 11;

    // Both flags should be set to zero, indicating clear conditions.
    var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
        .and(qa.bitwiseAnd(cirrusBitMask).eq(0));
    image = image.updateMask(mask);
    return image.clip(geometry)//.set('yun',ee.Number(xiangyuan).divide(zongxiangyuan));

}



// Funtion for iteraton over the range of dates
function day_mosaics(date, newlist) {
    // Cast
    date = ee.Date(date)
    newlist = ee.List(newlist)

    // Filter collection between date and the next day
    var filtered = dataset.filterDate(date, date.advance(1, 'day'))
    var image = ee.Image(filtered.mean()).set({ "date": date.format("YYYYMMdd") })

    // Add the mosaic to a list only if the collection has images
    return ee.List(ee.Algorithms.If(filtered.size(), newlist.add(image), newlist))
}

2、计算geometry总面积、每幅影像有值区域面积,相比的值即为有效像元比例,写入每幅影像的元数据,后续基于元数据筛选出有效像元大于70%的影像。其中利用gee的map函数对数据集进行遍历执行相同操作,此处顺便计算ndvi并将ndvi值线性映射到0~10000之间(转换数据类型为整形,减少数据存储量)

//计算有效像元面积
var zongxiangyuan = ee.Image.pixelArea().reduceRegion({
    reducer: ee.Reducer.sum(),
    geometry: geometry,
    scale: 10,
    maxPixels: 10e15,
}).get("area");
newcol = newcol.map(addvalue)
    //筛选出大于70%的影像
    .filter(ee.Filter.gt('yun', 0.7))
    //计算NDVI
    .map(addndvi)

// print(newcol)
//值域映射
newcol = newcol.map(guyi)

//function
function guyi(img) {
    var date = img.get("date")
    var yun = img.get("yun")
    return img.multiply(10000).add(10000).toInt16().set({ "yun": yun, "date": date });
}
function addndvi(img) {
    // Use the normalizedDifference(A, B) to compute (A - B) / (A + B)
    var ndvi = img.normalizedDifference(['B8', 'B4']).rename("NDVI");
    var date = img.get("date")
    var yun = img.get("yun")
    // ndvi=ndvi.mask(ndvi.gt(1)).mask(ndvi.lt(-1))
    // var yun=img.get("yun")
    return ndvi.set({ "yun": yun, "date": date });
}
function addvalue(img) {
    var mask = img.select(0).mask()
    var xiangyuan = ee.Image.pixelArea().updateMask(mask).reduceRegion({
        reducer: ee.Reducer.sum(),
        geometry: geometry,
        scale: 10,
        maxPixels: 10e15,
    }).get("area");
    return img.set({ "yun": ee.Number(xiangyuan).divide(zongxiangyuan) })
}

3、将数据集导出,文件名为日期 

var imagenum = newcol.size().getInfo()
print("数据个数:" + imagenum, newcol)

//下载数据集
newcol = newcol.toList(newcol.size())
for (var i = 0; i < imagenum; i++) {
    var image = ee.Image(newcol.get(i))
    var date = ee.String(image.get("date")).getInfo()
    // var yun=ee.Number(image.get("yun")).multiply(100).toInt8().getInfo()
    // Map.addLayer(image, visualization, date);
    Export.image.toDrive({
        image: image,
        description: date,
        folder: 'S2NDVI202202119',
        region: geometry,
        skipEmptyTiles: true,
        scale: 10,
        maxPixels: 1e13
    });

}
  • 结果展示 

  • 数据介绍 

Sentinel-2 Bands
NameScalePixel SizeWavelengthDescription
B10.000160 meters443.9nm (S2A) / 442.3nm (S2B)

Aerosols

B20.000110 meters496.6nm (S2A) / 492.1nm (S2B)

Blue

B30.000110 meters560nm (S2A) / 559nm (S2B)

Green

B40.000110 meters664.5nm (S2A) / 665nm (S2B)

Red

B50.000120 meters703.9nm (S2A) / 703.8nm (S2B)

Red Edge 1

B60.000120 meters740.2nm (S2A) / 739.1nm (S2B)

Red Edge 2

B70.000120 meters782.5nm (S2A) / 779.7nm (S2B)

Red Edge 3

B80.000110 meters835.1nm (S2A) / 833nm (S2B)

NIR

B8A0.000120 meters864.8nm (S2A) / 864nm (S2B)

Red Edge 4

B90.000160 meters945nm (S2A) / 943.2nm (S2B)

Water vapor

B100.000160 meters1373.5nm (S2A) / 1376.9nm (S2B)

Cirrus

B110.000120 meters1613.7nm (S2A) / 1610.4nm (S2B)

SWIR 1

B120.000120 meters2202.4nm (S2A) / 2185.7nm (S2B)

SWIR 2

QA1010 meters

Always empty

QA2020 meters

Always empty

QA6060 meters

Cloud mask

### 使用 Google Earth Engine 批量下载 Sentinel-2 数据GEE 中批量下载 Sentinel-2 数据可以通过结合 Python 脚本 GEE API 实现。以下是详细的实现方法: #### 方法概述 通过定义感兴趣区域(Region of Interest, ROI)、时间范围以及筛选条件,可以从 Sentinel-2 数据集中提取符合条件的影像集合,并将其逐片导出到用户的 Google Drive 或其他存储位置。 --- #### 示例代码 以下是一个完整的 Python 脚本示例,展示如何使用 GEE API 进行 Sentinel-2 数据的批量下载: ```python import ee import time # 初始化 EE ee.Initialize() # 定义研究区域 (ROI),这里以一个简单的几何多边形为例 roi = ee.Geometry.Polygon([ [[-72.94, 41.30], [-72.54, 41.30], [-72.54, 41.60], [-72.94, 41.60]] ]) # 设置时间范围 start_date = '2023-01-01' end_date = '2023-03-01' # 加载 Sentinel-2 影像集合 sentinel2_collection = ee.ImageCollection('COPERNICUS/S2') \ .filterBounds(roi) \ .filterDate(start_date, end_date) \ .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10)) # 筛选云覆盖率小于10% print(f'找到 {sentinel2_collection.size().getInfo()} 幅影像') # 遍历每幅影像并导出 def export_image(image): image_id = image.get('system:index').getInfo() task = ee.batch.Export.image.toDrive( image=image, description=f'Sentinel2_{image_id}', folder='Sentinel2_Export', region=roi.getInfo()['coordinates'], scale=10, # 输出分辨率为 10 米 crs='EPSG:4326', maxPixels=1e13 ) task.start() print(f'已启动任务:{task.id}') for img in sentinel2_collection.toList(sentinel2_collection.size()).getInfo(): export_image(ee.Image(img)) time.sleep(5) # 添加延迟防止请求过快被拒绝 ``` 上述脚本实现了以下功能: 1. **初始化 GEE**:确保与 GEE 的连接正常。 2. **定义 ROI**:设定感兴趣的地理区域。 3. **加载数据集**:从 `COPERNICUS/S2` 数据集中筛选符合时间云覆盖条件的影像。 4. **批量导出**:将每一幅符合条件的影像逐一导出至 Google Drive。 --- #### 关键参数解释 - **scale**: 控制输出影像的空间分辨率,默认单位为米。对于 Sentinel-2 数据,推荐设置为 10 米[^3]。 - **region**: 指定导出的地理范围,通常为 ROI 的边界框坐标。 - **maxPixels**: 设定最大像素数量,避免因单次导出的数据过大而导致失败。 - **folder**: 指定 Google Drive 上的目标文件夹名称。 --- #### 注意事项 1. 如果需要处理大量数据,建议拆分为多个较小的任务以提高成功率。 2. 导出过程中可能会受到网络带宽或 GEE 服务限制的影响,因此需合理安排任务间隔。 3. 对于长时间序列的大规模数据下载,可以考虑利用服务器端自动化工具完成批量化操作[^2]。 --- ###
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

runepic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值