今日分享:

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显示不出来。

下一步的想法就是覆盖整个研究区的影像生成一个数据集,然后再利用动图显示,这样才能显示青海湖的变化过程。

感谢关注,欢迎转发!

声明:仅供学习使用!

希望关注的朋友们转发,如果对你有帮助的话记得给小编点个赞或者在看

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐