栅格化R中带有孔的SpatialPolygon

时间:2018-08-10 21:31:01

标签: r r-raster sp

我正在尝试以某种方式栅格化SpatialPolygons对象,以获得与栅格的每个像元重叠的多边形数量。我的多边形有孔。我的问题是,如果两个孔重叠,则计数中会包含此重叠。

我创建了一个玩具示例:

library(sp)
library(raster)

p1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20))
hole <- rbind(c(-150,-20), c(-100,-10), c(-110,20), c(-150,-20))
p1 <- list(p1, hole)
p2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55), c(-10,0))
p3 <- rbind(c(-180,-20), c(-130,55), c(0,60), c(40,5), c(15,-45), c(-180,-20))
p3 <- list(p3, hole)

pols <- spPolygons(p1, p2, p3)

pols@polygons[[1]]@Polygons[[2]]@hole
pols@polygons[[3]]@Polygons[[2]]@hole


r1 <- raster(ncol=180, nrow=180)
r <- rasterize(pols, r1, fun="count")
plot(pols, col=rgb(1,0,0,0.5))
plot(r)

我认为这可能是导致与问题use R to rasterize shapefile with holes?相关的问题的原因,但是没有最终解决方案。问题rasterize ESRI shapefile with holes but FALSE hole slots的问题在于孔的格式不正确,但这不是我的情况。如果您查看这些孔,它们都是TRUE,请参见:

pols@polygons[[1]]@Polygons[[2]]@hole
pols@polygons[[3]]@Polygons[[2]]@hole

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

使用软件包fasterize进行栅格化(除了速度更快)似乎可以避免该问题:

library(fasterize)
library(sf)

r1 <- raster(ncol=180, nrow=180)
r <- fasterize::fasterize(sf::st_as_sf(pols),
                          r1, fun = "count")
plot(r, col = rainbow(3))

HTH!

答案 1 :(得分:1)

这是一种解决方法。首先栅格化每个多边形,然后将它们汇总。这样,孔将为零。

library(sp)
library(raster)

# Create a list of Spatial Polygons
pols_list <- lapply(list(p1, p2, p3), spPolygons)

# Create a blank raster
r1 <- raster(ncol = 180, nrow = 180)

# Rasterize each polygon
r_list <- lapply(pols_list, rasterize, y = r1, fun = "count")

# Create a raster stack
s <- stack(r_list)

# Calculate the sum
r2 <- sum(s, na.rm = TRUE)

# Plot r2
plot(r2)

enter image description here