【问题标题】:Creating spatialpolygons dataframe from list of polygons从多边形列表创建空间多边形数据框
【发布时间】:2018-12-13 19:02:22
【问题描述】:

我目前正在尝试从多边形列表(生物多样性研究的研究领域)创建一个多边形 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)

但这并没有像你想象的那样返回任何有用的东西,而且它丢失了地块的名称。

由于我还是 R 的新手,我也尝试了许多不同的方法,我无法完全判断这些方法的意义,但没有一个能返回我希望的结果,所以我用这些随机的方法来饶恕你.....

我期待您的建议。

非常感谢

附:我还按照 spatialpolygons{sp} package 中的描述尝试了以下操作:

> Polygons(forest, ID)
Error in Polygons(forest, ID) : srl not a list of Polygon objects

【问题讨论】:

    标签: r list polygons spatial-data-frame


    【解决方案1】:

    您可以按照此答案中描述的方法: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 对象。这里我有一个填充有NAs 的虚拟数据框(请注意,行名必须对应于多边形 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"
    

    有关详细信息,请参阅链接的答案。

    【讨论】:

    • 非常感谢您的完整回答!有没有办法自动创建矩阵?我有 150 个图,假设我能够在代码中正确编写每个多边形的所有顶点的所有坐标,这将花费大量时间......
    • 欢迎来到 Stack Overflow!如果此答案解决了您的问题,请将其标记为已接受。如果您有后续问题,请打开一个新问题 -- cmets 部分不是为回答而设计的。
    • 我刚刚看到你的另一个问题。我想你可能误解了我的回答。答案的forest &lt;- list(...) 部分只是为了让我可以重新创建您的原始矩阵列表。显然,如果您已经拥有 forest 对象,则不必这样做。
    • 非常感谢魏煌,其实我第二个问题正在学习lapply函数。像一种享受一样工作。非常感谢!
    • 我意识到,使用上面的 writeOGR 函数,来自 spatialpolygonsdataframe 的绘图名称会丢失。有没有办法维护情节名称?
    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 2018-08-01
    • 2019-02-22
    • 1970-01-01
    • 2011-01-02
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多