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

时间:2017-05-18 13:26:24

标签: r spatial raster shapefile r-raster

我使用以下方法将多个栅格图层的中值提取到多边形shapefile中:

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

我将数据转换为数字:

huc12@data <- transform(huc12@data, Temp.Avg.Med = as.numeric(Temp.Avg.Med))

数据似乎全部附加到shapefile;但是,其中一组附加数据似乎已作为矩阵附加。例如, Temp.Avg.Med数据显示在huc12 @ data下:

.. ..$ Temp.Avg. Med: num [1:877000] 962 ...

而另一个(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

有什么建议吗? (鉴于所涉及的数据,我无法使其重现性,并且无法使用示例shapefile复制。)

1 个答案:

答案 0 :(得分:0)

这是因为PET_AnCV的值提取是矩阵而不是向量。从多层栅格中提取值时,这是正常的,您可以在其中获得每个要素(<​​em>即多边形)的行和每层列的矩阵。在这种情况下,您只有一个图层(和列),因此当您将其分配给shapefile时,可以轻松选择相应的列:

vals <- extract(PET_AnCV,huc12)
huc12$PET_AnCV <- vals[,1]

但由于这不是最好的方法,我将进一步解释并举例说明:

您收到的错误消息告诉您整个矩阵已分配到shapefile属性表的一个列中。在R中这很好(因为它是列表中的一个插槽),但是一旦你尝试将文件写入磁盘,就会遇到问题。

您可以使用foreign包的功能将结果存储在shapefile的dbf文件中,而不是尝试将提取的值直接写入shapefile。这是一种更清洁的方法,也可以让您更好地控制自己正在做的事情。如果你的shapefile很大和/或有很多多边形,这也会更快。

至于一个可重复的例子,如何:

我使用奥地利的Admin-1边框(有11个不同的多边形)作为shapefile的吊坠:

# 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层栅格砖,以便从中提取:

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

现在我提取值并使用cbind将它们附加到dbf文件。变量名称将是与多层栅格的图层名称对应的列名称。如果这些是通用的或描述性不够,您可以使用colnames(vals) <- new_name_vector轻松更改它们。

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

HTH