<span class=“js_title_inner“>Sentinel-2动态监测青海湖</span>
·
今日分享:
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显示不出来。
下一步的想法就是覆盖整个研究区的影像生成一个数据集,然后再利用动图显示,这样才能显示青海湖的变化过程。
感谢关注,欢迎转发!
声明:仅供学习使用!
希望关注的朋友们转发,如果对你有帮助的话记得给小编点个赞或者在看!
更多推荐

所有评论(0)