首页 文章

在R(邻居)中查找相邻的多边形

提问于
浏览
22

我开始使用SpatialPolygonsDataFrame,其中包含用于创建加纳地区 Map 的数据(可在http://www.diva-gis.org/datadown获取) . 我正在尝试创建一个矩阵,其中区域的名称为行和列名称,内部为0/1,以指示两个区域是否相邻(相邻) .

我在spdep中发现了几个看起来很有希望的函数,但我无法弄清楚如何将它们用于此目的 . 我能够使用poly2nb创建一个包含数据的“nb”文件,但我不确定如何从这里开始,或者即使我在正确的轨道上 .

我真的很感激任何帮助!谢谢!

2 回答

  • 30

    我想你正在寻找 gTouches

    library(rgeos)
    library(rgdal)
    
    # using http://data.biogeo.ucdavis.edu/data/diva/adm/GHA_adm.zip
    
    ghana <- readOGR("GHA_adm", "GHA_adm1")
    
    gTouches(ghana, byid=TRUE)
    
    ##       0     1     2     3     4     5     6     7     8     9
    ## 0 FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
    ## 1  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE
    ## 2  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE
    ## 3  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE
    ## 4 FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
    ## 5 FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE
    ## 6 FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE
    ## 7 FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
    ## 8 FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
    ## 9  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    

    快速浏览一下,它看起来是正确的:

    enter image description here

    我需要点击 ghana@data 并将条目映射到管理区域名称 .

  • 19

    请不要滥用rgeos . 这不是一个令人满意的答案 - 没有地区名称 . 原始问题在任何情况下都是微不足道的,因为 spdep::nb2mat() 这样做(对矩阵行和列名称有点小心):

    library(spdep)
    library(sp)
    ghana <- readRDS("GHA_adm1.rds")
    row.names(ghana) <- as.character(ghana$NAME_1)
    nb <- poly2nb(ghana)
    mat <- nb2mat(nb, style="B")
    colnames(mat) <- rownames(mat)
    mat
    

    使用 rgeos::gTouches() 可以工作,特别是如果使用 returnDense=FALSE 参数(即不返回矩阵),但如果需要捕捉则可能失败 . spdep::poly2nb() 是首选路由,因为它使捕捉成为可能,并且因为nb S3类比矩阵更灵活 .

    可以使用 rgeos::gUnarySTRtreeQuery() 的输出来填充 spdep::poly2nb() ,它提供具有重叠边界框的多边形列表作为候选邻居 . 这可以快速处理非常大的数据集 .

    您还可以在R-sig-geo上发布与R-spatial相关的问题 .

相关问题