如何解决R中exact_extract函数的"Incompatible extents"错误
问题:
exact_extract函数报错"Incompatible extents" 我在R中使用exact_extract函数计算栅格的区域加权均值,现有人口栅格r_pop、由.txt文件创建的空气污染栅格emis_pm,以及sf格式的多边形nuts_sf。两个栅格的范围、分辨率和CRS看起来完全一致,但调用exact_extract时却报错:Incompatible extents.
运行代码
r_pop emis_pm extent(nuts_sf) emis_regions_w = exact_extract(x = emis_pm, nuts_sf, fun = "weighted_mean", weights = r_pop)
运行结果及错误信息
class : RasterLayer dimensions : 3500, 6300, 22050000 (nrow, ncol, ncell) resolution : 0.01, 0.01 (x, y) extent : -18, 45, 33, 68 (xmin, xmax, ymin, ymax) crs : +proj=longlat +datum=WGS84 +no_defs source : memory names : reproj_merged_pop values : 0, 58558.26 (min, max) class : RasterLayer dimensions : 3500, 6300, 22050000 (nrow, ncol, ncell) resolution : 0.01, 0.01 (x, y) extent : -18, 45, 33, 68 (xmin, xmax, ymin, ymax) crs : +proj=longlat +datum=WGS84 +no_defs source : r_tmp_2022-10-06_094124_28972_73881.grd names : emission.1999..tons. values : 1.36101e-07, 10865.3 (min, max) class : Extent xmin : -18 xmax : 44.82037 ymin : 35.46326 ymax : 71.18416 Error in CPP_stats(x, weights, wkb, default_value, default_weight, coverage_area, : Incompatible extents.
完整回溯信息
10. stop(structure(list(message = "Incompatible extents.", call = CPP_stats(x, weights, wkb, default_value, default_weight, coverage_area, area_method, fun, max_cells_in_memory, grid_compat_tol, quantiles), cppstack = NULL), class = c("Rcpp::exception", "C++Error", ... 9. CPP_stats(x, weights, wkb, default_value, default_weight, coverage_area, area_method, fun, max_cells_in_memory, grid_compat_tol, quantiles) 8. FUN(X[[i]], ...) 7. lapply(X = X, FUN = FUN, ...) 6. sapply(sf::st_as_binary(geoms, EWKB = TRUE), function(wkb) { ret <- CPP_stats(x, weights, wkb, default_value, default_weight, coverage_area, area_method, fun, max_cells_in_memory, grid_compat_tol, quantiles) ... 5. tryCatchList(expr, classes, parentenv, handlers) 4. tryCatch({ x <- .startReading(x) weights <- .startReading(weights) if (is.character(fun)) { ... 3. .local(x, y, ...) 2. exact_extract(x = emis_pm, nuts_sf, fun = "weighted_mean", weights = agg_r_pop) 1. exact_extract(x = emis_pm, nuts_sf, fun = "weighted_mean", weights = agg_r_pop)
解决方案
报错核心原因是多边形的范围超出了栅格的有效范围:栅格的Y轴范围是33到68,但多边形的Y轴最大值达到71.18416,超出了栅格的上边界。exact_extract要求分析的多边形必须完全落在栅格范围内,否则会触发范围不兼容错误。
步骤1:裁剪多边形到栅格范围
使用sf包的st_crop函数,将多边形裁剪至栅格的有效范围:
library(sf) # 将栅格范围转为sf格式的边界框 raster_bbox <- st_bbox(r_pop) %>% st_as_sfc() # 裁剪多边形 nuts_sf_cropped <- st_crop(nuts_sf, raster_bbox)
步骤2:重新执行加权均值计算
用裁剪后的多边形调用exact_extract:
emis_regions_w = exact_extract(x = emis_pm, nuts_sf_cropped, fun = "weighted_mean", weights = r_pop)
可选:扩展栅格范围(若需保留完整多边形)
如果必须保留全部多边形,可先扩展栅格范围(会引入NA值):
library(raster) # 扩展栅格至多边形范围 emis_pm_extended <- extend(emis_pm, extent(nuts_sf)) r_pop_extended <- extend(r_pop, extent(nuts_sf)) # 重新计算 emis_regions_w = exact_extract(x = emis_pm_extended, nuts_sf, fun = "weighted_mean", weights = r_pop_extended)
内容的提问来源于stack exchange,提问作者aavila
相关产品推荐
相关产品推荐

