作者: _养乐多_
在地球引擎(Google Earth Engine,简称GEE)平台上,我们可以使用时间序列数据来生成合成影像。时间序列数据是一组按时间排序的数据,可以是遥感影像、气象数据等等。利用时间序列数据,我们可以分析出不同时间点上数据的变化情况,进而合成一张更加全面、准确的影像。
下面我们来介绍如何在GEE平台上根据时间序列的统计值合成影像,并介绍各种统计值的计算代码。
结果如下图所示,
首先,我们需要准备一组时间序列数据。以Sentinel-2计算的2017年到2019年的归一化植被指数(NDVI)数据为例。使用reduce系列函数来计算统计值。再将统计值构成一个新的影像,并将影像可视化,加载到地图上,并能下载到个人资产Assets中。
名称 | 函数 |
---|---|
最大值 | ee.Reducer.max() |
最小值 | ee.Reducer.min() |
均值 | ee.Reducer.mean() |
众数 | ee.Reducer.mode() |
标准差 | ee.Reducer.stdDev() |
方差 | ee.Reducer.variance() |
和 | ee.Reducer.sum() |
像素数 | ee.Reducer.count() |
reduce 操作可以被用于对时间序列影像数据进行统计分析。在本代码中,NDVI 影像数据通过 reduce 操作计算了中位数波段和标准差波段,这些统计量都是基于时间序列数据计算得出的。
reduce 操作的基本原理是将数据集中的所有像素在某个维度上进行汇总统计。在本代码中,NDVI 影像数据的 reduce 操作是在时间轴上进行的,即将一系列的影像数据合并成一个单独的影像,该影像代表了时间序列中所有像素的统计结果。
具体地说,代码中使用了 ee.Reducer 类型的函数对 NDVI 影像数据进行 reduce 操作。Reducer 类型的函数有多种,可以用于计算各种统计指标,例如平均值、最大值、最小值、中位数、标准差等。在本代码中,通过 reduce(ee.Reducer.stdDev()) 函数计算了标准差波段,该函数会将 NDVI 影像数据的所有像素在时间轴上进行汇总,并输出一个新的影像,其中每个像素的值代表了该像素在时间序列中的标准差统计结果。
因此,通过 reduce 操作可以从时间序列影像数据中提取出各种统计信息,帮助分析者深入挖掘影像数据中的有用信息,从而更好地理解和解释数据。
接下来,我们需要计算出时间序列数据的统计值。在GEE平台上,可以使用reduce系列函数来计算统计值。我们可以计算出每个像素时间序列的平均NDVI值、最大值NDVI值、标准差,代码如下:
//导入研究区矢量
var roi = table
Map.centerObject(roi, 9);
Map.addLayer(roi, {color:"black"}, "roi");
var period_of_interest = ee.Filter.date('2017-01-01', '2019-12-31');
var inBands = ["B2","B3","B4","B6","B8","B11"]
// 构建Sentinel-2集合,按日期、边界和云覆盖百分比进行筛选
var dataset = ee.ImageCollection('COPERNICUS/S2_SR')
.filter(period_of_interest)
.filterBounds(roi)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',14))
.map(maskS2clouds);
print("Sentinel 2 Image Collection",dataset)
// 包含NDVI和BSI指数的所有影像集合
var collection = dataset.select(inBands).map(addNDVI).map(roiClip);
print(collection,'Collection with inBands and Statistic indices');
var NDVI = collection.select('NDVI')
// 定义和计算中位数波段和其他指数统计
// 计算其他指数只需要将ee.Reducer.max()换掉就行
var ndvimax = NDVI.reduce(ee.Reducer.max()).rename("NDVI_MAX");
// 可视化参数
var viz = {min:-1, max:1, palette:'blue, white, green'};
Map.addLayer(ndvimax, viz, 'NDVI_MAX');
// 使用RGB和CIR的最终数据集的可视化(假彩色合成和真彩色合成)
Map.addLayer(collection, { min: 0.0, max: 0.3, bands: ['B4', 'B3', 'B2'],}, 'RGB');
Map.addLayer(collection, { min: 0.0, max: 0.3, bands: ['B8', 'B4', 'B3'],}, 'CIR');
// 将图像导出到地球引擎Assets
Export.image.toAsset({
image: ndvimax,
region: roi,
description: 'DATASET_COMPOSITION',
scale: 10
});
//*******************函数库*******************//
// Sentinel-2去云
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));
return image.updateMask(mask).divide(10000);
}
//给影像添加NDVI波段
function addNDVI(image) {var ndvi = image.normalizedDifference(['B8', 'B4'])
.rename('NDVI')
.copyProperties(image,['system:time_start']);
return image.addBands(ndvi);
};
//将图像裁剪到研究区域内
function roiClip(image){
return image.clip(roi);
}
在这段代码中,首先导入了研究区矢量,并将其居中展示在地图上。通过Map.addLayer()函数添加了一个名为“roi”的图层,它是以黑色表示的研究区边界。接下来,创建了一个日期过滤器,对Sentinel-2卫星影像的数据进行筛选。我们只选择了2017年1月1日至2019年12月31日期间的影像,同时只选择了云覆盖率小于14%的影像,以确保影像质量。还调用了两个函数,一个用于去除云层,另一个用于为图像添加NDVI波段,以计算NDVI指数。然后,使用roiClip()函数对每个影像进行裁剪,以确保每个影像都在研究区域内。最后,将所有的影像合并成一个图层集合,并计算出每个波段的最大值,并将其添加到地图上。
我们还将可视化参数viz定义为一个对象,用于指定NDVI_MAX图层的最小值和最大值,以及调色板的颜色。还使用Map.addLayer()函数将假彩色合成和真彩色合成添加到地图上。最后,使用Export.image.toAsset()函数将最终图像导出到GEE资产Assets中。
此代码中还包含三个自定义函数。第一个函数maskS2clouds()用于去除Sentinel-2卫星影像中的云层;第二个函数addNDVI()用于为图像添加NDVI波段;第三个函数roiClip()用于将图像裁剪到研究区域内。这些函数可以在代码末尾的函数库中找到。
通过使用这些代码,可以对指定研究区域内的Sentinel-2卫星影像进行处理,并计算出NDVI指数,以更好地了解该地区的植被覆盖情况。此代码还展示了如何将图像导出到GEE资产中,以供后续分析和可视化。
https://code.earthengine.google.com/efe3d5c6637987913e38f2a92c5f8d98?noload=true