【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 API 下载 Sentinel-2 卫星数据,可以通过 Google Earth Engine (GEE) 的 Python API 来实现。这不仅简化了获取预处理过程,还能够直接在云环境中操作大量地理空间数据。 #### 安装必要的Python包 首先,确保安装了 `earthengine-api` 其他可能需要用到的数据处理库: ```bash pip install earthengine-api geemap pandas ``` #### 初始化Earth Engine 初始化 GEE 需要先完成身份验证并启动会话: ```python import ee ee.Initialize() ``` #### 构建Image Collection 定义感兴趣的区域(AOI),并通过指定时间地理位置筛选合适的 Sentinel-2 图像集合: ```python aoi = ee.Geometry.Polygon( [[[116.0, 40.0], [117.0, 40.0], [117.0, 39.0], [116.0, 39.0]]]) sentinel2_collection = ee.ImageCollection('COPERNICUS/S2') \ .filterBounds(aoi) \ .filterDate('2023-01-01', '2023-12-31') ``` #### 应用大气校正 对于更精确的结果,建议应用 gee-atmcorr-S2 提供的大气校正功能[^3]。此步骤有助于去除由大气引起的干扰因素,从而提高最终产品的质量。 #### 导出图像至Google Drive 设置导出参数并将选定的图像或拼接后的场景保存到个人谷歌云端硬盘账户中: ```python task_config = { 'image': sentinel2_collection.first(), 'description': 'Sentinel2_Download', 'folder': 'GEE_Export', 'scale': 10, 'region': aoi.getInfo()['coordinates'], } export_task = ee.batch.Export.image.toDrive(**task_config) export_task.start() print(f'Export task started with ID {export_task.id}') ``` 通过上述流程可以在本地计算机上轻松访问经过初步处理的高质量 Sentinel-2 影像资料。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

runepic

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

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

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

打赏作者

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

抵扣说明:

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

余额充值