2014-10-22 29 views
17

Zaczynam od SpatialPolygonsDataFrame, która ma dane do utworzenia mapy okręgów Ghany (dostępna pod adresem http://www.diva-gis.org/datadown). Próbuję utworzyć matrycę z nazwami dzielnic jako nazwami wierszy i kolumn oraz 0s/1s we wnętrzu, aby wskazać, czy dwa okręgi sąsiadują ze sobą (sąsiednie), czy nie.Znajdowanie sąsiednich wielokątów w R (sąsiadach)

Znalazłem kilka funkcji w SPDEP, które wydają się obiecujące, ale nie mogę wymyślić, jak z nich korzystać w tym celu. Udało mi się utworzyć plik "nb" z danymi za pomocą poly2nb, ale nie jestem pewien, jak przejść od tego miejsca, a nawet, czy jestem na dobrej drodze.

Naprawdę doceniam każdą pomoc! Dziękuję Ci!

+1

To pytanie prawdopodobnie powinno zostać poproszony o http://gis.stackexchange.com i zamknięte tutaj. –

+0

Nie, dostaliśmy to :-) Ale na wypadek odniesienia w przyszłości, @ Pascal ma rację. To świetne miejsce dla Q związanych z R + GIS. – hrbrmstr

Odpowiedz

25

myślę szukasz 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 

Na szybki rzut oka wygląda to prawo:

enter image description here

nie jestem pewien, który plik Ghana administracyjna dzielnica jesteś używając, więc to było zgadywanie, a te są w porządku wielokąta, więc musisz szturchnąć na [email protected] i odwzorować wpisy na nazwy okręgów administracyjnych.

+1

+1 - To niesamowite. Odsyłki na przyszłość. – thelatemail

+0

Tak prosty - naprawdę muszę zapoznać się z 'rgeos'! – jbaums

11

Proszę nie nadużywać rgeos. To nie jest zadowalająca odpowiedź - bez nazw okręgów. Oryginalny pytanie w każdym przypadku trywialne, jak spdep::nb2mat() działa następująco (z nieco uwagi nazwami Macierzowe i kolumn):

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 

Stosując rgeos::gTouches() może pracować, w szczególności jeśli returnDense=FALSE Argument ten jest stosowany (np don”. t zwraca macierz), ale może się nie powieść, jeśli konieczne jest przyciąganie. spdep::poly2nb() jest preferowaną trasą, ponieważ umożliwia przyciąganie, a ponieważ klasa nb S3 jest znacznie bardziej elastyczna niż macierze.

Możliwe jest przygotowanie spdep::poly2nb() z wyjściem rgeos::gUnarySTRtreeQuery(), który dostarcza listy wielokątów z nakładającymi się ramkami ograniczającymi jako kandydatami na sąsiednich. Obsługuje bardzo duże zbiory danych szybko.

Możesz także zadawać pytania dotyczące R-przestrzennego na R-sig-geo.

+2

Nie jestem pewien, czy to odpowiada na pytanie. –

+4

jeśli masz skargę lub wskazówki dla użytkowników, opublikuj na meta (raz masz 5 powtórzeń), ale nie umieszczaj tego hałasu w swojej odpowiedzi, ponieważ to drażni inne, co wydaje ci się czymś, czego chciałbyś uniknąć. – rene

+0

Myślę, że ta odpowiedź jest przydatna, jeśli potrzebujesz przyciągania wielokątów (w przypadku białych odstępów między wielokątami lub granicami, które nie pasują do siebie). Używałem oryginalnej odpowiedzi z gTouchami i stawałem się coraz mniej sąsiadów, niż się spodziewałem. Być może, gdyby odpowiedź została zredagowana, aby było jasne, to pomogłoby. – eclark