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

如何在GEE中基于原始分辨率计算NIRv香农指数并聚合至1km

问题描述
  • 基于4.7m分辨率Planet NICFI数据计算热带森林NIRv,目标是在1公顷尺度(100m×100m,对应20×20个4.7m像素)计算NIRv的香农指数,再将结果聚合到1km分辨率下载。
  • 现有代码中使用entropy()函数结合50m方形核计算香农指数,但发现实际计算可能是在1km输出分辨率下执行的:GEE内用reduceRegions对比生物多样性采样点与香农指数时显著相关(R²=0.2),但下载1km分辨率结果后相关性不显著(R²<0.02)。

现有计算代码

// calculate NDVI,NIRv
function VI(img) {
  var ndvi=img.normalizedDifference(['N','R']);
  var nir=img.select('N').divide(10000);
  var nirv=img.expression("NIR*(NDVI-0.08)",{"NIR":nir,"NDVI":ndvi});
  return img.addBands(ndvi.rename('NDVI'))
            .addBands(nirv.rename('NIRv'));
}

// calculate cv&shannon
var k=20;
var weights_k=ee.List.repeat(ee.List.repeat(1,k),k); // set up a k*k kernels
var kernel_k=ee.Kernel.fixed(k,k,weights_k,1,1,false);
var kernel_meter=ee.Kernel.square(50,'meters',false);

function FD(img) {
  var shannon_nirv = img.select('NIRv')
                        .unitScale(0, 1)
                        .multiply(255)
                        .toByte()
                        .entropy(kernel_meter);

  
  return img.addBands(shannon_nirv.rename('shannon_nirv'));

}

// 1. calculate NDVI,NIRv,FD
var ame_img= ee.ImageCollection("projects/planet-nicfi/assets/basemaps/americas")
                      .filter(ee.Filter.date('2020-12-01','2021-11-30'))
                      .filter(ee.Filter.calendarRange(12, 5,'month'))
                      .map(VI)
                      .map(FD)
                      .median();
var asia_img= ee.ImageCollection("projects/planet-nicfi/assets/basemaps/asia")
                      .filter(ee.Filter.date('2020-12-01','2021-11-30'))
                      .filter(ee.Filter.calendarRange(12, 5,'month'))
                      .map(VI)
                      .map(FD)
                      .median();                   
var africa_img= ee.ImageCollection("projects/planet-nicfi/assets/basemaps/africa")
                      .filter(ee.Filter.date('2020-12-01','2021-11-30'))
                      .filter(ee.Filter.calendarRange(12, 5,'month'))
                      .map(VI)
                      .map(FD)
                      .median(); 

var tropic_img = ee.ImageCollection([ame_img, asia_img, africa_img])
                              .mosaic();

// Export
var roi=ee.Geometry.Rectangle(
  [
    [-110, -25],
    [180, 25]
  ],'EPSG:4326',false);

// std_nirv
Export.image.toDrive({
  image:tropic_img.select('shannon_nirv').multiply(100).toUint16(), // raster file to be exported
  description: 'shannon_nirv_1km',
  folder: 'Planet', // good drive folder name
  fileNamePrefix: 'shannon_nirv_1km', // export name name
  scale: 1000,  //resolution
  fileFormat: 'GeoTIFF', // export format
  maxPixels: 1e13, // can increase this to 1e15 if max is reached
  region: roi // clip the boundary
});

采样点验证代码

var keilData = ee.FeatureCollection('users/***/biodiversity_point')
var keilData_buffer=subdata.map(function(f) {return f.buffer(5)});
var shannon_index=tropic_img.select('shannon_nirv')
                        .reduceRegions({
                          collection:keilData_buffer,
                          reducer:ee.Reducer.mean(),
                          scale:5
                        });

// Chart  
var chart = ui.Chart.feature.byFeature(shannon_index, 'mean', ['Biodiversity'])
  .setChartType('ScatterChart')
  .setOptions({ pointSize: 2, pointColor: 'red', width: 500, height: 500, titleX: 'shannon_nirv', titleY: 'S',
  trendlines: {
        0: {
          type: 'linear',
          color: 'lightblue',
          lineWidth: 3,
          opacity: 0.7,
          showR2: true,
          visibleInLegend: true
        },
        1: {
          type: 'linear',
          color: 'pink',
          lineWidth: 3,
          opacity: 0.7,
          showR2: true,
          visibleInLegend: true
        }
      },
    
  })
   
print(chart) 
核心需求

确保香农指数的计算基于原始4.7m分辨率的NIRv数据,在100m×100m窗口内完成计算后,再将结果聚合到1km分辨率导出。

解决方案

关键在于强制entropy()使用原始分辨率计算,再显式将结果聚合到1km尺度。修改后的完整代码如下:

// 计算NDVI、NIRv
function VI(img) {
  var ndvi = img.normalizedDifference(['N','R']);
  var nir = img.select('N').divide(10000);
  var nirv = img.expression("NIR*(NDVI-0.08)", {"NIR": nir, "NDVI": ndvi});
  return img.addBands(ndvi.rename('NDVI'))
            .addBands(nirv.rename('NIRv'));
}

// 计算1公顷尺度的香农指数(基于原始4.7m分辨率)
function calculateShannon(img) {
  var nominalScale = img.projection().nominalScale(); // 获取影像原始4.7m分辨率
  var kernel = ee.Kernel.square(50, 'meters', false); // 100m×100m窗口(半径50m)
  
  // 强制使用原始分辨率计算香农指数,避免自动降采样
  var shannonNirv = img.select('NIRv')
                        .unitScale(0, 1)
                        .multiply(255)
                        .toByte()
                        .entropy(kernel)
                        .reproject(img.projection().atScale(nominalScale));
  
  return img.addBands(shannonNirv.rename('shannon_nirv'));
}

// 处理各区域影像
var ameImg = ee.ImageCollection("projects/planet-nicfi/assets/basemaps/americas")
                      .filter(ee.Filter.date('2020-12-01', '2021-11-30'))
                      .filter(ee.Filter.calendarRange(12, 5, 'month'))
                      .map(VI)
                      .map(calculateShannon)
                      .median();
var asiaImg = ee.ImageCollection("projects/planet-nicfi/assets/basemaps/asia")
                      .filter(ee.Filter.date('2020-12-01', '2021-11-30'))
                      .filter(ee.Filter.calendarRange(12, 5, 'month'))
                      .map(VI)
                      .map(calculateShannon)
                      .median();                   
var africaImg = ee.ImageCollection("projects/planet-nicfi/assets/basemaps/africa")
                      .filter(ee.Filter.date('2020-12-01', '2021-11-30'))
                      .filter(ee.Filter.calendarRange(12, 5, 'month'))
                      .map(VI)
                      .map(calculateShannon)
                      .median(); 

var tropicImg = ee.ImageCollection([ameImg, asiaImg, africaImg]).mosaic();

// 将100m尺度香农指数聚合到1km分辨率(采用均值,可按需替换Reducer)
var shannon1km = tropicImg.select('shannon_nirv')
                          .reduceResolution({
                            reducer: ee.Reducer.mean(),
                            maxPixels: 1024
                          })
                          .reproject({
                            crs: 'EPSG:4326',
                            scale: 1000
                          });

// 导出设置
var roi = ee.Geometry.Rectangle(
  [-110, -25],
  [180, 25],
  'EPSG:4326',
  false
);

Export.image.toDrive({
  image: shannon1km.multiply(100).toUint16(),
  description: 'shannon_nirv_1km',
  folder: 'Planet',
  fileNamePrefix: 'shannon_nirv_1km',
  scale: 1000,
  fileFormat: 'GeoTIFF',
  maxPixels: 1e13,
  region: roi
});

关键修改说明

  • 强制原始分辨率计算:通过.reproject(img.projection().atScale(nominalScale))指定entropy()使用4.7m原始像素计算100m窗口内的香农指数,避免GEE自动采用后续导出的1km分辨率进行计算。
  • 显式聚合到1km:使用reduceResolution()函数将100m尺度的结果聚合到1km,这里选用均值作为统计量,可根据研究需求替换为中值、最大值等其他Reducer。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:49:52