我正在尝试以某种方式栅格化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
任何帮助将不胜感激!
答案 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)