目录
(二)定义一个Landsat8的云掩膜函数对图像进行去云处理。
(三)使用gee中的函数分别计算MNDWI和NDWI,并将返回结果为新的波段。
1、首先,设定所需时间范围,筛选时间、研究区、云量,遍历云掩膜函数、提取MNDWI函数、NDWI函数,取中值合成,裁剪到研究区范围大小。
2、其次,将真彩色合成的研究区范围影像显示出来,再显示出水体提取的结果。
3、最后,定义一个导出到云盘的函数,可以同时将两种水体提取的结果任务显示出来。
一、主要信息
(一)Landsat8遥感数据信息
此次提取水体使用的是Landsat8的地表反射率产品,主要信息如下:
1、数据集的名称
LANDSAT/LC08/C02/T1_L2
2、数据集的可用时间
2013年3月18号至今
(二)水体指数的介绍
1、MNDWI
2、NDWI
二、数据集的使用与代码的简单介绍
此次研究区域选取江西省赣州市,使用时间为2014年到2023年,逐年提取水体,代码介绍如下:
(一)设置研究区的显示颜色,并定位到研究区可见。
Map.addLayer(roi, {"color": 'red',}, "roi");
Map.centerObject(roi,8);
(二)定义一个Landsat8的云掩膜函数对图像进行去云处理。
function mask_L8(image) {
var qaMask = image.select('QA_PIXEL').bitwiseAnd(parseInt('11111', 2)).eq(0);
var saturationMask = image.select('QA_RADSAT').eq(0);
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
return image.addBands(opticalBands, null, true)
.addBands(thermalBands, null, true)
.updateMask(qaMask)
.updateMask(saturationMask);
}
(三)使用gee中的函数分别计算MNDWI和NDWI,并将返回结果为新的波段。
// 定义一个名为 add_mndwi_L8 的函数,该函数接受一个影像对象作为参数
function add_mndwi_L8(image) {
// 计算归一化差异水体指数(MNDWI),使用第 3 波段(绿色)和第 6 波段(短波红外)
var mndwi = image.normalizedDifference(['SR_B3', 'SR_B6']).rename('MNDWI');
// 将计算得到的 MNDWI 作为新波段添加到原始影像中,并返回增强后的影像
return image.addBands([mndwi]);
}
// 定义一个名为 add_ndwi_L8 的函数,该函数接受一个影像对象作为参数
function add_ndwi_L8(image) {
// 计算归一化差异水体指数(NDWI),使用第 3 波段(绿色)和第 5 波段(近红外)
var ndwi = image.normalizedDifference(['SR_B3', 'SR_B5']).rename('NDWI');
// 将计算得到的 NDWI 作为新波段添加到原始影像中,并返回增强后的影像
return image.addBands([ndwi]);
}
(四)定义for循环。
1、首先,设定所需时间范围,筛选时间、研究区、云量,遍历云掩膜函数、提取MNDWI函数、NDWI函数,取中值合成,裁剪到研究区范围大小。
2、其次,将真彩色合成的研究区范围影像显示出来,再显示出水体提取的结果。
3、最后,定义一个导出到云盘的函数,可以同时将两种水体提取的结果任务显示出来。
// 从2014年到2023年循环
for (var year = 2014; year <= 2023; year++) {
// 设置每年的开始和结束日期
var start_date = year + '-01-01'; // 每年的开始日期
var end_date = year + '-12-31'; // 每年的结束日期
// 创建一个图像集合,过滤条件为每年的日期范围、感兴趣区域(roi)和云覆盖小于10%
var land_img = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
.filterDate(start_date, end_date) // 过滤指定日期范围内的影像
.filterBounds(roi) // 过滤只在感兴趣区域内的影像
.filter(ee.Filter.lt('CLOUD_COVER', 10)) // 过滤云覆盖率小于10%的影像
.map(mask_L8) // 应用自定义函数 mask_L8 以掩膜云和其他不必要的区域
.map(add_mndwi_L8) // 应用函数 add_mndwi_L8 计算 MNDWI
.map(add_ndwi_L8) // 应用函数 add_ndwi_L8 计算 NDWI
.median() // 计算影像集合的中位数
.clip(roi); // 将结果裁剪到感兴趣区域(roi)
// 在地图上添加图层,使用波段3(绿色)、波段2(蓝色)、波段1(红色)显示影像
Map.addLayer(land_img, {bands: ['SR_B3', 'SR_B2', 'SR_B1'], min: 0, max: 0.3 }, 'land8_img_' + year, false);
// 选择计算得到的 MNDWI 波段
var MNDWI = land_img.select('MNDWI');
// 生成水体掩膜,阈值为 0.3
var mndwi_water = MNDWI.gt(0.3);
// 更新掩膜,仅保留值大于0.5的区域
var mndwi_water = mndwi_water.updateMask(mndwi_water.gt(0.5));
// 选择计算得到的 NDWI 波段
var NDWI = land_img.select('NDWI');
// 生成水体掩膜,阈值为 0.3
var ndwi_water = NDWI.gt(0.3);
// 更新掩膜,仅保留值大于0.5的区域
var ndwi_water = ndwi_water.updateMask(mndwi_water.gt(0.5));
// 在地图上添加 MNDWI 水体掩膜图层
Map.addLayer(mndwi_water, { min: 0, max: 1, palette: ['white', 'blue'] }, 'mndwi_water_' + year, false);
// 在地图上添加 NDWI 水体掩膜图层
Map.addLayer(ndwi_water, { min: 0, max: 1, palette: ['white', 'blue'] }, 'ndwi_water_' + year, false);
// 定义一个用于导出水体指数图像的函数
function export_WaterIndex(image, description, roi, year) {
Export.image.toDrive({
image: image, // 要导出的图像
description: description + '_' + year, // 导出时的描述,包含年份
folder: '', // 指定导出的文件夹
region: roi, // 指定导出区域
scale: 30, // 像素分辨率为30米
crs: 'EPSG:4326', // 坐标参考系统设置为 WGS84
maxPixels: 1e13, // 最大像素设置
});
}
// 调用 export_WaterIndex 函数导出 MNDWI 水体掩膜
export_WaterIndex(mndwi_water, 'water_mndwi', roi, year);
// 调用 export_WaterIndex 函数导出 NDWI 水体掩膜
export_WaterIndex(ndwi_water, 'water_ndwi', roi, year);
}