Поиск соседних многоугольников в R (соседи)

Я начинаю с SpatialPolygonsDataFrame, у которого есть данные, чтобы создать карту районов Ганы (доступно http://www.diva-gis.org/datadown). Я пытаюсь создать матрицу с названиями районов как имена строк и столбцов и 0s/1s в глубине, чтобы указать, являются ли два района смежными (соседними) или нет.

Я нашел несколько функций в spdep, которые кажутся многообещающими, но я не могу понять, как их использовать для этой цели. Я смог создать файл "nb" с данными с помощью poly2nb, но я не уверен, как исходить отсюда или даже если я нахожусь на правильном пути.

Я бы очень признателен за любую помощь! Спасибо!

Ответы

Ответ 1

Я думаю, что вы ищете 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

С быстрым взглядом он выглядит правильно:

enter image description here

Я не уверен, какой файл административного округа Ганы вы используете, так что это было предположение, и они находятся в полигональном порядке, поэтому вам нужно совать в [email protected] и сопоставить записи с именами административного округа.

Ответ 2

Пожалуйста, не ругайте rgeos. Это не удовлетворительный ответ - никаких названий районов. Первоначальный вопрос был в любом случае тривиальным, поскольку spdep::nb2mat() делает это (с небольшой осторожностью с именами строк и столбцов матрицы):

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() может работать, особенно если используется аргумент returnDense=FALSE (т.е. не возвращать матрицу), но может быть неудачным, если требуется привязка. spdep::poly2nb() - предпочтительный маршрут, потому что он делает привязку возможной, и потому что класс nb S3 намного более гибкий, чем матрицы.

Можно прочесть spdep::poly2nb() с выходом rgeos::gUnarySTRtreeQuery(), который предоставляет списки полигонов с перекрывающимися ограничивающими полями в качестве кандидатов-соседей. Это быстро обрабатывает действительно большие наборы данных.

Вы также можете публиковать вопросы, связанные с R-пространством в R-сиг-гео.