我正在尝试将邻居空间多边形识别为一组空间多边形,同时考虑邻居是否存在或是NA。我正在使用gTouches()
包中的rgeos
函数来识别哪些几何共享一个公共边框,但是我不知道如何让它说明邻居的值是否为NA,在这种情况下,我希望它找到下一个最接近的几何。在以下示例代码中,我希望tr2
的邻居(包括NA)与tr
不同:
library(rgeos)
library(sp)
grid <- GridTopology(c(0,0), cellsize = c(1,1), cells.dim = c(5,5))
poly <- as(grid, "SpatialPolygons")
id <- names(poly)
tr <- 13 ### Define this as the grid for which to find neighbors
g.id <- sprintf("g%i", tr) ###
tr <- ifelse(id %in% g.id, 1, 0)
tr2 <- ifelse(id %in% g.id, 1, 0)
tr2[8] <- NA
ex <- SpatialPolygonsDataFrame(poly, data = data.frame(id = id, tr = tr, tr2 = tr2, row.names = row.names(poly)))
adj <- gTouches(poly, poly[which(ex$tr==1)], byid = TRUE)
nbrs <- as.vector(apply(adj,1,which))
adj2 <- gTouches(poly, poly[which(ex$tr2==1)], byid = TRUE)
nbrs2 <- as.vector(apply(adj2,1,which))
nbrs
[1] 7 8 9 12 14 17 18 19
nbrs2 ### Should be 2,3,4 (replace 8), 7, 9, 12, 14, 17, 18, 19
[1] 7 8 9 12 14 17 18 19
有关如何做到这一点的任何想法?谢谢。
答案 0 :(得分:1)
如果nbrs2
中有NA,则您可以将初始多边形与NA
中的tr2
加入,并在连接的多边形上使用gTouches
:
library(maptools)
if(any(is.na(tr2[nbrs2]))) {
to_join <- nbrs2[which(is.na(tr2[nbrs2]))]
joined_polygon <- unionSpatialPolygons(poly[c(which(tr2==1),to_join)],rep(1,length(to_join)+1))
adj2 <- gTouches(poly,joined_polygon,byid=TRUE)
nbrs2 <- as.vector(apply(adj2,1,which))
}
nbrs2
#[1] 2 3 4 7 9 12 14 17 18 19
to_join
找到13旁边的多边形编号,并在tr2中有NA
。然后我们可以使用unionSpatialPolygons
中的maptools
来连接多边形13和多边形8,然后像在代码中一样使用gTouches
来查找所有相邻的多边形。