在Google Earth Engine中计算全影像像素总和时遇错误求助
问题:GEE计算全球人口像素总和报错
我尝试在Google Earth Engine中获取GPW人口数据所有像素的总和,代码如下:
var PopulationCount = ee.ImageCollection("CIESIN/GPWv411/GPW_Population_Count"); function filterbyyear(image, year) { return image.date().get('year').eq(year); } var year = 2020; var pop = PopulationCount.filter(ee.Filter.calendarRange(year, year, 'year')).first(); function SumAllPixels(image) { var sum = image.reduceRegion({ reducer: ee.Reducer.sum(), geometry: image.geometry(), scale: 30, maxPixels: 1e9 }); return sum; } var sum = SumAllPixels(pop); print(sum);
运行后遇到错误:
Dictionary (Error) Image.reduceRegion: Provide 'geometry' parameter when aggregating over an unbounded image.
我猜测需要将影像裁剪到更小范围,但不确定是否正确,希望得到解答。
原因与解决方案
这个报错的核心是:GPW全球人口影像是无界影像,image.geometry()无法返回有效的边界范围,GEE要求计算总和时必须指定明确的有界几何区域,你的猜测是对的,解决方法分两种场景:
1. 计算全球人口总和
直接定义全球经纬度范围作为计算边界,同时优化参数避免计算错误:
var PopulationCount = ee.ImageCollection("CIESIN/GPWv411/GPW_Population_Count"); var year = 2020; var pop = PopulationCount.filter(ee.Filter.calendarRange(year, year, 'year')).first(); function SumAllPixels(image) { // 定义全球范围的矩形边界(经纬度范围) var globalGeom = ee.Geometry.Rectangle([-180, -90, 180, 90], 'EPSG:4326', false); var sum = image.reduceRegion({ reducer: ee.Reducer.sum(), geometry: globalGeom, scale: image.projection().nominalScale(), // 使用影像原生分辨率,避免重采样浪费计算资源 maxPixels: 1e13 // 全球像素量极大,需要调大maxPixels阈值 }); return sum; } var sum = SumAllPixels(pop); print(sum);
说明:GPW v4人口数据的原生分辨率是30弧秒(约1公里),强制用30m分辨率会导致计算量暴增且无意义,因此改用影像原生分辨率;同时全球像素总数远超1e9,需要把maxPixels设为1e13才能完成计算。
2. 计算特定区域的人口总和
如果只需要某个国家/区域的总和,直接指定对应几何范围即可,比如计算中国人口:
var PopulationCount = ee.ImageCollection("CIESIN/GPWv411/GPW_Population_Count"); // 获取中国边界 var chinaGeom = ee.FeatureCollection("FAO/GAUL/2015/level0") .filter(ee.Filter.eq('ADM0_NAME', 'China')) .geometry(); var year = 2020; var pop = PopulationCount.filter(ee.Filter.calendarRange(year, year, 'year')).first(); function SumAllPixels(image) { var sum = image.reduceRegion({ reducer: ee.Reducer.sum(), geometry: chinaGeom, scale: image.projection().nominalScale(), maxPixels: 1e9 }); return sum; } var sum = SumAllPixels(pop); print(sum);
额外优化
你代码里定义的filterbyyear函数没有实际用到,可以直接删除,ee.Filter.calendarRange已经能完成年份筛选。
内容的提问来源于stack exchange,提问作者Derek Corcoran
相关产品推荐
相关产品推荐

