剪辑多边形并保留数据?


13

我有以下两个多边形:

library(sp); library(rgeos); library(maptools)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                    55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                    55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                                   242), variable2 = c(235, 464), row.names = c("p1", "p2")))
proj4string(spdf1) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf1, col="red")

coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                     55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                      variable2 = c(3), row.names = c("p1a")))
proj4string(spdf2) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf2, col="yellow", add=T)

在此处输入图片说明

我想剪掉spdf1与相交的部分spdf2。但是,我想spdf1保留为SpatialPolygonsDataFrame并保留其中包含的任何信息spdf1@data

I¹ve试图gDifference如下,其中切出的部分spdf1是由相交spdf2,但随后转换spdf1到SpatialPolygons(包含在丢弃即信息spdf1@data)。

gDifference(spdf1, spdf2, byid=T)

我如何才能切成spdf1spdf2,但保留包含在数据spdf1@data?我已经检查并尝试了类似的问题,但没有如何在SpatialPointsDataFrame上覆盖多边形并保留SPDF数据?

Answers:


9

最简单的方法是

  library(raster)
  x <- spdf1 - spdf2

  # or, more formally
  y <- erase(spdf1,  spdf2)

有关处理多边形覆盖的更多功能,请参见“光栅包装”(第XIV节)。这些功能在“用户级”(而不是“开发人员级”)功能中使用了rgeos的基本功能。


“在“用户级别”(相对于“开发人员级别”)功能中”是什么意思?
卢西亚诺2015年

rgeos提供几何运算,但不处理数据的属性。因此,使用这些功能需要大量工作才能将所有内容保持在一起。栅格函数简化了此过程,其行为类似于GIS软件中的类似函数,
Robert Hijmans 2015年

是的,但这可能会导致SpatialPolygonsDataFrame(part2,x @ data [match(row.names(part2),::row.names of data and Polygons IDs
is

那将是一个错误。你能提供一个例子吗?
罗伯特·希曼斯

4

一种解决方法是做剪辑后重新添加的属性,而从转换SpatialPolygonsSpatialPolygonsDataFrame

sp3 <- gDifference(spdf1, spdf2, byid = TRUE)
row.names(sp3) <- row.names(spdf1)

spdf3 <- SpatialPolygonsDataFrame(sp3, data = spdf1@data)

spdf3@data

   variable1 variable2
p1       232       235
p2       242       464

plot(spdf3, col="red")

在此处输入图片说明


这看起来像是我的问题,仅在我的特定实例中的输出剪辑会从spdf1生成不存在的行名(作为简单的gsub来摆脱row.name的第二个数字,应注意行名是否匹配,不是吗? )
jebyrnes

SpatialPolygonsDataFrame(clip,data = as.data.frame(all_spdfs_together @ data))中的错误:对象长度不匹配:剪辑具有1718个Polygons对象,但是as.data.frame(all_spdfs_together @ data)具有86行
jebyrnes

当然-我在海洋中有一堆东西。有些不正确地放置在土地上或与土地重叠。我想把它剪掉,所以我只有海洋中的区域。我有一个海岸线shapefile要进行比较。这是代码-gist.github.com/jebyrnes/c2e8d2b6c82849dad3a813d952ab8bb0
jebyrnes

1
没关系
-raster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.