基于 Google Earth Engine 的北京市植被 NDVI 时间序列分析

一、引言

植被归一化差异指数(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。');

四、结果展示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遥感AI实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值