Finding adjacent polygons in R (neighbors)
I think you're looking for gTouches
:
library(rgeos)library(rgdal)# using http://data.biogeo.ucdavis.edu/data/diva/adm/GHA_adm.zipghana <- 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
On a quick glance, it looks right:
I'm not sure which Ghana administrative district file you are using, so that was a guess and those are in polygon order, so you'll need to poke at ghana@data
and map the entries to admin district names.
Please do not abuse rgeos. This is not a satisfactory answer - no district names. The original question was in any case trivial, as spdep::nb2mat()
does this (with a little care with matrix row and column names):
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
Using rgeos::gTouches()
can work, especially if the returnDense=FALSE
argument is used (ie. don't return a matrix), but can fail if snapping is needed. spdep::poly2nb()
is the preferred route, because it makes snapping possible, and because the nb S3 class is much more flexible than matrices.
It is possible to prime spdep::poly2nb()
with the output of rgeos::gUnarySTRtreeQuery()
, which provides lists of polygons with overlapping bounding boxes as candidate neighbours. This handles really large data sets fast.
You can also post questions relating to R-spatial on R-sig-geo.