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!
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:
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.
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.