一、引言
植被归一化差异指数(NDVI)是衡量植被生长状况和覆盖度的重要指标。通过分析 NDVI 的时间序列变化,可以了解植被的季节性和年际变化规律,对于生态环境监测、农业生产管理等领域具有重要意义。Google Earth Engine(GEE)是一个强大的地理空间分析平台,提供了丰富的卫星影像数据和高效的计算能力,能够方便地进行 NDVI 时间序列分析。本文将详细介绍如何使用 GEE 对北京市的植被 NDVI 进行时间序列分析,并生成可视化图表和导出数据。
二、代码实现
2.1 步骤 1:定义区域和时间范围
// ------------------------- 1. 定义区域和时间范围 ------------------------- //
// 定义研究区域,以北京市中心坐标 [116.3975, 39.9087] 为中心,创建一个半径为 10 公里的缓冲区
var roi = ee.Geometry.Point([116.3975, 39.9087]).buffer(10000);
// 将地图中心定位到研究区域,并设置缩放级别为 10
Map.centerObject(roi, 10);
// 在地图上添加研究区域的可视化图层,颜色设置为红色,标签为 'ROI'
Map.addLayer(roi, {color:'red'}, 'ROI');
// 定义数据获取的时间范围,从 2018 年 1 月 1 日到 2023 年 12 月 31 日
var startDate = '2018-01-01';
var endDate = '2023-12-31';
此步骤确定了研究区域和数据的时间范围。通过创建缓冲区定义研究区域,方便后续筛选符合条件的影像数据。
2.2 步骤 2:加载 Landsat 8 数据并去云
// ------------------------- 2. 加载Landsat 8数据并去云 ------------------------- //
// 从 GEE 的影像集合中加载 Landsat 8 的二级数据产品
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
// 筛选位于研究区域内的影像
.filterBounds(roi)
// 筛选时间范围内的影像
.filterDate(startDate, endDate)
// 过滤云量大于 20% 的影像
.filter(ee.Filter.lt('CLOUD_COVER', 20));
// 自定义云掩膜函数,使用 QA 波段去除云和阴影
var cloudMask = function(image) {
// 选择 QA 波段
var qa = image.select('QA_PIXEL');
// 定义云掩膜位
var cloudBitMask = 1 << 3;
// 定义阴影掩膜位
var shadowBitMask = 1 << 4;
// 创建掩膜,去除云和阴影
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(shadowBitMask).eq(0));
// 应用掩膜并裁剪到研究区域
return image.updateMask(mask).clip(roi);
};
// 对影像集合应用云掩膜
var landsatFiltered = landsat.map(cloudMask);
这里从 GEE 中加载 Landsat 8 数据,并通过云量筛选和自定义云掩膜函数去除云和阴影的影响,提高数据质量。
2.3 步骤 3:计算 NDVI 并生成时间序列
// ------------------------- 3. 计算NDVI并生成时间序列 ------------------------- //
// 定义 NDVI 计算函数
var calculateNDVI = function(image) {
// 计算 NDVI
var ndvi = image.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI');
// 将 NDVI 波段添加到影像中,并设置日期属性
return image.addBands(ndvi)
.set('date', image.date().format('YYYY-MM-dd'));
};
// 对去云后的影像集合逐景计算 NDVI
var ndviCollection = landsatFiltered.map(calculateNDVI);
此步骤定义了 NDVI 计算函数,并对去云后的影像集合逐景计算 NDVI,同时为每个影像添加日期属性,方便后续生成时间序列。
2.4 步骤 4:生成时间序列图表
// ------------------------- 4. 生成时间序列图表 ------------------------- //
// 生成时间序列图表(区域均值)
var chart = ui.Chart.image.seriesByRegion({
// 选择 NDVI 波段的影像集合
imageCollection: ndviCollection.select('NDVI'),
// 统计研究区域内的均值
regions: roi,
// 使用均值统计器
reducer: ee.Reducer.mean(),
// Landsat 分辨率
scale: 30,
// X 轴为日期
xProperty: 'date'
})
// 设置图表类型为折线图
.setChartType('LineChart')
// 设置图表选项
.setOptions({
// 图表标题
title: '北京市植被 NDVI 时间序列(2018 - 2023)',
// Y 轴标题和范围
vAxis: {title: 'NDVI', minValue: 0, maxValue: 1},
// X 轴标题和日期格式
hAxis: {title: '日期', format: 'YYYY-MM'},
// 线条宽度
lineWidth: 2,
// 线条颜色
colors: ['green']
});
// 打印图表
print(chart);
通过 ui.Chart.image.seriesByRegion 函数生成 NDVI 时间序列的折线图,展示北京市植被 NDVI 在 2018 - 2023 年的变化情况。
2.5 步骤 5:导出图表数据到 Google Drive
// ------------------------- 5. 可选:导出图表数据到Google Drive ------------------------- //
// 将时间序列数据导出为 CSV(用于进一步分析)
var exportTable = ndviCollection.select(['NDVI', 'date'])
.map(function(image) {
// 计算研究区域内的 NDVI 均值
var mean = image.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 30
});
// 创建特征,包含日期和 NDVI 均值
return ee.Feature(null, {
'date': image.get('date'),
'NDVI': mean.get('NDVI')
});
});
// 导出数据到 Google Drive
Export.table.toDrive({
collection: exportTable,
description: 'NDVI_TimeSeries_Beijing',
folder: 'GEE_Exports',
fileFormat: 'CSV'
});
print('代码执行完成!图表已生成,数据导出至 Google Drive。');
最后,将 NDVI 时间序列数据导出为 CSV 文件到 Google Drive,方便后续进行更深入的分析。
三、完整代码
// ------------------------- 1. 定义区域和时间范围 ------------------------- //
var roi = ee.Geometry.Point([116.3975, 39.9087]).buffer(10000); // 北京市中心10公里缓冲区
Map.centerObject(roi, 10); // 地图居中显示
Map.addLayer(roi, {color: 'red'}, 'ROI');
// 时间范围(示例:过去5年)
var startDate = '2018-01-01';
var endDate = '2023-12-31';
// ------------------------- 2. 加载Landsat 8数据并去云 ------------------------- //
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterBounds(roi)
.filterDate(startDate, endDate)
.filter(ee.Filter.lt('CLOUD_COVER', 20)); // 过滤云量>20%的图像
// 自定义云掩膜函数(使用QA波段去除云和阴影)
var cloudMask = function(image) {
var qa = image.select('QA_PIXEL');
var cloudBitMask = 1 << 3; // 云掩膜位
var shadowBitMask = 1 << 4; // 阴影掩膜位
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(shadowBitMask).eq(0));
return image.updateMask(mask).clip(roi);
};
// 应用云掩膜并选择NDVI波段
var landsatFiltered = landsat.map(cloudMask);
// ------------------------- 3. 计算NDVI并生成时间序列 ------------------------- //
// 定义NDVI计算函数
var calculateNDVI = function(image) {
var ndvi = image.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI');
return image.addBands(ndvi)
.set('date', image.date().format('YYYY-MM-dd')); // 添加日期属性
};
// 对影像集合逐景计算NDVI
var ndviCollection = landsatFiltered.map(calculateNDVI);
// ------------------------- 4. 生成时间序列图表 ------------------------- //
// 生成时间序列图表(区域均值)
var chart = ui.Chart.image.seriesByRegion({
imageCollection: ndviCollection.select('NDVI'),
regions: roi, // 统计ROI范围内的均值
reducer: ee.Reducer.mean(),
scale: 30, // Landsat分辨率
xProperty: 'date' // X轴为日期
})
.setChartType('LineChart') // 折线图
.setOptions({
title: '北京市植被NDVI时间序列(2018-2023)',
vAxis: {title: 'NDVI', minValue: 0, maxValue: 1},
hAxis: {title: '日期', format: 'YYYY-MM'},
lineWidth: 2,
colors: ['green']
});
// 打印图表
print(chart);
// ------------------------- 5. 可选:导出图表数据到Google Drive ------------------------- //
// 将时间序列数据导出为CSV(用于进一步分析)
var exportTable = ndviCollection.select(['NDVI', 'date'])
.map(function(image) {
var mean = image.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 30
});
return ee.Feature(null, {
'date': image.get('date'),
'NDVI': mean.get('NDVI')
});
});
Export.table.toDrive({
collection: exportTable,
description: 'NDVI_TimeSeries_Beijing',
folder: 'GEE_Exports',
fileFormat: 'CSV'
});
print('代码执行完成!图表已生成,数据导出至Google Drive。');
四、结果展示:

423

被折叠的 条评论
为什么被折叠?



