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

  • 主要功能:

  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

  • 14
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
好的,以下是使用 Sentinel-2 数据GEE计算一年平均 NDVI 并下载 NDVI 的代码示例: ```javascript var s2 = ee.ImageCollection('COPERNICUS/S2_SR') .filterDate('2021-01-01', '2021-12-31') .filterBounds(geometry); var addNDVI = function(image) { var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI'); return image.addBands(ndvi); }; var s2WithNDVI = s2.map(addNDVI); var ndvi = s2WithNDVI.select('NDVI'); var meanNDVI = ndvi.mean(); Export.image.toDrive({ image: meanNDVI, description: 'mean_ndvi_2021', scale: 10, region: geometry }); ``` 这段代码与上一个示例代码类似,只不过这里增加了将结果导出到 Google Drive 的代码。`Export.image.toDrive` 函数可以将计算结果导出为 GeoTIFF 文件。您需要指定导出的图像、文件名、空间分辨率、导出区域等参数。 导出完成后,您可以在 Google Drive 中找到导出的文件,并进行下载。如果您使用的是 Colab 或者 Jupyter Notebook,您也可以使用以下代码将文件下载到本地: ```python from google.colab import drive drive.mount('/content/drive') import ee ee.Authenticate() ee.Initialize() region = ee.Geometry.Rectangle([lon_min, lat_min, lon_max, lat_max]) image = ee.Image('GEE_IMAGE_ID') task = ee.batch.Export.image.toDrive(image, 'IMAGE_NAME', region=region.getInfo(), scale=30) task.start() ``` 其中,'GEE_IMAGE_ID' 是导出的图像在 GEE 中的 ID,'IMAGE_NAME' 是导出的文件名,在下载时需要修改为实际的文件名。这段代码需要在 Colab 或者 Jupyter Notebook 中运行,并且需要授权 GEE 访问 Google Drive。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

runepic

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

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

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

打赏作者

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

抵扣说明:

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

余额充值