You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正Google Earth Engine代码以获取研究区的正NDVI值?

修正NDVI多数为负值的问题

核心问题分析

你的代码直接使用未预处理的Landsat7原始影像,导致NDVI异常:

  • 未转换为地表反射率:Landsat7 Level-1数据是DN值,不是实际反射率,直接计算会出现无效值
  • 未过滤云与干扰像素:云、云阴影、雪的像素会使NDVI为负
  • 未处理SLC-off条带:2003年5月后Landsat7存在传感器故障,影像有大量条带缺失,引入无效数据

修正后的代码

var startDate = '2001-01-01';
var endDate = '2020-12-31';

// 使用Landsat7地表反射率产品(已完成大气校正)
var images = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2')
  .filter(ee.Filter.date(startDate, endDate))
  // 过滤云、云阴影、雪等干扰像素
  .map(function(image) {
    var qa = image.select('QA_PIXEL');
    // 基于位掩码生成有效像素掩码
    var cloudShadowMask = qa.bitwiseAnd(1 << 3).eq(0);
    var cloudMask = qa.bitwiseAnd(1 << 5).eq(0);
    var snowMask = qa.bitwiseAnd(1 << 4).eq(0);
    var validMask = cloudShadowMask.and(cloudMask).and(snowMask);
    
    // 将L2产品的SR波段转换为实际反射率
    var reflectance = image.select('SR_B.*').multiply(0.0000275).add(-0.2);
    return reflectance.updateMask(validMask)
      .copyProperties(image, ['system:index', 'system:time_start']);
  })
  // 可选:过滤2003年5月后的SLC故障影像,或用gapFill填充条带
  .filter(ee.Filter.lt('system:time_start', ee.Date('2003-05-31').millis()));

// 计算NDVI(L2产品中SR_B4是近红外,SR_B3是红波段)
var ndvi = images.map(function(image) {
  var ndv = image.normalizedDifference(['SR_B4', 'SR_B3']);
  return ndv.copyProperties(image, ['system:index', 'system:time_start'])
    .rename('NDVI');
});

var nd = ndvi.max().clip(finni);

Map.addLayer(nd, {min:0, max:1, palette:['white', 'Green']}, 'NDVI');

var chart = ui.Chart.image.seriesByRegion({
  imageCollection: ndvi,
  regions: finni,
  reducer: ee.Reducer.mean(),
  scale: 30,
  xProperty: 'system:time_start' // 明确指定时间轴属性
});

print(chart);

关键修正说明

  • 改用L2反射率产品:LANDSAT/LE07/C02/T1_L2是经过大气校正的标准产品,直接用反射率计算NDVI更准确
  • 干扰像素过滤:利用QA波段的位掩码,剔除云、云阴影、雪等会导致NDVI为负的无效像素
  • 反射率缩放:L2产品的SR波段需要通过multiply(0.0000275).add(-0.2)转换为实际反射率值
  • SLC故障处理:可选择过滤故障后的影像,或添加image.gapFill()逻辑填充条带缺失值
  • 图表优化:指定xProperty确保时间轴显示正常

补充建议

若需保留2003年5月后的影像,可在云过滤的map函数中添加条带填充:

var filledImage = image.gapFill();
// 基于filledImage进行后续反射率转换操作

内容的提问来源于stack exchange,提问作者Kelechi Igwe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:35:21