在GEE平台上分别利用Landsat和哨兵系列遥感影像对数据进行统一预处理预处理,然后提取水体面积结合DEM反演水位并构建反演模型来估算断面流量
这是之前尝试过的代码,但有部分出错且结果不对,需要更改帮助
landsat5789水体提取
// 1. 初始化检查
if (typeof roi === 'undefined' || typeof dam === 'undefined') {
print('🛑 【严重错误】: 请先在地图上画 roi 和 dam!');
print('👉 1. 画多边形包住三峡库区,重命名为 roi');
print('👉 2. 画多边形在大坝区域,重命名为 dam');
} else {
Map.centerObject(roi, 11);
Map.setOptions("TERRAIN");
}
// 2. 参数设置(三峡专属)
var START_DATE = '1984-01-01';
var END_DATE = '2025-12-27';
var MAX_CLOUD_COVER = 30;
var NDWI_THRESHOLD = 0.1; // 三峡水体NDWI阈值优化
var WATER_LEVEL_MAX = 175; // 三峡正常蓄水位
var WATER_LEVEL_MIN = 145; // 三峡枯水期水位
// 3. 核心函数:去云(增强版)+ 水体提取
function maskLsr(image) {
var qa = image.select('QA_PIXEL');
// 位操作:云(Bit3)、云影(Bit4)、雪(Bit5)、气溶胶(Bit6)
var mask = qa.bitwiseAnd(1 << 3).eq(0)
.and(qa.bitwiseAnd(1 << 4).eq(0))
.and(qa.bitwiseAnd(1 << 5).eq(0))
.and(qa.bitwiseAnd(1 << 6).eq(0));
return image.updateMask(mask).copyProperties(image, ["system:time_start"]);
}
var waterfunction = function(image){
// 适配Landsat5/7/8波段差异
var green = ee.Algorithms.If(image.bandNames().contains('B3'), image.select('B3'), image.select('B2'));
var nir = ee.Algorithms.If(image.bandNames().contains('B5'), image.select('B5'), image.select('B4'));
var ndwi = ee.Image.cat(green, nir).normalizedDifference([0,1]).rename('NDWI');
// 优化阈值:NDWI > 0.1 判定为水
var water = ndwi.gt(NDWI_THRESHOLD).rename('Water');
return image.addBands(water).addBands(ndwi);
};
// 4. 数据加载与处理(修复语法错误)
var l5 = ee.ImageCollection('LANDSAT/LC05/C02/T1_TOA');
var l7 = ee.ImageCollection('LANDSAT/LC07/C02/T1_TOA');
var l8= ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var landsat = l8.merge(l7).merge(l5) // 修复少写的.
.filterBounds(roi)
.filterDate(START_DATE, END_DATE)
.filter(ee.Filter.lt('CLOUD_COVER', MAX_CLOUD_COVER))
.map(function(image){ return image.clip(roi); })
.map(maskLsr)
.map(waterfunction)
.sort('system:time_start');
print('筛选到的 Landsat 影像数量:', landsat.size());
// 5. 数据清洗(三峡高程适配)
var Water_Clean = function(img) {
var water = img.select('Water');
var srtm = ee.Image("USGS/SRTMGL1_003").clip(roi).rename('Elevation');
// 去除小斑块 + 三峡高程范围过滤
var minSize = 500;
var count = water.connectedPixelCount(minSize);
var filtered = water.where(count.lt(minSize).or(srtm.gt(WATER_LEVEL_MAX)).or(srtm.lt(WATER_LEVEL_MIN)), 0);
return img.addBands(filtered.rename('Water_Clean'), null, true);
};
landsat = landsat.map(Water_Clean);
// 6. 面积与水位计算(修正水位逻辑)
var Water_Calc = function(img) {
var water = img.select('Water_Clean');
var srtm = ee.Image("USGS/SRTMGL1_003").clip(roi).rename('Elevation');
// 计算面积 (km2)
var area = water.multiply(ee.Image.pixelArea()).divide(1e6)
.reduceRegion({
reducer: ee.Reducer.sum(),
geometry: roi,
scale: 30,
bestEffort: true,
maxPixels: 1e13
}).get('Water_Clean');
// 水位计算:取大坝区域水面高程的均值(比最大值更合理)
var srtm_masked = srtm.updateMask(water).updateMask(srtm.gte(WATER_LEVEL_MIN).and(srtm.lte(WATER_LEVEL_MAX)));
var mean_elev = srtm_masked.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: dam,
scale: 30,
bestEffort: true,
maxPixels: 1e13
}).get('Elevation');
var water_level = ee.Algorithms.If(mean_elev, mean_elev, 0);
var water_depth = ee.Number(water_level).subtract(145); // 三峡库底约145m
return ee.Feature(null, {
'system:time_start': img.get('system:time_start'),
'date': img.date().format('YYYY-MM-dd'),
'area_km2': area,
'water_level_m': water_level,
'water_depth_m': water_depth
});
};
var resultTable = landsat.map(Water_Calc);
// 7. 结果展示 + 导出
var chart = ui.Chart.feature.byFeature(resultTable, 'system:time_start', 'area_km2')
.setOptions({
title: '三峡水库水体面积 (Landsat 5/7/8)',
hAxis: {title: '日期'},
vAxis: {title: '面积 (km²)'},
lineWidth: 2,
pointSize: 4,
color: 'blue'
});
print(chart);
Export.table.toDrive({
collection: resultTable,
description: 'ThreeGorges_Water_Data_Landsat',
fileFormat: 'CSV',
selectors: ['date', 'area_km2', 'water_level_m', 'water_depth_m']
});