R-SpatialPolygons列表中的SpatialPolygonsDataFrame列表

时间:2018-10-22 15:26:33

标签: r polygon spatial

我有一个使用lapply和raster::buffer函数创建的SpatialPolygon的列表。我想将列表中的文件转换回SpatialPolygonsDataFrame对象的列表。我尝试了此处提供的答案(尽管请注意,我的问题略有不同,因为我想最后得到一个SpatialPolygonsDataFrame对象的列表):R - SpatialPolygonsDataFrame from a list of SpatialPolygons,但我不知道如何为其中的每个对象获取唯一的ID。名单。应用该代码时,出现以下错误消息:

#Getting polygon IDs
IDs <- sapply(list_of_SPols, function(x)
 slot(slot(x, "polygons")[[1]], "ID"))

#Checking
length(unique(IDs)) == length(list_of_SPols) #output = [1] FALSE

#Making SpatialPolygons from list of polygons
Spol <- SpatialPolygons(lapply(list_of_SPols,
                            function(x) slot(x, "polygons")[[1]]))

#output = Error in validObject(res) : 
  #invalid class “SpatialPolygons” object: non-unique Polygons ID slot 
  #values

我的SpatialPolygons列表元素具有唯一的索引值,但是当我检查上面创建的IDs对象的输出时,它的一个子集看起来像这样:

#[1] "1" "1" "1" "1" "1" "1" "1"....

因此所有列表元素都具有相同的ID。所以我认为我需要做的是创建等于索引号的唯一ID?

如何执行此操作,然后如何继续创建SpatialPolygonsDataFrame对象的列表?

1 个答案:

答案 0 :(得分:1)

显示数据很重要的原因之一是您可能会问错问题。如果要将raster::bufferSpatialPolygonsDataFrame一起使用并保留该对象类型,则应使用选项dissolve=FALSE

library(raster)
p <- shapefile(system.file("external/lux.shp", package="raster"))
b1 <- buffer(p, .1)
class(b1)
#[1] "SpatialPolygons"

b2 <- buffer(p, .1, dissolve=FALSE)
class(b2)
#[1] "SpatialPolygonsDataFrame"

这可能解决了您的问题。要回答有关从SpatialPolygonDataFrame对象列表中创建SpatialPolygon对象的问题

SpatialPolygon对象的示例列表

library(raster)
p <- shapefile(system.file("external/lux.shp", package="raster"))
s <- as(p, 'SpatialPolygons')
x <- lapply(seq(1,12,3), function(i) s[i:(i+2),])

大概您已经有要匹配的data.frame对象,但是我只是在这里创建它们。这给出了错误

z <- lapply(x, function(i) SpatialPolygonsDataFrame(i, data.frame(id=1:length(i)))) 
#Error in SpatialPolygonsDataFrame(i, data.frame(id = 1:length(i))) : 
#row.names of data and Polygons IDs do not match

这有效

z <- lapply(x, function(i) SpatialPolygonsDataFrame(i, data.frame(id=1:length(i)), match.ID = FALSE))   

在大多数情况下,您需要合并对象。要跟踪它们,您可以

zz <- lapply(1:length(x), function(i) SpatialPolygonsDataFrame(x[[i]], data.frame(id=rep(i, length(x[[i]]))), match.ID = FALSE))    
sp <- bind(zz)