Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将多个光栅提取编译为一个表_R_R Raster_Sp - Fatal编程技术网

R 将多个光栅提取编译为一个表

R 将多个光栅提取编译为一个表,r,r-raster,sp,R,R Raster,Sp,我有3个光栅,其中我使用一条多段线从shapefile中提取数据。目前,我有3个单独的列表提取。是否有一种方法可以从所有三个光栅中提取数据,并将它们编译到一个表中,每个光栅的数据都有不同的列 这是我正在使用的当前代码 Harney_Transects <- readOGR(dsn = ".", layer = "Transect_HN") MeanTreeHeightHarneyBefore=raster('HN_TrMean_B_Clip.tif') ScanAngleHa

我有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)

Harney_断面简而言之,您可以
stack()
所有要从中提取数据的光栅,以及
从堆栈中提取数据

这是一个完全可复制的示例,使用了两个光栅和一个
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()

列的名称是堆栈中光栅图层的名称。您可以使用
names(rs)
访问这些名称,并使用
names(rs)修改它们。简言之,您可以
stack()
所有要从中提取数据的光栅,以及
从堆栈中提取

这是一个完全可复制的示例,使用了两个光栅和一个
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()

列的名称是堆栈中光栅图层的名称。您可以使用
名称(rs)
访问这些名称,并使用
名称(rs)修改它们。请使您的问题具有可复制性——因此不要参考您的特定文件——请参阅您上一个问题的评论(和我的答案):请使您的问题具有可复制性——因此不要参考您的特定文件——请参阅评论(以及我的回答)对于你之前的问题:所以我遵循了你的示例,但出于某种原因,它将所有内容提取到一个列表中。没错,它应该将内容提取到一个
列表中
。然后你需要
do.call(rbind.data.frame,我的提取列表)
将其转换为
data.frame
,将每列作为堆栈中的不同层。请参阅我的示例的第三个代码块。您应该复制/粘贴并运行可复制的示例,以了解其工作原理,然后将其应用于您的代码。问题是,即使我使用do.call函数,它仍然是一个列表,但似乎有只是一个R错误。所以我遵循了您的示例,但出于某种原因,它将所有内容提取到一个列表中。没错,它应该将内容提取到一个
列表中
。然后您需要
do.call(rbind.data.frame,我的\u提取的\u列表)
将其转换为
data.frame
,将每列作为堆栈中的不同层。请参阅我的示例的第三个代码块。您应该复制/粘贴并运行可复制的示例,以了解其工作原理,然后将其应用于您的代码。问题是,即使我使用do.call函数,它仍然是一个列表,但似乎有只是一个错误。
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