【问题标题】:R remove duplicate polygons from a SpatialPolygonsDataFrameR从SpatialPolygonsDataFrame中删除重复的多边形
【发布时间】:2018-08-01 21:20:48
【问题描述】:

我需要从 R 中的 SpatialPolygonsDataFrame 中删除重复的多边形。有一种方法可以用于点,但不能用于多边形。

我需要这样做来为空间数据创建一个类似于 reshape() 的工具。

【问题讨论】:

  • 一个可重现的例子会在这里创造奇迹。多边形究竟是如何复制的?它们是重复的Polygons 还是重复的Polygons?
  • 我的意思是重复,因为 Polygon 中的 @coords 插槽具有相同的值。我会设计一个可重现的例子。
  • @PhilipGreenwood 一个可重复的例子帮助寻求者理解问题是什么,并将其与他们的问题进行比较。您尝试的图像或示例总是有用的。

标签: r sp


【解决方案1】:

如果通过重复的多边形,你的意思是具有相同数据的多边形,你可以使用这个代码:

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),]

【讨论】:

  • 有助于解释嵌套的 lapply 函数在做什么。否则很难修改函数。
【解决方案2】:

答案将取决于您想对属性做什么。

示例数据:

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)

您可以使用 in 中的信息重构属性

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, ]

包terra 有一个unique 方法用于SpatVector 对象:

library(terra)
v <- vect(pp)
u <- unique(pp)
u

# class       : SpatVector 
# geometry    : polygons 
# dimensions  : 2, 5  (geometries, attributes)
# extent      : 5.826232, 6.315773, 49.78479, 50.18162  (xmin, xmax, ymin, ymax)
# coord. ref. : +proj=longlat +datum=WGS84 +no_defs 
# names       :  ID_1   NAME_1  ID_2   NAME_2  AREA
# type        : <num>    <chr> <num>    <chr> <num>
# values      :     1 Diekirch     1 Diekirch   312
#                   1 Diekirch     2 Diekirch   218

【讨论】:

    【解决方案3】:

    尝试将rgeos::gEquals(x, byid = TRUE) 与x 与多边形对象一起使用。

    【讨论】:

    • 嗯。好点,但实际上很难从给定的矩阵或列表中实现这种删除。我应该浪费这么多时间来做这件事吗?有什么简单的食谱吗?
    猜你喜欢
    • 1970-01-01
    • 2019-03-10
    • 2016-10-07
    • 2018-08-26
    • 2020-06-03
    • 2017-10-16
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    相关资源
    最近更新 更多