绑定多个shapefile会导致行名错误

问题描述

我有大约20个shapefile的列表,我想将它们绑定到一个文件中。这些shapefile具有不同数量的字段-一些具有1,一些具有2。示例如下所示:

 # 1 field 
 > dput(head(shp[[1]]))
  structure(list(area = c(1.60254096388,1.40740270051,0.093933438653,0.609245720277,22.892748868,0.0468096597394)),row.names = 0:5,class = "data.frame")

 # 2 fields 
> dput(head(shp[[3]]))
  structure(list(per = c(61,70,79,90,57,66),area = c(2218.8,876.414,2046.94,1180.21,1779.12,122.668)),row.names = c(0:5),class = "data.frame")

我使用以下代码将它们绑定起来,并且按我的意愿工作:

merged<- raster::bind(shp,keepnames= FALSE,variables = area)
writeOGR(merged,'./shp',layer= 'area',driver="ESRI Shapefile")

但是,我现在需要对列表中的shapefile之一进行子集化。我是这样做的:

shp[[3]]@data <- shp[[3]]@data %>% subset(Area >= 50)
names(shp[[3]]@data)[names(shp[[3]]@data) == "Area"] <- "area"

但是,当我运行bind命令时,这会给我一个错误:

merged<- raster::bind(shp,variables = area)

Error in `.rowNamesDF<-`(x,value = value) : invalid 'row.names' length
Calls: <Anonymous> ... row.names<- -> row.names<-.data.frame -> .rowNamesDF<-
Execution halted

我不确定为什么会这样。 shapefile尚未更改,它们只是子集。我尝试按照以下所示的方式删除行名,但仍会引发相同的错误。

rownames(shp[[3]]@data) <- NULL

那会是什么?

解决方法

我认为问题在于您为@data(属性)设置了子集,但应该对整个对象进行设置。像这样

x <- shp[[3]]  # for simplicity
x <- x[x$Area >= 50,]
names(x)[names(x) == "Area"] <- "area"
shp[[3]] <- x

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...