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
объект с полигонами.