从SpatialPolygons列表创建R-SpatialPolygonsDataFrame

4

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

以下是一个多边形列表的示例,应从中创建包含列表中所有多边形的SpatialPolygonsDataFrame。

编辑:SpatialPolygonsDataFrame必须从SpatialPolygons列表中创建!由于我的原始数据不包含单独值的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))
})

Regards!


1
{btsdaf} - lukeA
{btsdaf} - N'ya
2个回答

5

试试这个:

#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]]))

{btsdaf} - N'ya
{btsdaf} - Thai
glad to help! =) - Thai
第一个命令返回错误:在对象类型为“list”的对象中无法获取插槽(“polygons”)。 - Peter.k

4
你可以这样从一组 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)))    

(以上内容可能无法解决原帖中的问题,但它确实回答了所提出的问题——因此,本答案对于寻找答案的人可能会有帮助。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接