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

时间:2014-10-22 01:26:15

标签: r gis polygons

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

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

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

2 个答案:

答案 0 :(得分: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处查看并将条目映射到管理区域名称

答案 1 :(得分: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类比矩阵更灵活。

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

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