R:带有孔的 spatialPolygonsDataFrame 的 mask() 和 rasterize()
R: mask() and rasterize() with spatialPolygonsDataFrame having holes
我有一个由 3 个多边形组成的 spatialPolygonsDataFrame。第三个多边形的形状与第一个相同,但在第二个多边形所在的位置有一个洞。
我使用另一个问题 () 的答案在其中构建了漏洞。
library(raster)
library(sp)
# create rasters and store them in a list
r1 <- raster(xmn=1, xmx=5, ymn=1, ymx=5, nrows=4, ncols=4)
r1[] <- 1:length(r1)
# create SpatialPolygonsDataFrame
Sr1 = Polygon(cbind(c(1,5,4,1,1),c(1,2,5,4,1)))
Sr2 = Polygon(cbind(c(2,4,3,2),c(3,2,4,3)))
SpP = SpatialPolygons(list(Polygons(list(Sr1), "s1"), Polygons(list(Sr2), "s2")),
1:2)
dat = data.frame(ID = c("s1", "s2"), value = c("a", "b"))
row.names(dat) <- c("s1", "s2")
p <- SpatialPolygonsDataFrame(SpP, data = dat,
match.ID = TRUE)
AddHoleToPolygon <-function(poly,hole){
# invert the coordinates for Polygons to flag it as a hole
coordsHole <- hole@polygons[[1]]@Polygons[[1]]@coords
newHole <- Polygon(coordsHole,hole=TRUE)
# punch the hole in the main poly
listPol <- poly@polygons[[1]]@Polygons
listPol[[length(listPol)+1]] <- newHole
punch <- Polygons(listPol,poly@polygons[[1]]@ID)
# make the polygon a SpatialPolygonsDataFrame as the entry
new <- SpatialPolygons(list(punch),proj4string=poly@proj4string)
new <- SpatialPolygonsDataFrame(new,data=as(poly,"data.frame"))
return(new)
}
punchedPoly <-AddHoleToPolygon(p[1,],p[2,])
p1 <- rbind(p, punchedPoly, makeUniqueIDs = TRUE)
p1 <- p1[2:3,]
当我使用mask()
到"crop" 光栅r1
时,就会创建洞,尽管三角形多边形有一个值并且确实不是真正的洞。但是它得到 "overridden" 到第三个有洞的多边形:
masked_hole <- mask(r1, p1)
plot(masked_hole)
当我改变多边形的顺序时,没有创建孔:
m3 <- mask(r1, p1[c(2,1),])
plot(m3)
函数光栅化以同样的方式受到影响:
r2 <- rasterize(p1, r1, field = "value")
plot(r2)
r3 <- rasterize(p1[c(2,1),], r1, field = "value")
plot(r3)
在我的真实数据中,我有洞,那里没有 "filling" 多边形,而那些我想保留为洞的地方。
如何为在 none 处创建洞的多边形修复 spatialPolygonsDataFrame?
如何在不重新排序但 "transform" 产生孔的多边形的情况下解决此问题?
这是 raster
包中的一个错误,已同时修复(参见 https://github.com/rspatial/raster/issues/60)。
我有一个由 3 个多边形组成的 spatialPolygonsDataFrame。第三个多边形的形状与第一个相同,但在第二个多边形所在的位置有一个洞。
我使用另一个问题 (
library(raster)
library(sp)
# create rasters and store them in a list
r1 <- raster(xmn=1, xmx=5, ymn=1, ymx=5, nrows=4, ncols=4)
r1[] <- 1:length(r1)
# create SpatialPolygonsDataFrame
Sr1 = Polygon(cbind(c(1,5,4,1,1),c(1,2,5,4,1)))
Sr2 = Polygon(cbind(c(2,4,3,2),c(3,2,4,3)))
SpP = SpatialPolygons(list(Polygons(list(Sr1), "s1"), Polygons(list(Sr2), "s2")),
1:2)
dat = data.frame(ID = c("s1", "s2"), value = c("a", "b"))
row.names(dat) <- c("s1", "s2")
p <- SpatialPolygonsDataFrame(SpP, data = dat,
match.ID = TRUE)
AddHoleToPolygon <-function(poly,hole){
# invert the coordinates for Polygons to flag it as a hole
coordsHole <- hole@polygons[[1]]@Polygons[[1]]@coords
newHole <- Polygon(coordsHole,hole=TRUE)
# punch the hole in the main poly
listPol <- poly@polygons[[1]]@Polygons
listPol[[length(listPol)+1]] <- newHole
punch <- Polygons(listPol,poly@polygons[[1]]@ID)
# make the polygon a SpatialPolygonsDataFrame as the entry
new <- SpatialPolygons(list(punch),proj4string=poly@proj4string)
new <- SpatialPolygonsDataFrame(new,data=as(poly,"data.frame"))
return(new)
}
punchedPoly <-AddHoleToPolygon(p[1,],p[2,])
p1 <- rbind(p, punchedPoly, makeUniqueIDs = TRUE)
p1 <- p1[2:3,]
当我使用mask()
到"crop" 光栅r1
时,就会创建洞,尽管三角形多边形有一个值并且确实不是真正的洞。但是它得到 "overridden" 到第三个有洞的多边形:
masked_hole <- mask(r1, p1)
plot(masked_hole)
当我改变多边形的顺序时,没有创建孔:
m3 <- mask(r1, p1[c(2,1),])
plot(m3)
函数光栅化以同样的方式受到影响:
r2 <- rasterize(p1, r1, field = "value")
plot(r2)
r3 <- rasterize(p1[c(2,1),], r1, field = "value")
plot(r3)
在我的真实数据中,我有洞,那里没有 "filling" 多边形,而那些我想保留为洞的地方。
如何为在 none 处创建洞的多边形修复 spatialPolygonsDataFrame?
如何在不重新排序但 "transform" 产生孔的多边形的情况下解决此问题?
这是 raster
包中的一个错误,已同时修复(参见 https://github.com/rspatial/raster/issues/60)。