2014-10-22 9 views
17

Ich beginne mit einem SpatialPolygonsDataFrame, der die Daten enthält, um eine Karte der Bezirke von Ghana zu erstellen (verfügbar unter http://www.diva-gis.org/datadown). Ich versuche, eine Matrix mit den Namen der Bezirke als Zeilen- und Spaltennamen und 0s/1s im Inneren zu erstellen, um anzuzeigen, ob zwei Bezirke benachbart (benachbart) sind oder nicht.Suche nach benachbarten Polygonen in R (Nachbarn)

Ich habe mehrere Funktionen in spdep gefunden, die vielversprechend scheinen, aber ich kann nicht herausfinden, wie man sie für diesen Zweck verwendet. Ich konnte eine "nb" -Datei mit den Daten mit poly2nb erstellen, bin mir aber nicht sicher, wie ich von hier aus vorgehen soll oder ob ich auf dem richtigen Weg bin.

Ich würde wirklich jede Hilfe zu schätzen wissen! Vielen Dank!

+1

Diese Frage sollte wahrscheinlich http://gis.stackexchange.com gestellt und hier geschlossen werden. –

+0

Nein, wir haben das :-) Aber, für zukünftige Referenz, @ Pascal hat Recht. Das ist ein großartiger Ort für R + GIS-bezogene q's. – hrbrmstr

Antwort

25

Ich glaube, Sie suchen 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 

Auf einem schnellen Blick sieht es rechts:

enter image description here

Ich bin nicht sicher, welche Ghana Landkreis Datei sind Verwenden, so war eine Vermutung und diese sind in Polygon-Reihenfolge, so müssen Sie bei [email protected] stochern und die Einträge zu Admin-Distriktnamen zuordnen.

+1

+1 - Das ist unglaublich. Ablage für zukünftige Referenz. – thelatemail

+0

So einfach - ich muss mich wirklich mit 'Rgeos' vertraut machen! – jbaums

11

Bitte missbrauchen Sie nicht rgeos. Das ist keine befriedigende Antwort - keine Distriktnamen. Die ursprüngliche Frage war in jedem Fall trivial, wie spdep::nb2mat() dies tut (mit einer wenig Sorgfalt mit Matrix Zeilen- und Spaltennamen):

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() Mit funktionieren kann, vor allem, wenn das returnDense=FALSE Argument verwendet wird (dh don‘. t eine Matrix zurückgeben), kann aber fehlschlagen, wenn ein Fangen erforderlich ist. spdep::poly2nb() ist die bevorzugte Route, weil es das Einrasten ermöglicht, und weil die S3-Klasse viel flexibler als Matrizen ist.

Es ist möglich, spdep::poly2nb() mit der Ausgabe rgeos::gUnarySTRtreeQuery() zu prime, die Listen von Polygonen mit überlappenden Bounding-Boxen als Kandidaten Nachbarn bietet. Dies behandelt sehr große Datenmengen schnell.

Sie können Fragen zu R-spatial auch auf R-sig-geo stellen.

+2

Ich bin mir nicht sicher, ob das die Frage beantwortet. –

+4

Wenn Sie eine Beschwerde oder Anleitung für Benutzer haben, bitte posten Sie auf Meta (sobald Sie 5 rep haben), aber nicht das Rauschen in Ihrer Antwort, weil das andere irritiert, was etwas scheint, das Sie vermeiden möchten. – rene

+0

Ich denke, diese Antwort ist hilfreich, wenn Sie Polygonfang (im Falle von Leerraum zwischen Polygonen oder Grenzen nicht genau passend) benötigen. Ich benutzte die ursprüngliche Antwort mit gTouches und bekam weniger Nachbarn, als ich erwartet hatte. Vielleicht, wenn die Antwort bearbeitet wurde, um das klarzustellen, würde es helfen. – eclark

Verwandte Themen