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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:01:42