【问题标题】:Identify spatial neighbors and account for NAs in R (sp, rgeos)识别空间邻居并解释 R 中的 NA (sp, rgeos)
【发布时间】:2016-02-11 18:08:37
【问题描述】:

我正在尝试将相邻的空间多边形识别为一组空间多边形,同时考虑邻居是否存在或者是 NA。我正在使用 rgeos 包中的 gTouches() 函数来识别哪些几何图形共享一个共同的边界,但是我不知道如何让它考虑邻居的值是否为 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

关于如何做到这一点的任何想法?谢谢。

【问题讨论】:

  • 按照这个逻辑,我假设您希望2 3 4 替换8,而不仅仅是3
  • 是的,没错;现在编辑。

标签: r spatial sp


【解决方案1】:

如果nbrs2 中存在 NA,您可以将初始多边形与tr2 中具有NA 的任何一个连接起来,并在连接的多边形上使用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 的多边形的编号。然后我们可以使用maptools 中的unionSpatialPolygons 连接多边形13 和多边形8,然后像您在代码中所做的那样使用gTouches 来查找所有相邻的多边形。

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 2019-03-03
    • 2021-10-04
    • 2020-11-18
    • 2019-03-30
    • 2018-01-27
    相关资源
    最近更新 更多