用空间多边形掩盖栅格时出错

error in mask a raster by a spatialpolygon

我有以下特征的光栅:

library(raster)
library(rgeos)
test <- raster(nrow=225, ncols=478, xmn=-15.8, xmx=32, ymn=-9.4, ymx=13.1)

我想在此栅格中遮盖点的给定距离内的像元。 我创建空间点如下:

p2=readWKT("POINT(31.55 -1.05)")   

然后我通过添加 0.5 缓冲区创建一个空间多边形对象:

p2_Buffered <- gBuffer(p2, width = 0.5)

mask(test, mask=p2_Buffered,inverse=T)

当我根据这个空间对象屏蔽我的栅格时,出现以下错误消息:

Error in .polygonsToRaster(x, y, field = field, fun = fun, background = background, : number of items to replace is not a multiple of replacement length

我不明白,因为这是脚本我已经运行使用不同的点和不同的缓冲区宽度多次使用,没有任何问题。

奇怪的是,当我改变缓冲区的宽度时,它工作正常:

p2_Buffered <- gBuffer(p2, width = 0.4)
mask(test, mask=p2_Buffered,inverse=T)

对于不同的焦点也是如此:

p2=readWKT("POINT(32.55 -1)")
p2_Buffered <- gBuffer(p2, width = 0.5)
mask(test, mask=p2_Buffered,inverse=T)

我想确定我在这一点上遇到的具体问题,因为这是我应该 运行 在例程中的脚本(到目前为止我一直在这样做,没有任何问题)。

非常感谢

您通常需要为栅格图层设置一些值。对于遮罩层,最好将值设置为 1。

    library(raster)
    library(rgeos)

# make sample raster    
test <- raster(nrow=225, ncols=478, xmn=-15.8, xmx=32, ymn=-9.4, ymx=13.1)
# set values of raster for mask
test <- setValues(test, 1)

# make point buffer
p2=readWKT("POINT(15 5)")
p2_Buffered <- gBuffer(p2, width = 1.5)
# name projection of buffer (assume its the same as raster)
projection(p2_Buffered) <- projection(test)

# visual check 
plot(test); plot(p2_Buffered, add=T)

如果您想 trim 将栅格图层向下缩小到单个多边形,请尝试此工作流程。

step1 <- crop(test, p2_Buffered) # crop to same extent
step2 <- rasterize(p2_Buffered, step1) # rasterize polygon 
final <- step1*step2 # make your final product
plot(final)

如果您只想在栅格图层上戳一个洞,请使用蒙版功能

# rasterize your polygon
p2_Buffered <- rasterize(p2_Buffered, test, fun='sum')

# now mask it 
my_mask <- mask(test, mask=p2_Buffered,inverse=T) # try changing the inverse argument 
plot(my_mask)

这确实是多边形越过栅格边缘的错误。它已在 2.3-40 版(现在在 CRAN 上)中得到修复,因此如果您更新栅格包,它应该会消失。

这里有一个解决方法(删除超出边缘的多边形部分)。

library(raster)
library(rgeos)
r <- raster(nrow=225, ncols=478, xmn=-15.8, xmx=32, ymn=-9.4, ymx=13.1)
e <- as(extent(r), 'SpatialPolygons')

p <- readWKT("POINT(31.55 -1.05)")   
pb <- gBuffer(p, width = 0.5)
pbe <- intersect(pb, e)

values(r) 
x <- mask(r, mask=pbe, inverse=TRUE)