2013-10-11 3 views
8

В R у меня есть один объект SpatialPolygons (т. Е. Многополигоны), содержащий несколько сотен полигонов. Я хотел бы разбить этот объект SpatialPolygons на список Polygons (то есть отверстия должны оставаться прикрепленными к родительскому многоугольнику).Разделить многоугольные части одного объекта SpatialPolygons

Любая идея, как это сделать?

EDITED:

Используя следующий пример, приведенный в sp упаковке:

# simple example, from vignette("sp"): 
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2))) 
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2))) 
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5))) 
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE) 

Srs1 = Polygons(list(Sr1), "s1") 
Srs2 = Polygons(list(Sr2), "s2") 
Srs3 = Polygons(list(Sr3, Sr4), "s3/4") 
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3) 

Затем работает out = lapply([email protected], slot, "Polygons"). Я получаю список из трех Polygons (то есть Srs1, Srs2, Srs3).

Однако случай, который я пытаюсь решить, немного отличается от этого примера. Объект SpatialPolygons, который я пытаюсь разбить, является результатом геометрического объединения, выполненного с помощью функции gUnaryUnion (в пакете RGEOS). Если я применил out <- lapply([email protected], slot, "Polygons"), я получаю уникальный список объектов Polygon (n.b. не список объектов Polygons). Другими словами, каждый многоугольник отделен от его отверстия (я).

Запуск topol <- sapply(unlist(out), function(x) [email protected])

я получаю:

> length(topol) 
[1] 4996 


> sum(topol, na.rm=TRUE) 
[1] 469 

Согласно RGEOS v0.3-2 вручную (http://cran.r-project.org/web/packages/rgeos/rgeos.pdf):

Для того, чтобы rgeos функционировать должным образом, необходимо что все отверстия в заданной геометрии POLYGON или MULTIPOLYGON должны принадлежать специфицированному полигону . В реализации класса SpatialPolygons в данный момент не включена . Чтобы обойти это ограничение rgeos использует дополнительный атрибут комментария в классе Polygons, который указывает, какое отверстие принадлежит к тому многоугольнику. В текущей реализации этот комментарий представляет собой текстовую строку чисел, разделенных пробелами , где порядок номеров соответствует порядку объектов Polygon в слоте Polygons объекта Polygons. A 0 подразумевает, что объект Polygon является многоугольником, отличное от нуля число подразумевает , что объект Polygon является отверстием со значением, указывающим индекс многоугольника, который «владеет» отверстием.

Так createSPComment() функция в RGEOS, вероятно, будет обходной путь перегруппировываться многоугольников и отверстий.

ответ

1

Как я понимаю, что ОП хочет преобразовать SpatialPolygons объект в список Polygons, сохраняя отверстия, если присутствует.

Объект SpP, созданный OP, содержит три многоугольника, третий из которых имеет соответствующее отверстие.

Вы можете использовать lapply для циклического перехода по каждому многоугольнику в SpP, возвращая список SpatialPolygons. Разница между объектами Polygons и SpatialPolygons является добавлением информации о заказе на участок. Однако, поскольку каждый результат SpatialPolygons имеет длину = 1, эта информация является излишней.

n_poly <- length(SpP) 

out <- lapply(1:n_poly, function(i) SpP[i, ]) 

lapply(out, class) 

> lapply(out, class) 
    [[1]] 
    [1] "SpatialPolygons" 
    attr(,"package") 
    [1] "sp" 

    [[2]] 
    [1] "SpatialPolygons" 
    attr(,"package") 
    [1] "sp" 

    [[3]] 
    [1] "SpatialPolygons" 
    attr(,"package") 
    [1] "sp" 

plot(out[[3]]) # Hole preserved 

Если список Polygons нужно просто нажать на соответствующий слот от SpatialPolygons объекта:

out <- lapply(1:n_poly, function(i) SpP[i, ]@polygons[[1]]) 

lapply(out, class) 

> lapply(out, class) 
[[1]] 
[1] "Polygons" 
attr(,"package") 
[1] "sp" 

[[2]] 
[1] "Polygons" 
attr(,"package") 
[1] "sp" 

[[3]] 
[1] "Polygons" 
attr(,"package") 
[1] "sp" 
11

Чтобы отделить мультиполигон объекты на отдельные полигоны (с отверстиями, если оно присутствует), вы можете сделать

d <- disaggregate(p) 

Где p является объектом SpatialPolygons. После этого вы можете использовать [email protected].

Например

library(sp) 
library(raster) 
### example data 
p1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20)) 
hole <- rbind(c(-150,-20), c(-100,-10), c(-110,20), c(-150,-20)) 
p1 <- list(p1, hole) 
p2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55), c(-10,0)) 
p3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45), c(-125,0)) 
pols <- spPolygons(p1, p2, p3) 
### 

a <- aggregate(pols, dissolve=FALSE) 
d <- disaggregate(a) 
0

Это будет возвращать список SpatialPolygons вместо обычных многоугольников (которые некоторые из ответов сделать).

SpP %>% split(1:length(.)) 

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

  • Нет связанных вопросов^_^