R - SpatialPolygons 列表中的 SpatialPolygonsDataFrame
R - SpatialPolygonsDataFrame from a list of SpatialPolygons
我正在寻找一种从 SpatialPolygons 列表创建 SpatialPolygonsDataFrame 的方法?
下面是一个多边形列表的示例,应从中创建包含列表中所有多边形的 SpatialPolygonsDataFrame。
编辑:必须从 SpatialPolygons 列表创建 SpatialPolygonsDataFrame!由于我的原始数据不包含作为单独值的 SpatialPolygons,而是包含 SpatialPolygons 列表。
我收到此列表的方式与示例中的方式不同。我贴出例子来展示列表的数据结构。
SpatialPolygons 列表示例取自 https://stat.ethz.ch/pipermail/r-sig-geo/2013-January/017225.html:
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))
})
此致!
很简单...
试试这个:
#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 的解决方案来自提供的 link:
#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]]))
您可以从 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 遇到的问题,但它确实解决了所提出的问题 --- 因此这个答案可能对寻找该问题答案的人们有所帮助)。
我正在寻找一种从 SpatialPolygons 列表创建 SpatialPolygonsDataFrame 的方法?
下面是一个多边形列表的示例,应从中创建包含列表中所有多边形的 SpatialPolygonsDataFrame。
编辑:必须从 SpatialPolygons 列表创建 SpatialPolygonsDataFrame!由于我的原始数据不包含作为单独值的 SpatialPolygons,而是包含 SpatialPolygons 列表。 我收到此列表的方式与示例中的方式不同。我贴出例子来展示列表的数据结构。
SpatialPolygons 列表示例取自 https://stat.ethz.ch/pipermail/r-sig-geo/2013-January/017225.html:
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))
})
此致!
很简单...
试试这个:
#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 的解决方案来自提供的 link:
#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]]))
您可以从 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 遇到的问题,但它确实解决了所提出的问题 --- 因此这个答案可能对寻找该问题答案的人们有所帮助)。