1.选择研究区内Sentinel-2影像,并对影像数据进行去云,筛选等操作
Map.centerObject(table, 10);
// 将地图中心设置为table几何对象,并将缩放级别设为10。
// 定义一个函数,用于掩膜掉云层和卷云的像素
function maskS2clouds(image) {
var qa = image.select('QA60'); // 选择QA60波段,QA60波段包含质量评估信息
// 定义云层和卷云的掩膜位,分别为第10位和第11位
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// 生成掩膜,确保第10位和第11位为0,表示无云层和卷云
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
// 应用掩膜,并将像素值缩放到0-1之间(原始像素值乘以0.0001)
return image.updateMask(mask).divide(10000);
}
// 创建一个Sentinel-2影像集合,应用各种过滤条件
var dataset = ee.ImageCollection('COPERNICUS/S2_SR') // 选择Sentinel-2 Level-2A影像集合
.filterBounds(table) // 过滤影像集合,仅保留覆盖table区域的影像
.filterDate('2023-01-01', '2023-10-31') // 进一步过滤,仅保留指定日期范围内的影像,【可以定义时间】 .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10)) // 仅保留云量小于10%的影像
.map(maskS2clouds) // 应用maskS2clouds函数,去除云层和卷云
.median() // 计算时间范围内的影像中值,减少噪声
.clip(table); // 将影像裁剪到table区域
print(dataset); // 输出处理后的影像集合以供查看
2.定义需要提取的波段参数,本文提取的是b1-b12,arvi,ndvi,sr,osavi,vigreen植被指数
// 从dataset中选择指定波段并创建新的合并影像
var mergedImage = dataset.select('B1','B2','B3','B4','B5','B6','B7','B8','B8A','B9','B11','B12');
print(mergedImage); // 输出合并后的影像以供查看
// 定义计算植被指数的函数
function addVegetationIndices(image) {
// 计算ARVI (Atmospherically Resistant Vegetation Index)
var arvi = image.expression(
'(NIR - (2 * Red - Blue)) / (NIR + (2 * Red - Blue))', {
'NIR': image.select('B8'),
'Red': image.select('B4'),
'Blue': image.select('B2')
}).rename('ARVI').toFloat(); // 转换为Float32
// 计算NDVI (Normalized Difference Vegetation Index)
var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI').toFloat(); // 转换为Float32
// 计算SR (Simple Ratio)
var sr = image.select('B8').divide(image.select('B4')).rename('SR').toFloat(); // 转换为Float32
// 计算OSAVI (Optimized Soil-Adjusted Vegetation Index)
var osavi = image.expression(
'(NIR - Red) / (NIR + Red + 0.16)', {
'NIR': image.select('B8'),
'Red': image.select('B4')
}).rename('OSAVI').toFloat(); // 转换为Float32
// 计算VIGreen (Green Vegetation Index)
var vigreen = image.expression(
'(Green - Red) / (Green + Red)', {
'Green': image.select('B3'),
'Red': image.select('B4')
}).rename('VIGreen').toFloat(); // 转换为Float32
// 将计算的指数添加到影像中
return image.addBands([arvi, ndvi, sr, osavi, vigreen]);
}
// 对mergedImage应用指数计算函数
var vegetationIndicesImage = addVegetationIndices(mergedImage);
print(vegetationIndicesImage); // 输出包含指数的影像以供查看
3.可视化,并导出
// 定义RGB可视化参数,设置显示波段为红、绿、蓝(B4、B3、B2),以及显示的最小和最大值
var rgbVis = {
min: 0.0,
max: 0.3,
bands: ['B4', 'B3', 'B2'],
};
// 将处理后的影像以RGB形式添加到地图上显示
Map.addLayer(vegetationIndicesImage, rgbVis, 'RGB');
// 定义NDVI的可视化参数,并将NDVI添加到地图
var ndviVis = {
min: 0.0,
max: 1.0,
palette: ['blue', 'white', 'green']
};
Map.addLayer(vegetationIndicesImage.select('NDVI'), ndviVis, 'NDVI');
// 导出影像至Google Drive,包含植被指数
Export.image.toDrive({
image: vegetationIndicesImage, // 包含指数的影像
description: 'VegetationIndices_2023', // 导出任务描述
folder: 'Sentinel2-L2A', // 保存文件夹
scale: 10, // 空间分辨率
maxPixels: 1e13, // 最大像素数
region: table, // 导出区域
fileFormat: 'GeoTIFF', // 文件格式
crs: "EPSG:4326", // 坐标系
formatOptions: {
cloudOptimized: true // 启用云优化
}
});
完整代码
Map.centerObject(table, 10);
// 将地图中心设置为table几何对象,并将缩放级别设为10。您可以根据需要调整这个级别。
// 定义一个函数,用于掩膜掉云层和卷云的像素
function maskS2clouds(image) {
var qa = image.select('QA60'); // 选择QA60波段,QA60波段包含质量评估信息
// 定义云层和卷云的掩膜位,分别为第10位和第11位
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// 生成掩膜,确保第10位和第11位为0,表示无云层和卷云
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
// 应用掩膜,并将像素值缩放到0-1之间(原始像素值乘以0.0001)
return image.updateMask(mask).divide(10000);
}
// 创建一个Sentinel-2影像集合,应用各种过滤条件
var dataset = ee.ImageCollection('COPERNICUS/S2_SR') // 选择Sentinel-2 Level-2A影像集合
.filterBounds(table) // 过滤影像集合,仅保留覆盖table区域的影像
.filterDate('2023-01-01', '2023-10-31') // 进一步过滤,仅保留指定日期范围内的影像
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10)) // 仅保留云量小于10%的影像
.map(maskS2clouds) // 应用maskS2clouds函数,去除云层和卷云
.median() // 计算时间范围内的影像中值,减少噪声
.clip(table); // 将影像裁剪到table区域
print(dataset); // 输出处理后的影像集合以供查看
// 从dataset中选择指定波段并创建新的合并影像
var mergedImage = dataset.select('B1','B2','B3','B4','B5','B6','B7','B8','B8A','B9','B11','B12');
print(mergedImage); // 输出合并后的影像以供查看
// 定义计算植被指数的函数
function addVegetationIndices(image) {
// 计算ARVI (Atmospherically Resistant Vegetation Index)
var arvi = image.expression(
'(NIR - (2 * Red - Blue)) / (NIR + (2 * Red - Blue))', {
'NIR': image.select('B8'),
'Red': image.select('B4'),
'Blue': image.select('B2')
}).rename('ARVI').toFloat(); // 转换为Float32
// 计算NDVI (Normalized Difference Vegetation Index)
var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI').toFloat(); // 转换为Float32
// 计算SR (Simple Ratio)
var sr = image.select('B8').divide(image.select('B4')).rename('SR').toFloat(); // 转换为Float32
// 计算OSAVI (Optimized Soil-Adjusted Vegetation Index)
var osavi = image.expression(
'(NIR - Red) / (NIR + Red + 0.16)', {
'NIR': image.select('B8'),
'Red': image.select('B4')
}).rename('OSAVI').toFloat(); // 转换为Float32
// 计算VIGreen (Green Vegetation Index)
var vigreen = image.expression(
'(Green - Red) / (Green + Red)', {
'Green': image.select('B3'),
'Red': image.select('B4')
}).rename('VIGreen').toFloat(); // 转换为Float32
// 将计算的指数添加到影像中
return image.addBands([arvi, ndvi, sr, osavi, vigreen]);
}
// 对mergedImage应用指数计算函数
var vegetationIndicesImage = addVegetationIndices(mergedImage);
print(vegetationIndicesImage); // 输出包含指数的影像以供查看
// 定义RGB可视化参数,设置显示波段为红、绿、蓝(B4、B3、B2),以及显示的最小和最大值
var rgbVis = {
min: 0.0,
max: 0.3,
bands: ['B4', 'B3', 'B2'],
};
// 将处理后的影像以RGB形式添加到地图上显示
Map.addLayer(vegetationIndicesImage, rgbVis, 'RGB');
// 定义NDVI的可视化参数,并将NDVI添加到地图
var ndviVis = {
min: 0.0,
max: 1.0,
palette: ['blue', 'white', 'green']
};
Map.addLayer(vegetationIndicesImage.select('NDVI'), ndviVis, 'NDVI');
// 导出影像至Google Drive,包含植被指数
Export.image.toDrive({
image: vegetationIndicesImage, // 包含指数的影像
description: 'VegetationIndices_2023', // 导出任务描述
folder: 'Sentinel2-L2A', // 保存文件夹
scale: 10, // 空间分辨率
maxPixels: 1e13, // 最大像素数
region: table, // 导出区域
fileFormat: 'GeoTIFF', // 文件格式
crs: "EPSG:4326", // 坐标系
formatOptions: {
cloudOptimized: true // 启用云优化
}
});