从多边形列表创建空间多边形数据框
Creating spatialpolygons dataframe from list of polygons
我目前正在尝试从多边形列表(生物多样性研究的研究区域)创建一个多边形 shapefile。
目前这些多边形以这种格式存储在列表中:
$SEW22
[,1] [,2]
[1,] 427260.4 5879458
[2,] 427161.4 5879472
[3,] 427175.0 5879571
[4,] 427273.9 5879557
[5,] 427260.4 5879458
$SEW23
[,1] [,2]
[1,] 418011.0 5867216
[2,] 417912.0 5867230
[3,] 417925.5 5867329
[4,] 418024.5 5867315
[5,] 418011.0 5867216
我试图用 writeOGR 将它们简单地写成 shpfile 但出现以下错误:
> #write polygons to shp
> filenameshp <- paste('Forestplots')
> layername <- paste('Forestplots')
> writeOGR(obj=forest, dsn = filenameshp,
+ layer=layername, driver="ESRI Shapefile", overwrite_layer = TRUE)
Error in writeOGR(obj = forest, dsn = filenameshp, layer = layername, :
inherits(obj, "Spatial") is not TRUE
我阅读了 Barry Rowlingson 的 this 创建空间多边形的教程,并认为我应该首先创建一个数据框并这样做:
forestm<-do.call(rbind,forest)
但这没有像您想象的那样返回任何有用的东西,而且它丢失了地块的名称。
因为我对 RI 还是个新手,所以我也尝试了很多其他方法,我无法完全判断这些方法是否有意义,但是 none 返回了我希望的结果,所以我不用这些随机方法.... .
期待您的建议。
非常感谢
P.S。我还按照 spatialpolygons{sp} package:
中的描述尝试了以下操作
> Polygons(forest, ID)
Error in Polygons(forest, ID) : srl not a list of Polygon objects
您可以按照此答案中描述的方法进行操作:https://gis.stackexchange.com/questions/18311/instantiating-spatial-polygon-without-using-a-shapefile-in-r。
以下是如何将此方法应用于您的案例。首先,我创建了一个矩阵列表,如您的示例数据所示:
forest <- list(
"SEW22" = matrix(c(427260.4, 5879458, 427161.4, 5879472, 427175.0, 5879571, 427273.9, 5879557, 427260.4, 5879458),
nc = 2, byrow = TRUE),
"SEW23" = matrix(c(418011.0, 5867216, 417912.0, 5867230, 417925.5, 5867329, 418024.5, 5867315, 418011.0, 5867216),
nc = 2, byrow = TRUE)
)
现在
library(sp)
p <- lapply(forest, Polygon)
ps <- lapply(seq_along(p), function(i) Polygons(list(p[[i]]), ID = names(p)[i]))
sps <- SpatialPolygons(ps)
sps_df <- SpatialPolygonsDataFrame(sps, data.frame(x = rep(NA, length(p)), row.names = names(p)))
在第一步中,我们遍历矩阵列表并将 Polygon
函数应用于每个矩阵以创建 Polygon
对象的列表。第二步,我们遍历这个列表创建一个Polygons
对象,将这个对象中每个元素的ID设置为原列表中对应的名字(如"SEW22","SEW23" ).第三步创建一个SpatialPolygons
对象。最后,我们创建一个 SpatialPolygonsDataFrame
对象。这里我有一个填充了 NA
s 的虚拟数据框(请注意,行名称必须对应于多边形 ID)。
最后写入数据
rgdal::writeOGR(obj = sps_df,
dsn = "Forestplots",
layer = "Forestplots",
driver = "ESRI Shapefile",
overwrite_layer = TRUE)
这会在您的工作目录中创建一个新文件夹:
list.files()
# [1] "Forestplots"
list.files("Forestplots")
# [1] "Forestplots.dbf" "Forestplots.shp" "Forestplots.shx"
有关详细信息,请参阅链接的答案。
我目前正在尝试从多边形列表(生物多样性研究的研究区域)创建一个多边形 shapefile。
目前这些多边形以这种格式存储在列表中:
$SEW22
[,1] [,2]
[1,] 427260.4 5879458
[2,] 427161.4 5879472
[3,] 427175.0 5879571
[4,] 427273.9 5879557
[5,] 427260.4 5879458
$SEW23
[,1] [,2]
[1,] 418011.0 5867216
[2,] 417912.0 5867230
[3,] 417925.5 5867329
[4,] 418024.5 5867315
[5,] 418011.0 5867216
我试图用 writeOGR 将它们简单地写成 shpfile 但出现以下错误:
> #write polygons to shp
> filenameshp <- paste('Forestplots')
> layername <- paste('Forestplots')
> writeOGR(obj=forest, dsn = filenameshp,
+ layer=layername, driver="ESRI Shapefile", overwrite_layer = TRUE)
Error in writeOGR(obj = forest, dsn = filenameshp, layer = layername, :
inherits(obj, "Spatial") is not TRUE
我阅读了 Barry Rowlingson 的 this 创建空间多边形的教程,并认为我应该首先创建一个数据框并这样做:
forestm<-do.call(rbind,forest)
但这没有像您想象的那样返回任何有用的东西,而且它丢失了地块的名称。
因为我对 RI 还是个新手,所以我也尝试了很多其他方法,我无法完全判断这些方法是否有意义,但是 none 返回了我希望的结果,所以我不用这些随机方法.... .
期待您的建议。
非常感谢
P.S。我还按照 spatialpolygons{sp} package:
中的描述尝试了以下操作> Polygons(forest, ID)
Error in Polygons(forest, ID) : srl not a list of Polygon objects
您可以按照此答案中描述的方法进行操作:https://gis.stackexchange.com/questions/18311/instantiating-spatial-polygon-without-using-a-shapefile-in-r。
以下是如何将此方法应用于您的案例。首先,我创建了一个矩阵列表,如您的示例数据所示:
forest <- list(
"SEW22" = matrix(c(427260.4, 5879458, 427161.4, 5879472, 427175.0, 5879571, 427273.9, 5879557, 427260.4, 5879458),
nc = 2, byrow = TRUE),
"SEW23" = matrix(c(418011.0, 5867216, 417912.0, 5867230, 417925.5, 5867329, 418024.5, 5867315, 418011.0, 5867216),
nc = 2, byrow = TRUE)
)
现在
library(sp)
p <- lapply(forest, Polygon)
ps <- lapply(seq_along(p), function(i) Polygons(list(p[[i]]), ID = names(p)[i]))
sps <- SpatialPolygons(ps)
sps_df <- SpatialPolygonsDataFrame(sps, data.frame(x = rep(NA, length(p)), row.names = names(p)))
在第一步中,我们遍历矩阵列表并将 Polygon
函数应用于每个矩阵以创建 Polygon
对象的列表。第二步,我们遍历这个列表创建一个Polygons
对象,将这个对象中每个元素的ID设置为原列表中对应的名字(如"SEW22","SEW23" ).第三步创建一个SpatialPolygons
对象。最后,我们创建一个 SpatialPolygonsDataFrame
对象。这里我有一个填充了 NA
s 的虚拟数据框(请注意,行名称必须对应于多边形 ID)。
最后写入数据
rgdal::writeOGR(obj = sps_df,
dsn = "Forestplots",
layer = "Forestplots",
driver = "ESRI Shapefile",
overwrite_layer = TRUE)
这会在您的工作目录中创建一个新文件夹:
list.files()
# [1] "Forestplots"
list.files("Forestplots")
# [1] "Forestplots.dbf" "Forestplots.shp" "Forestplots.shx"
有关详细信息,请参阅链接的答案。