// 示例:加载Sentinel-2影像(2022年,与研究区域匹配)
var sentinel2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED')
.filterDate('2019-01-25', '2019-12-31')
.filterBounds(geometry) // geometry为用户定义的矢量区域
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)) // 筛选云量低的影像
.median(); // 取中值合成影像
// 以Sentinel-2为例
var ndvi = sentinel2.normalizedDifference(['B8', 'B4']).rename('NDVI');
var ndwi = sentinel2.normalizedDifference(['B3', 'B8']).rename('NDWI');
// 裁剪到研究区域
var ndviClip = ndvi.clip(geometry);
var ndwiClip = ndwi.clip(geometry);
// NDVI可视化参数(范围-1到1)
var ndviParams = {min: -1, max: 1, palette: ['red', 'yellow', 'green']};
// NDWI可视化参数(范围-1到1)
var ndwiParams = {min: -1, max: 1, palette: ['white', 'blue']};
Map.centerObject(geometry, 10);
Map.addLayer(ndviClip, ndviParams, '2019年NDVI');
Map.addLayer(ndwiClip, ndwiParams, '2019年NDWI');
// 定义通用统计参数
var statsParams = {
geometry: geometry,
scale: 10,
maxPixels: 1e13,
bestEffort: true
};
// 计算NDVI统计值(显式传递参数)
var ndviStats = ndviClip.reduceRegion({
reducer: ee.Reducer.minMax().combine({
reducer2: ee.Reducer.mean(),
sharedInputs: true
}),
geometry: statsParams.geometry,
scale: statsParams.scale,
maxPixels: statsParams.maxPixels,
bestEffort: statsParams.bestEffort
});
// 计算NDWI统计值(显式传递参数)
var ndwiStats = ndwiClip.reduceRegion({
reducer: ee.Reducer.minMax().combine({
reducer2: ee.Reducer.mean(),
sharedInputs: true
}),
geometry: statsParams.geometry,
scale: statsParams.scale,
maxPixels: statsParams.maxPixels,
bestEffort: statsParams.bestEffort
});
// 打印结果
print('2019年NDVI 范围:', ndviStats);
print('2019年NDWI 范围:', ndwiStats);
// 修正后的MVI计算函数(使用B3、B8、B11波段)
function calMvI(img) {
var green = img.select("B3"); // B3: 绿光
var nir = img.select("B8"); // B8: 近红外
var swir1 = img.select("B11"); // B11: 短波红外1
var numerator = nir.subtract(green).abs(); // |NIR - Green|
var denominator = swir1.subtract(green).abs(); // |SWIR1 - Green|
var mvi = numerator.divide(denominator).rename('MVI');
return mvi;
}
// 加载Sentinel-2影像(去云处理)
var sentinel2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED')
.filterDate('2019-01-01', '2019-12-31')
.filterBounds(geometry)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))
.median();
// 计算MVI
var mviImage = calMvI(sentinel2).clip(geometry);
// MVI可视化参数
// 步骤1:计算MVI并可视化(辅助定位)
var mviParams = {min: 0, max: 5, palette: ['white', 'yellow', 'green']};
Map.addLayer(mviImage.clip(geometry), mviParams, '2019年MVI 指数');
Map.centerObject(geometry, 10);
// 步骤2:点击地图触发查询
Map.onClick(function(lonlat) {
// 获取点击位置的坐标
var point = ee.Geometry.Point([lonlat.lon, lonlat.lat]);
// 采样MVI值
var mviValue = mviImage.sample(point, 10).first().get('MVI');
// 打印结果
print('点击位置坐标:', point);
print('2019年MVI 值:', mviValue);
});
//高程值
var delta_dtm = ee.Image("projects/sat-io/open-datasets/DELTARES/deltadtm_v1");
var elevation = delta_dtm.select('b1').clip(geometry);
elevation = elevation.updateMask(elevation.neq(10));
var elevationVis = {
min: 0,
max: 10.0,
// cmocean deep
palette: ["281a2c", "3f396c", "3e6495", "488e9e", "5dbaa4", "a5dfa7", "fdfecc"]
};
Map.addLayer(elevation, elevationVis, 'DeltaDTM');
// 定义点击事件函数
var onClick = function(coords) {
var point = ee.Geometry.Point(coords.lon, coords.lat);
// 从高程图中提取点击位置的值
var value = elevation.reduceRegion({
reducer: ee.Reducer.first(),
geometry: point,
scale: 30 // 匹配数据分辨率
}).get('b1');
// 打印结果(单位:米)
value.evaluate(function(val) {
print('高程值 (米):', val);
});
};
// 绑定点击事件
Map.onClick(onClick);
// 设定MVI阈值(根据研究区域调整)
var mviThreshold =6.5;
var elevationMin = 0;
var elevationMax = 5;
// 生成红树林二值掩膜
var mangrovesMask= mviImage.gt(mviThreshold)
.and(elevation.gte(elevationMin))
.and(elevation.lte(elevationMax))
.rename('Mangroves');
// 方法:过滤掉值为0的区域(仅保留红树林区域)
var maskedMangroves = mangrovesMask.updateMask(mangrovesMask.neq(0));
var mangroveVis = {
min: 1, // 仅显示值为1的区域
max: 1,
palette: ['#228B22'] // 直接指定绿色
};
Map.addLayer(maskedMangroves, mangroveVis, '2019年红树林分布');
// 将二值掩膜转换为面积(平方米)
var areaImage = mangrovesMask.multiply(ee.Image.pixelArea());
// 统计研究区域内的总面积
var areaStats = areaImage.reduceRegion({
reducer: ee.Reducer.sum(),
geometry: geometry,
scale: 10, // Sentinel-2分辨率(米)
maxPixels: 1e13 // 提高计算上限
});
// 转换为公顷(1公顷=10,000平方米)
var areaHectares = ee.Number(areaStats.get('Mangroves')).divide(1e4);
print('2019年红树林面积(公顷):', areaHectares);
// 示例:加载Sentinel-2影像(2022年,与研究区域匹配)
var sentinel2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED')
.filterDate('2022-01-25', '2022-12-31')
.filterBounds(geometry) // geometry为用户定义的矢量区域
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)) // 筛选云量低的影像
.median(); // 取中值合成影像
// 以Sentinel-2为例
var ndvi = sentinel2.normalizedDifference(['B8', 'B4']).rename('NDVI');
var ndwi = sentinel2.normalizedDifference(['B3', 'B8']).rename('NDWI');
// 裁剪到研究区域
var ndviClip = ndvi.clip(geometry);
var ndwiClip = ndwi.clip(geometry);
// NDVI可视化参数(范围-1到1)
var ndviParams = {min: -1, max: 1, palette: ['red', 'yellow', 'green']};
// NDWI可视化参数(范围-1到1)
var ndwiParams = {min: -1, max: 1, palette: ['white', 'blue']};
Map.centerObject(geometry, 10);
Map.addLayer(ndviClip, ndviParams, '2022年NDVI');
Map.addLayer(ndwiClip, ndwiParams, '2022年NDWI');
// 定义通用统计参数
var statsParams = {
geometry: geometry,
scale: 10,
maxPixels: 1e13,
bestEffort: true
};
// 计算NDVI统计值(显式传递参数)
var ndviStats = ndviClip.reduceRegion({
reducer: ee.Reducer.minMax().combine({
reducer2: ee.Reducer.mean(),
sharedInputs: true
}),
geometry: statsParams.geometry,
scale: statsParams.scale,
maxPixels: statsParams.maxPixels,
bestEffort: statsParams.bestEffort
});
// 计算NDWI统计值(显式传递参数)
var ndwiStats = ndwiClip.reduceRegion({
reducer: ee.Reducer.minMax().combine({
reducer2: ee.Reducer.mean(),
sharedInputs: true
}),
geometry: statsParams.geometry,
scale: statsParams.scale,
maxPixels: statsParams.maxPixels,
bestEffort: statsParams.bestEffort
});
// 打印结果
print('2022年NDVI 范围:', ndviStats);
print('2022年NDWI 范围:', ndwiStats);
// 修正后的MVI计算函数(使用B3、B8、B11波段)
function calMvI(img) {
var green = img.select("B3"); // B3: 绿光
var nir = img.select("B8"); // B8: 近红外
var swir1 = img.select("B11"); // B11: 短波红外1
var numerator = nir.subtract(green).abs(); // |NIR - Green|
var denominator = swir1.subtract(green).abs(); // |SWIR1 - Green|
var mvi = numerator.divide(denominator).rename('MVI');
return mvi;
}
// 加载Sentinel-2影像(去云处理)
var sentinel2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED')
.filterDate('2022-01-01', '2022-12-31')
.filterBounds(geometry)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))
.median();
// 计算MVI
var mviImage = calMvI(sentinel2).clip(geometry);
// MVI可视化参数
// 步骤1:计算MVI并可视化(辅助定位)
var mviParams = {min: 0, max: 5, palette: ['white', 'yellow', 'green']};
Map.addLayer(mviImage.clip(geometry), mviParams, 'MVI 指数');
Map.centerObject(geometry, 10);
// 步骤2:点击地图触发查询
Map.onClick(function(lonlat) {
// 获取点击位置的坐标
var point = ee.Geometry.Point([lonlat.lon, lonlat.lat]);
// 采样MVI值
var mviValue = mviImage.sample(point, 10).first().get('2022年MVI');
// 打印结果
print('点击位置坐标:', point);
print('2022年MVI 值:', mviValue);
});
//高程值
var delta_dtm = ee.Image("projects/sat-io/open-datasets/DELTARES/deltadtm_v1");
var elevation = delta_dtm.select('b1').clip(geometry);
elevation = elevation.updateMask(elevation.neq(10));
var elevationVis = {
min: 0,
max: 10.0,
// cmocean deep
palette: ["281a2c", "3f396c", "3e6495", "488e9e", "5dbaa4", "a5dfa7", "fdfecc"]
};
Map.addLayer(elevation, elevationVis, 'DeltaDTM');
// 定义点击事件函数
var onClick = function(coords) {
var point = ee.Geometry.Point(coords.lon, coords.lat);
// 从高程图中提取点击位置的值
var value = elevation.reduceRegion({
reducer: ee.Reducer.first(),
geometry: point,
scale: 30 // 匹配数据分辨率
}).get('b1');
// 打印结果(单位:米)
value.evaluate(function(val) {
print('高程值 (米):', val);
});
};
// 绑定点击事件
Map.onClick(onClick);
// 设定MVI阈值(根据研究区域调整)
var mviThreshold =6.5;
var elevationMin = 0;
var elevationMax = 5;
// 生成红树林二值掩膜
var mangrovesMask= mviImage.gt(mviThreshold)
.and(elevation.gte(elevationMin))
.and(elevation.lte(elevationMax))
.rename('Mangroves');
// 方法:过滤掉值为0的区域(仅保留红树林区域)
var maskedMangroves = mangrovesMask.updateMask(mangrovesMask.neq(0));
var mangroveVis = {
min: 1, // 仅显示值为1的区域
max: 1,
palette: ['#228B22'] // 直接指定绿色
};
Map.addLayer(maskedMangroves, mangroveVis, '2022年红树林分布');
// 将二值掩膜转换为面积(平方米)
var areaImage = mangrovesMask.multiply(ee.Image.pixelArea());
// 统计研究区域内的总面积
var areaStats = areaImage.reduceRegion({
reducer: ee.Reducer.sum(),
geometry: geometry,
scale: 10, // Sentinel-2分辨率(米)
maxPixels: 1e13 // 提高计算上限
});
// 转换为公顷(1公顷=10,000平方米)
var areaHectares = ee.Number(areaStats.get('Mangroves')).divide(1e4);
print('2022年红树林面积(公顷):', areaHectares);
现在绘制了2022年和2019年的红树林面积,如何在源代码基础上分别在不同图层绘制19-22年红树林的增加面积,退化面积,稳定面积的图,