今日分享:
Sentinel-2动态监测青海湖
今天来分享下如何利用Sentinel-2动态监测青海湖:
之前在学习的过程中,看到有人利用landsat数据监测某个水库,利用影像的动态变化生成了动图,看着挺有意思。
所以今天想利用Sentinel-2来做一个青海湖的变化动图。所以废话不多说,直接上代码。(ps:用的也是比较常规的方法)
01
—
GEE部分代码
Map.centerObject(roi)
Map.addLayer(roi);
// (2) Define time filter (change the start and end dates):
var sDate_T1 = "2025-03-01";
var eDate_T1 = "2025-10-01";
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);
}
// (3) Optionally modify the classification parameters:
var mndwi_param = -0.40;
var ndvi_param = 0.20;
var cleaning_pixels = 100;
var bn8 = ['B2', 'B3', 'B4', 'B11', 'B8', 'B12'];
var bns = [ 'Blue', 'Green', 'Red', 'Swir1', 'Nir', 'Swir2'];
var tempCol = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate(sDate_T1, eDate_T1)
.filterBounds(roi)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',5))
.map(maskS2clouds)
.map(function(image){
return(image.clip(roi).clamp(-1,1))
})
.select(bn8, bns);
print(tempCol)
// 设置分类函数:
var Ndvi = function(image) {
// calculate normalized difference vegetation index
var ndvi = image.normalizedDifference(['Nir', 'Red']).rename('ndvi');
return(ndvi);
};
var Lswi = function(image) {
// calculate land surface water index
var lswi = image.normalizedDifference(['Nir', 'Swir1']).rename('lswi');
return(lswi);
};
var Mndwi = function(image) {
// calculate modified normalized difference water index
var mndwi = image.normalizedDifference(['Green', 'Swir1']).rename('mndwi');
return(mndwi);
};
var Evi = function(image) {
// calculate the enhanced vegetation index
var evi = image.expression('2.5 * (Nir - Red) / (1 + Nir + 6 * Red - 7.5 * Blue)', {
'Nir': image.select(['Nir']),
'Red': image.select(['Red']),
'Blue': image.select(['Blue'])
});
return(evi.rename(['evi']));
};
// 设置可视化参数:
var params_true = {crs: 'EPSG:4326', region: roi, min: 0.0, max: 0.3, bands: ["Red", "Green", "Blue"], dimensions: 1000};
var params_false = {crs: 'EPSG:4326', region: roi, min: 0.0, max: 0.3, bands: ["Swir1", "Red", "Green"], dimensions: 1000};
var params_waterViz = {crs: 'EPSG:4326', region: roi, min: 0, max: 1, palette: ['white', 'blue'],dimensions: 1000};
var params_activebeltViz = {crs: 'EPSG:4326', region: roi, min: 0, max: 1, palette: ['white', 'grey'],dimensions: 1000};
var params_activeViz = {crs: 'EPSG:4326', region: roi, min: 0, max: 1, palette: ['white', 'grey'],dimensions: 1000};
var waterViz = {min: 0, max: 1, palette: ['white', 'blue']};
var activebeltViz = {min: 0, max: 1, palette: ['white', 'grey']};
var activeViz = {min: 0, max: 1, palette: ['white', 'MediumOrchid ']};
var active_cleanedViz = {min: 0, max: 1, palette: ['white', 'OrangeRed ']};
print(tempCol.size(),'SR:使用的 S2图块数量');
var bns = [ 'Blue', 'Green', 'Red', 'Swir1', 'Nir', 'Swir2'];
var bnp50 = [ 'Blue_p50', 'Green_p50', 'Red_p50', 'Swir1_p50', 'Nir_p50', 'Swir2_p50'];
var p50 = tempCol.reduce(ee.Reducer.percentile([50])).select(bnp50, bns);
// 对 GIF 图像集合进行排序:
var sorted = tempCol.sort('CLOUDY_PIXEL_PERCENTAGE');
var scene = sorted.first()//.multiply(0.0001);
// Apply to each percentile:
var mndwi_p50 = Mndwi(p50);
var ndvi_p50 = Ndvi(p50);
var evi_p50 = Evi(p50);
var lswi_p50 = Lswi(p50);
// Water classification from (Zou 2018):
var water_p50 = (mndwi_p50.gt(ndvi_p50).or(mndwi_p50.gt(evi_p50))).and(evi_p50.lt(0.1));
var waterMasked_p50 = water_p50.updateMask(water_p50.gt(0));
// Active river belt classification:
var activebelt_p50 = (mndwi_p50.gte(mndwi_param)).and(ndvi_p50.lte(ndvi_param));
var activebeltMasked_p50 = activebelt_p50.updateMask(activebelt_p50.gt(0));
var active_p50 = (water_p50).or(activebelt_p50);
// Clean binary active channel:
var smooth_map_p50 = active_p50
.focal_mode({
radius: 10, kernelType: 'octagon', units: 'pixels', iterations: 1
})
.mask(active_p50.gte(1));
var noise_removal_p50 = active_p50
.updateMask(active_p50.connectedPixelCount(cleaning_pixels, false).gte(cleaning_pixels))
.unmask(smooth_map_p50);
var noise_removal_p50_Masked = noise_removal_p50.updateMask(noise_removal_p50.gt(0));
// Define outputs:
var True_colour = p50.select(["Red", "Green", "Blue"]);
var False_colour = p50.select(["Swir1", "Red", "Green"]);
var Alluvial_deposits = activebeltMasked_p50;
var Wetted_channel = waterMasked_p50;
var Active_channel_binary_mask = noise_removal_p50_Masked;
var cloudy = tempCol.filterDate(sDate_T1, eDate_T1)
.filterBounds(roi)
.map(function(image) {
return image.clip(roi)//.multiply(0.0001)
});
// Display on map:
Map.addLayer(True_colour.clip(roi), params_true, '真彩色合成', false);
Map.addLayer(False_colour.clip(roi), params_false, '假彩色合成', true);
Map.addLayer(Wetted_channel.clip(roi), waterViz, '水体', false);
Map.addLayer(Alluvial_deposits.clip(roi), activebeltViz, '冲积区域', false);
Map.addLayer(Active_channel_binary_mask.clip(roi), activebeltViz, '变化区域', true);
// 可视化参数。
var gif_true = {
crs: 'EPSG:4326', // Mercator投影
dimensions: '400',
region: roi,
min: 0,
max: 0.3,
bands: ["Red", "Green", "Blue"],
framesPerSecond: 2,
};
var gif_false = {
crs: 'EPSG:4326',
dimensions: '600',
region: roi,
min: 0,
max: 0.3,
bands: ["Swir1", "Red", "Green"],
framesPerSecond: 2,
};
print(ui.Thumbnail(tempCol, gif_true),"真彩色图像集 GIF");
print(ui.Thumbnail(tempCol, gif_false),"假彩色图像集GIF");
print(ui.Thumbnail(True_colour, params_true),"真彩色合成图像");
print(ui.Thumbnail(False_colour, params_false),"假彩色合成图像");
02
—
结果显示
水体部分提取
动图从结果上看,有点不太好,总是有缺失,之前的想法是动图显示筛选了包含研究区的所有影像。并且还有一个问题就是这样时间跨度不能选择太大,不然GEE显示不出来。
下一步的想法就是覆盖整个研究区的影像生成一个数据集,然后再利用动图显示,这样才能显示青海湖的变化过程。
感谢关注,欢迎转发!
声明:仅供学习使用!
希望关注的朋友们转发,如果对你有帮助的话记得给小编点个赞或者在看!
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...