Trouver des polygones adjacents dans R (voisins)

je commence avec un SpatialPolygonsDataFrame qui a les données pour créer une carte des districts du Ghana (disponible à http://www.diva-gis.org/datadown). J'essaie de créer une matrice avec les noms des districts comme noms de ligne et de colonne et 0s/1s à l'intérieur pour indiquer si deux districts sont adjacents (voisins) ou non.

j'ai trouvé plusieurs fonctions dans le spdep qui semblent prometteuses, mais je n'arrive pas à trouver comment les utiliser dans ce but. J'ai été capable de créer un fichier "nb" avec les données en utilisant poly2nb, mais je ne sais pas comment procéder à partir d'ici ou même si je suis sur la bonne voie.

je serais vraiment reconnaissant de toute aide! Je vous remercie!

20
demandé sur Megan E. 2014-10-22 05:26:15

2 réponses

je pense que vous êtes à la recherche pour 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

Sur un rapide coup d'œil, il regarde à droite:

enter image description here

Je ne suis pas sûr du fichier de district administratif du Ghana que vous utilisez, donc c'était une supposition et ceux sont dans l'ordre des polygones, donc vous aurez besoin de poke à ghana@data et de cartographier les entrées aux noms de district admin.

27
répondu hrbrmstr 2014-10-22 01:53:55

Merci de ne pas abuser rgeos. Ce n'est pas une réponse satisfaisante - pas de noms de quartiers. La question initiale était en tout cas triviale, comme spdep::nb2mat() fait ceci (avec un peu de soin avec les noms de lignes de matrices et de colonnes):

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

en utilisant rgeos::gTouches() peut fonctionner, surtout si le returnDense=FALSE argument est utilisé (ie. ne pas retourner un tableau), mais peut échouer si l'adhérence est nécessaire. spdep::poly2nb() est la route préférée, parce qu'elle permet le snapping, et parce que la classe nb S3 est beaucoup plus flexible que les matrices.

il est possible de prime spdep::poly2nb() avec la sortie de rgeos::gUnarySTRtreeQuery(), qui fournit des listes de polygones dont les boîtes se chevauchent comme voisins candidats. Cela gère des ensembles de données vraiment grands rapidement.

vous pouvez également poster des questions relatives à R-spatial sur R-sig-geo.

17
répondu Roger Bivand 2016-03-13 09:39:58