R - 来自 SpatialPolygons 列表的 SpatialPolygonsDataFrame LIST
R - SpatialPolygonsDataFrame LIST from a list of SpatialPolygons
我有一个使用 lapply 和 raster::buffer
函数创建的 SpatialPolygons 列表。我想将列表中的文件转换回 SpatialPolygonsDataFrame 对象列表。我尝试了此处提供的答案(尽管请注意我的问题略有不同,因为我想以 SpatialPolygonsDataFrame 对象的列表结束):,但我不知道如何为每个对象获取唯一 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 对象列表?
显示数据很重要的原因之一是您可能会问错问题。如果要将 raster::buffer
与 SpatialPolygonsDataFrame
一起使用并保留该对象类型,则应使用选项 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"
这可能会解决您的问题。回答关于从 SpatialPolygon
个对象
的列表中创建 SpatialPolygonDataFrame
个对象的问题
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)
我有一个使用 lapply 和 raster::buffer
函数创建的 SpatialPolygons 列表。我想将列表中的文件转换回 SpatialPolygonsDataFrame 对象列表。我尝试了此处提供的答案(尽管请注意我的问题略有不同,因为我想以 SpatialPolygonsDataFrame 对象的列表结束):
#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 对象列表?
显示数据很重要的原因之一是您可能会问错问题。如果要将 raster::buffer
与 SpatialPolygonsDataFrame
一起使用并保留该对象类型,则应使用选项 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"
这可能会解决您的问题。回答关于从 SpatialPolygon
个对象
SpatialPolygonDataFrame
个对象的问题
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)