1

我有 8 个形状文件,每个文件都包含许多河流流域的轮廓。我使用了 rgdal、rgeos 和 sp 的组合来读取这些并形成 8 个 SpatialPolygonsDataFrame 对象的列表。我使用的代码如下:

unit.num <- c(13,18,19,29,41,75,79,80)
GetCatchmentShapes <- function(x) {
  file.name <- paste("GFMUnit",x,"_GFES_Watersheds_WGS84.shp",sep="")
  con = file.path(project.folder,"RawData","Watersheds","GFES Watersheds",file.name)
  catchment.list <- readOGR(con,ogrListLayers(con)) 
}
all.catchments <- sapply(unit.num, GetCatchmentShapes)

如何将 8 个元素组合all.catchments成一个 SpatialPolygonsDataFrame 对象?

4

2 回答 2

3

您可以使用spChFIDs(...)包中的函数sp将多边形 ID 更改为唯一值,然后用于rbind(...)组合 spatialPolygonDataFrame 对象。

这是一个使用法国、意大利和德国的 shapefile 的示例。

## example dataset; shapfiles for France, Italy, Germany
## you have this already...
library(raster)
FR <- getData("GADM",country="FRA",level=1)
IT <- getData("GADM",country="ITA",level=1)
GR <- getData("GADM",country="DEU",level=1)
spList <- list(FR,IT,GR)    # list of country shapefiles

# you start here...
library(sp)   # loaded with `rgdal`
set.IDS <- function(sp,i) spChFIDs(sp,paste(i,rownames(sp@data),sep="."))
result  <- do.call(rbind,mapply(set.IDS,spList,seq_along(spList)))
plot(result)

于 2014-11-24T21:46:51.100 回答
1

这有点混乱,并且可能有更好的方法来创建唯一的行 ID,但无论如何:

假设您的列表SpatialPolygonsDataFramesis called spdf_list,并且所有元素都具有相同的字段集:

spdf_list <- 
  mapply(spChFIDs, spdf_list, 
         split(as.character(seq_len(sum(sapply(spdf_list, length)))), 
               unlist(mapply(rep, seq_along(spdf_list), 
                             each=sapply(spdf_list, length)))))

single <- do.call(rbind, spdf_list)
于 2014-11-24T16:17:46.020 回答