【问题标题】:R - SpatialPolygonsDataFrame from a list of SpatialPolygonsR - SpatialPolygons 列表中的 SpatialPolygonsDataFrame
【发布时间】:2018-04-04 01:15:35
【问题描述】:

我正在寻找一种从 SpatialPolygons 列表创建 SpatialPolygonsDataFrame 的方法?

在下面有一个多边形列表的示例,应该从中创建一个 SpatialPolygonsDataFrame,其中包含列表的所有多边形。

编辑:必须从 SpatialPolygons 列表创建 SpatialPolygonsDataFrame!由于我的原始数据不包含 SpatialPolygons 作为单独的值,而是包含 SpatialPolygons 列表。 我收到此列表的方式与示例中的不同。我发布了示例以显示列表的数据结构。

https://stat.ethz.ch/pipermail/r-sig-geo/2013-January/017225.html 获取的 SpatialPolygons 列表示例:

library(sp)
grd <- GridTopology(c(0.5, 0.5), c(1, 1), c(6, 6))
Spol <- as(grd, "SpatialPolygons")
list_of_SPolsu <- lapply(slot(Spol, "polygons"), function(x)
   SpatialPolygons(list(x)))
list_of_SPols <- lapply(slot(Spol, "polygons"), function(x) {
   Pol <- x
   slot(Pol, "ID") <- "1"
   SpatialPolygons(list(Pol))
})

问候!

【问题讨论】:

  • 您的链接已经包含有关如何将列表组合成一个 SpatialPolygon 的信息。之后,执行as(mySpatialPolygon, "SpatialPolygonsDataFrame"),你就得到了一个 SpatialPolygonsDataFrame。
  • 不幸的是,我的数据与示例中的数据略有不同。我没有单独的 SpatialPolygons,只有一个空间多边形列表。我将编辑我的问题以使其更清楚。

标签: r spatial sp


【解决方案1】:

这很简单...

试试这个:

#Creating a dataframe with Spol IDs
Spol_df<- as.data.frame(sapply(slot(Spol, "polygons"), function(x) slot(x, "ID")))

#Making the IDs row names 
row.names(Spol_df) <- sapply(slot(Spol, "polygons"), function(x) slot(x, "ID"))

# Making the spatial polygon data frame
Spol_SPDF <- SpatialPolygonsDataFrame(Spol, data =Spol_df)

让我知道它是否有效

编辑:

只是为了根据问题中的编辑完成答案... 关于如何从多边形列表中制作 SpatialPolygon 的解决方案来自提供的链接:

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

#Checking
length(unique(IDs)) == length(list_of_SPols)

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

【讨论】:

  • 您的方式可行,但不幸的是,我收到 SpatialPolygons 列表的方式与示例中的不同。我发布了示例以显示我的数据结构。我的数据不包括 SpatialPolygons 作为单独的值。因此,我必须从包含 SpatialPolygons 的列表中创建 SpatialPolygonsDataFrame。
  • 我无法理解...您提供的链接已经包含有关如何将多边形列表转换为正式类空间多边形对象的信息...我只是告诉您如何制作来自空间多边形的空间多边形数据框...您还在寻找什么?您只需将我使用的名称更改为您在从列表中创建 SpatialPolygons 时提供的名称...(从我给您的 3 行代码中取出 Spol...改用您的对象名称)..明白了吗?
  • 很高兴为您提供帮助! =)
  • 第一个命令在槽(shp,“多边形”)中返回错误:无法从“列表”类型的对象中获取槽(“多边形”)
【解决方案2】:

您可以从SpatialPolygon 对象列表中创建SpatialPolygonDataFrame 对象列表,如下所示:

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

或者,因为在这种情况下,所有 SpatialPolygon 对象的长度都是 1

df <- data.frame(id=1)
z <- lapply(list_of_SPols, function(i) SpatialPolygonsDataFrame(i, df, match.ID = FALSE))

您也可以先将 SpatialPolygons 组合成一个对象

library(raster)
sp <- bind(list_of_SPols)
spdf <- SpatialPolygonsDataFrame(sp, data.frame(id=1:length(sp)))    

(以上内容可能无法解决 OP 遇到的问题,但确实解决了所提出的问题 --- 因此,此答案可能对寻找该问题答案的人们有所帮助)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 2015-04-05
    • 1970-01-01
    • 2018-10-15
    • 2020-04-08
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多