在 R 中将 SpatialCollections 转换为 SpatialPolygonsDataFrame

Convert SpatialCollections to SpatialPolygonsDataFrame in R

我正在努力将 class SpatialCollections 的对象转换为 SpatialPolygonsDataFrame 对象。 我的输入文件都是 shapefile 和 SpatialPolygonsDataFrame 对象。可以访问它们 here

我做两个对象的交集:

SPDF_A <- shapefile("SPDF_A")
SPDF_B <- shapefile("SPDF_B")
intersection <- gIntersection(gBuffer(SPDF_A, width=0), gBuffer(SPDF_B, width=0))

结果是:

> intersection
class       : SpatialCollections 

设置gBuffer(... , byid=T)gBuffer(... , byid=F)似乎没有区别。

我使用 gIntersectiongBuffer(... , width=0) 代替 intersect 以避免几何问题 (Self-intersection)。 这是更大循环的一部分。我需要将交集设为 SpatialPolygonsDataFrame 因为它将在接下来的步骤中保存为 shp 文件。

writeOGR(intersection, ".", layer=paste0("Int_SPDF_A-SPDF_B"), driver="ESRI Shapefile")

SpatialCollections 对象不可能做到这一点。为了将其转换为 SpatialPolygonsDataFrame 我试过:

intersection <- as(intersection ,"SpatialPolygonsDataFrame")
intersection <- SpatialPolygonsDataFrame(intersection)
intersection <- readOGR(intersection, layer = "intersection")

没有任何效果。有人有解决办法吗?非常感谢!

首先,根据 the documentation SpatialCollections 是一种容器格式,可以 "hold SpatialPoints, SpatialLines, SpatialRings, and SpatialPolygons (without attributes)"。如果您需要 SpatialPolygonsDataFrame 的数据框部分(GIS 语言中的 "attribute table"),您将不得不以某种方式解决这个问题。另一方面,如果您只对空间信息(没有附加数据的多边形)感兴趣,请尝试以下操作:

str(intersection, max.level = 3)   

表明 @polyobj 只是一个 SpatialPolygons 对象。因此

mySpoly <- intersection@polyobj

应该可以做到,

class(mySpoly)

表明我们现在确实有一个 SpatialPolygons。

您需要在导出之前将其转换为 SpatialPolygonsDataFrame:

mySpolyData <- as(mySpoly, "SpatialPolygonsDataFrame")
writeOGR(mySpolyData, ".", layer=paste0("Int_SPDF_A-SPDF_B"), driver="ESRI Shapefile")