内蒙古河口镇河流面积变化分析
在本博客中,我们将介绍如何使用Google Earth Engine(GEE)对指定湖泊面积变化进行分析。通过一段代码,我们将实现以下功能:定义感兴趣区域(ROI)、加载MODIS影像数据、计算归一化水体指数(NDWI)、生成NDWI直方图以及估算湖泊面积随时间的变化。
1. 定义感兴趣区域(ROI)
首先,我们需要定义一个多边形区域,作为我们分析的基础。以下是我们所选择的坐标:
var cor = [
[76.34529839412173, 12.595724516920036],
[76.34529839412173, 12.355709984336483],
[76.68656121150454, 12.355709984336483],
[76.68656121150454, 12.595724516920036] // 闭合多边形
];
通过这些坐标,我们创建了一个几何多边形对象,并将其添加到地图中进行可视化:
var roi = ee.Geometry.Polygon(cor);
Map.addLayer(roi, {}, 'ROI'); // 将ROI添加到地图上
Map.centerObject(roi); // 将地图中心移动到ROI
2. 时间范围与数据加载
接下来,我们定义分析的时间范围,并加载MODIS影像数据。我们选择的时间范围是从2001年到2023年:
var time_start = '2001';
var time_end = '2023';
var modis = ee.ImageCollection("MODIS/061/MOD09A1")
.filterDate(time_start, time_end); // 过滤出指定时间范围的影像数据
3. 计算NDWI(归一化水体指数)
NDWI是一个用于监测水体的指标。我们将对MODIS影像集合进行映射,计算每幅影像的NDWI:
var ndwi = modis.map(function(img) {
var band = img.select('sur.*').multiply(0.0001; // 选择表面反射率波段并缩放
var index = band.normalizedDifference(['sur_refl_b04', 'sur_refl_b02']).rename('ndwi'); // 计算NDWI
return index.copyProperties(img, img.propertyNames()); // 复制原影像的属性
});
我们还可以选择可视化某一年的NDWI堆叠,以下代码默认关闭:
Map.addLayer(ndwi.filterDate('2010', '2011').toBands().clip(roi), {}, 'NDWI 2010-2011', false);
4. NDWI的直方图(针对2010-2011年)
为了更好地理解NDWI的分布,我们可以生成一个直方图,显示2010-2011年间NDWI的变化:
var ndwi_average = ndwi.filterDate('2010', '2011').median(); // 计算NDWI的中位数影像
print(
ui.Chart.image.histogram(ndwi_average, roi, 500) // 创建直方图
.setOptions({title: 'NDWI Histogram (2010-2011)', hAxis: {title: 'NDWI'}, vAxis: {title: 'Pixel Count'}}) // 设置直方图选项
);
5. 估算湖泊面积随时间变化
最后,我们将估算湖泊面积,并绘制其随时间变化的图表。我们使用NDWI的阈值来识别水体:
var lake_area = ndwi.map(function(img) {
var waterMask = img.gt(0.1); // 使用NDWI > 0.1作为水体阈值
var masked = waterMask.updateMask(waterMask); // 更新掩膜
var area = masked.multiply(ee.Image.pixelArea().divide(1e6)); // 计算面积(单位为km²)
return area.copyProperties(img, img.propertyNames()); // 复制原影像的属性
});
最后,我们将湖泊面积随时间变化的图表打印出来:
print(
ui.Chart.image.series(
lake_area, roi, ee.Reducer.sum(), 500, 'system:time_start' // 计算每个时间点的湖泊面积
).setOptions({
title: 'Estimated Water Body Area Over Time', // 图表标题
vAxis: {title: 'Area (km²)'}, // Y轴标题
hAxis: {title: 'Date'} // X轴标题
})
);
总结
通过以上步骤,我们成功地定义了感兴趣区域,加载了MODIS影像数据,计算了NDWI,并估算了湖泊面积随时间的变化。这些分析为我们理解内蒙古河口镇的水体变化提供了重要的科学依据。希望这篇博客能够帮助您更好地利用Google Earth Engine进行环境监测和分析!
全部代码
// -------------------------------
// 1. 定义感兴趣区域(ROI)
// -------------------------------
// 定义一个多边形区域的坐标
var cor = [
[76.34529839412173, 12.595724516920036], // 多边形的第一个顶点
[76.34529839412173, 12.355709984336483], // 多边形的第二个顶点
[76.68656121150454, 12.355709984336483], // 多边形的第三个顶点
[76.68656121150454, 12.595724516920036] // 多边形的第四个顶点(闭合多边形)
];
// 创建一个几何多边形对象
var roi = ee.Geometry.Polygon(cor);
// 可视化感兴趣区域(ROI)
Map.addLayer(roi, {}, 'ROI'); // 将ROI添加到地图上,默认样式
Map.centerObject(roi); // 将地图中心移动到ROI
// -------------------------------
// 2. 时间范围与数据加载
// -------------------------------
// 定义时间范围
var time_start = '2001'; // 开始年份
var time_end = '2023'; // 结束年份
// 加载MODIS影像集合,并根据时间范围进行过滤
var modis = ee.ImageCollection("MODIS/061/MOD09A1")
.filterDate(time_start, time_end); // 过滤出2001年至2023年的影像数据
// -------------------------------
// 3. 计算NDWI(归一化水体指数)
// -------------------------------
// 对MODIS影像集合进行映射,计算NDWI
var ndwi = modis.map(function(img) {
var band = img.select('sur.*').multiply(0.0001); // 选择表面反射率波段并缩放
var index = band.normalizedDifference(['sur_refl_b04', 'sur_refl_b02']).rename('ndwi'); // 计算NDWI
return index.copyProperties(img, img.propertyNames()); // 复制原影像的属性
});
// 可选:可视化某一年的NDWI堆叠(默认关闭)
Map.addLayer(ndwi.filterDate('2010', '2011').toBands().clip(roi), {}, 'NDWI 2010-2011', false);
// -------------------------------
// 4. NDWI的直方图(针对2010-2011年)
// -------------------------------
// 计算2010-2011年NDWI的中位数影像
var ndwi_average = ndwi.filterDate('2010', '2011').median();
// 打印NDWI直方图
print(
ui.Chart.image.histogram(ndwi_average, roi, 500) // 创建直方图
.setOptions({title: 'NDWI Histogram (2010-2011)', hAxis: {title: 'NDWI'}, vAxis: {title: 'Pixel Count'}}) // 设置直方图选项
);
// -------------------------------
// 5. 估算湖泊面积随时间变化
// -------------------------------
// 计算每个影像的湖泊面积
var lake_area = ndwi.map(function(img) {
var waterMask = img.gt(0.1); // 使用NDWI > 0.1作为水体阈值
var masked = waterMask.updateMask(waterMask); // 更新掩膜
var area = masked.multiply(ee.Image.pixelArea().divide(1e6)); // 计算面积(单位为km²)
return area.copyProperties(img, img.propertyNames()); // 复制原影像的属性
});
// 绘制湖泊面积随时间变化的图表
print(
ui.Chart.image.series(
lake_area, roi, ee.Reducer.sum(), 500, 'system:time_start' // 计算每个时间点的湖泊面积
).setOptions({
title: 'Estimated Water Body Area Over Time', // 图表标题
vAxis: {title: 'Area (km²)'}, // Y轴标题
hAxis: {title: 'Date'} // X轴标题
})
);
代码功能总结
该代码实现了以下功能:
- 定义感兴趣区域:通过多边形定义了一个地理区域。
- 数据加载:从MODIS影像集合中加载了2001年至2023年的数据。
- 计算NDWI:使用MODIS影像计算归一化水体指数(NDWI),以识别水体。
- 生成直方图:可视化2010-2011年NDWI的分布。
- 估算湖泊面积:计算并绘制湖泊面积随时间的变化趋势。