如何在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
相关产品推荐
相关产品推荐

