今日分享:
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 indexvar ndvi = image.normalizedDifference(['Nir', 'Red']).rename('ndvi');return(ndvi);};var Lswi = function(image) {// calculate land surface water indexvar lswi = image.normalizedDifference(['Nir', 'Swir1']).rename('lswi');return(lswi);};var Mndwi = function(image) {// calculate modified normalized difference water indexvar mndwi = image.normalizedDifference(['Green', 'Swir1']).rename('mndwi');return(mndwi);};var Evi = function(image) {// calculate the enhanced vegetation indexvar 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显示不出来。
下一步的想法就是覆盖整个研究区的影像生成一个数据集,然后再利用动图显示,这样才能显示青海湖的变化过程。
感谢关注,欢迎转发!
声明:仅供学习使用!
希望关注的朋友们转发,如果对你有帮助的话记得给小编点个赞或者在看!
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……




还没有评论,来说两句吧...