【问题标题】:Compile multiple raster extractions to one table将多个栅格提取编译到一个表中
【发布时间】:2019-06-01 16:36:47
【问题描述】:

我有 3 个栅格,其中我使用 shapefile 中的折线提取了数据。目前,我将提取作为 3 个单独的列表。有没有一种方法可以从所有三个栅格中提取并将它们编译到一个表中,其中每个栅格的数据具有不同的列?

这是我正在使用的当前代码

  Harney_Transects <- readOGR(dsn = ".", layer = "Transect_HN")

  MeanTreeHeightHarneyBefore=raster('HN_TrMean_B_Clip.tif')
  ScanAngleHarneyBefore= raster('HNScanAngle_B_Clip.tif')
  MeanShrubHeightHarneyBefore= raster('HN_MeanShrub_B_Clip.tif')

  Extraction_Shrub_Harney= extract(MeanShrubHeightHarneyBefore,Harney_Transects)
  Extraction_Tree_Harney= extract(MeanTreeHeightHarneyBefore,Harney_Transects)
  Extraction_ScanAngle_Harney= extract(ScanAngleHarneyBefore,Harney_Transects)

【问题讨论】:

标签: r r-raster sp


【解决方案1】:

简而言之,您可以stack() 要从中提取数据的所有栅格,并从堆栈中extract

这是一个使用两个栅格和一个SpatialLines 对象的完全可重现的示例,就像您在问题中所说的那样。跳到最后一个代码块以直接回答您的问题。

library(sp)
library(raster)

# function to generate random rasters
gen_raster <- function(){
  r <- raster(nrows = 10, ncols = 10, res = 1, 
              xmn = 0, xmx = 10, ymn = 0, ymx = 10, 
              vals = rnorm(100, 5, 1))
  return(r)
}

# generate 2 random rasters
r1 <- gen_raster()
r2 <- gen_raster()

# view
par(mfrow = c(1,2))
  plot(r1, main = "raster 1"); plot(r2, main = "raster 2")
dev.off()

# generate transect (`SpatialLines` object)
m <- as.matrix(data.frame(x = 5.5, y = seq(0, 10, 1)))
l <- list(Lines(Line(m), "m"))
l <- SpatialLines(l)

# view the transect
plot(r1, main = "raster 1 with transect"); lines(l)

在堆叠栅格上运行 extract 会返回一个包含矩阵的列表。您最不想要的是将其作为data.frame 提取出来,这有点棘手。

rs <- stack(r1, r2)            # stack any amount of rasters to extract from
re <- extract(rs, l)           # extract at locations `l`
do.call(rbind.data.frame, re)  # convert to data.frame

    layer.1  layer.2
1  4.586890 5.115136
2  4.780503 5.093281
3  6.877302 3.337345
4  5.913230 3.755099
5  4.907834 4.887160
6  5.576908 5.386136
7  3.572350 5.225392
8  4.778727 5.391765
9  6.600041 4.205841
10 6.946321 5.544172

列的名称是堆栈中栅格图层的名称。您可以使用names(rs) 访问这些名称,并使用names(rs) &lt;- c("new_name_1", "new_name_2") 修改它们。

【讨论】:

  • 所以我按照您的示例进行操作,但由于某种原因,它将所有内容提取到一个列表中。
  • 没错,它应该将内容提取到list。然后您需要do.call(rbind.data.frame, my_extracted_list) 将其转换为data.frame,每列作为堆栈中的不同层。请参阅我的示例的第三个代码块。您应该复制/粘贴并运行可重现的示例以查看它是如何工作的,然后将其应用到您的代码中。
  • 问题是即使我使用了 do.call 函数,它仍然是一个列表,但它似乎只是一个 R 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多