R:提取到shapefile的光栅数据作为矩阵添加-writeOGR中出错

R:提取到shapefile的光栅数据作为矩阵添加-writeOGR中出错,r,spatial,raster,shapefile,r-raster,R,Spatial,Raster,Shapefile,R Raster,我已使用以下方法将几个光栅层的中值提取到多边形形状文件中: #read shapefile huc12 <- readOGR(dsn=gdb1, layer="HUC12_proj") #read raster temp.avg <- raster("projected_climate_rasters/temp_avg_copy") #extract median of raster for each polygon huc12$Temp.Avg.Med <- extrac

我已使用以下方法将几个光栅层的中值提取到多边形形状文件中:

#read shapefile
huc12 <- readOGR(dsn=gdb1, layer="HUC12_proj")

#read raster
temp.avg <- raster("projected_climate_rasters/temp_avg_copy")

#extract median of raster for each polygon
huc12$Temp.Avg.Med <- extract(temp.avg, huc12, fun = median)
而另一个(PET_AnCV)显示为:

.. ..$ PET_AnCV : num [1:87700, 1] 94.4 ...
直到尝试编写新的shapefile时,我才发现这一点,这导致了以下错误:

> write_shape(huc12, "huc12")
Error in writeOGR(shp, dir, base, driver = "ESRI Shapefile", overwrite_layer = TRUE) : 
Can't convert columns of class: matrix; column names: PET_AnCV

有什么建议吗?(考虑到所涉及的数据,我无法使其再现,也无法用示例形状文件再现。)

这是因为从
PET\u AnCV
提取的值是矩阵而不是向量。从多层光栅提取值时,这是正常的,在多层光栅中,每个特征(即多边形)有一行,每个层有一列。在这种情况下,您只有一个图层(和列),因此在将其指定给shapefile时,可以轻松地选择相应的列:

vals <- extract(PET_AnCV,huc12)
huc12$PET_AnCV <- vals[,1]
# load libraries
library(raster)
library(rgdal)
library(foreign)

# download shapefile which is used for extraction
huc12 <- getData('GADM', country='AUT', level=1)
这里我需要将它写入磁盘,因为我还没有dbf文件。既然你已经有了它,你可以跳过这部分

# write to disk
writeOGR(huc12,dsn = 'huc12.shp','huc12',driver = 'ESRI Shapefile')
创建具有一些随机值的10层rasterbrick以从中提取:

# create fake value rasterbrick
ras <- raster()
PET_AnCV <- lapply(1:10,function(x) setValues(ras,runif(ncell(ras))))
PET_AnCV <- do.call(brick,PET_AnCV)

HTH

Val:非常感谢您抽出时间!这很有帮助!
# write to disk
writeOGR(huc12,dsn = 'huc12.shp','huc12',driver = 'ESRI Shapefile')
# create fake value rasterbrick
ras <- raster()
PET_AnCV <- lapply(1:10,function(x) setValues(ras,runif(ncell(ras))))
PET_AnCV <- do.call(brick,PET_AnCV)
# extract values and append to dbf
vals <- extract(PET_AnCV,huc12,fun=median)

dbf <- read.dbf('huc12.dbf')
dbf <- cbind(dbf,vals)
write.dbf(dbf,'huc12.dbf')