2014-10-22 2 views
17

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

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

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

+1

Этот вопрос, вероятно, должен быть указан на http://gis.stackexchange.com и закрыт здесь. –

+0

Нет, мы получили это :-) Но для будущей справки, @ Паскаль прав. Это отличное место для R + GIS-связанных q. – hrbrmstr

ответ

25

Я думаю, что вы ищете 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] и отобразить записи в имена администраторов.

+1

+1 - Это невероятно. Отправка для дальнейшего использования. – thelatemail

+0

Так просто - мне действительно нужно познакомиться с 'rgeos'! – jbaums

11

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

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

Вы также можете задать вопрос, связанный с R-пространственным по R-sig-geo.

+2

Я не уверен, что это отвечает на вопрос. –

+4

, если у вас есть жалоба или рекомендации для пользователей, пожалуйста, напишите на мета (если у вас есть 5 реп), но не помещайте этот шум в свой ответ, потому что это раздражает других, которые кажутся вам чем-то вроде того, что вам нравится. – rene

+0

Я думаю, что этот ответ полезен, если вам нужна многоугольная привязка (в случае пробела между полигонами или границами, которые не точно совпадают). Я использовал оригинальный ответ с gTouches и получал меньше соседей, чем ожидал. Возможно, если бы ответ был отредактирован, чтобы сделать это ясно, это поможет. – eclark

Смежные вопросы