R удалить повторяющиеся полигоны из SpatialPolygonsDataFrame

Мне нужно удалить дубликаты полигонов из SpatialPolygonsDataFrame в R. Есть метод для точек, но не для полигонов.

Мне нужно сделать это для создания инструмента, аналогичного reshape() для пространственных данных.

3 ответа

Если под дублирующимися полигонами вы имеете в виду полигоны с одинаковыми данными, вы можете использовать этот код:

shp <- shapefile("shape.shp")
shp <- shp[!duplicated(shp@data),]

РЕДАКТИРОВАТЬ

Если под дублированными полигонами вы имеете в виду полигоны с одинаковыми координатами (@coords слот), вы можете использовать этот код:

shp <- shapefile("shape.shp")
coord_poly <- lapply(shp@polygons, function(x){lapply(x@Polygons, function(x){coordinates(x)})}) 
shp <- shp[!duplicated(coord_poly),]

Ответ будет немного зависеть от того, что вы хотите сделать с атрибутами.

Пример данных:

library(raster)   
p <- shapefile(system.file("external/lux.shp", package="raster"))
p <- p[1:2, ]
pp <- bind(p,p)
data.frame(pp)

#  ID_1   NAME_1 ID_2   NAME_2 AREA
#1    1 Diekirch    1 Clervaux  312
#2    1 Diekirch    2 Diekirch  218
#3    1 Diekirch    1 Clervaux  312
#4    1 Diekirch    2 Diekirch  218

Если вы хотите объединить полигоны, которые имеют одинаковые атрибуты (но, возможно, разные области), вы можете использовать агрегат:

a <- aggregate(pp, names(pp))
data.frame(a)

#  ID_1   NAME_1 ID_2   NAME_2 AREA
#1    1 Diekirch    1 Clervaux  312
#2    1 Diekirch    2 Diekirch  218

Если вы знаете, что они являются дубликатами по области и атрибутам, вы можете использовать решение @DJack:

b <- pp[!duplicated(data.frame(pp)),]

Если это только области, которые вас волнуют, вы могли бы сделать

d <- union(pp)

И вы можете восстановить атрибуты с информацией в

data.frame(d)
#     ID.1 ID.2 ID.3 ID.4 count
#1    1    0    1    0     2
#2    0    1    0    1     2

Но в этом случае было бы проще сделать:

g <- geom(pp)
x <- split(g[,c(2, 4:6)], g[,1])
dd <- duplicated(x)
dd
[1] FALSE FALSE  TRUE  TRUE

С последующим

z <- pp[!dd, ]

Попробуйте использовать rgeos::gEquals(x, byid = TRUE) с x объект с полигонами.

Другие вопросы по тегам