将多个光栅提取编译为一个 table
Compile multiple raster extractions to one table
我有 3 个栅格,其中我使用 shapefile 中的多段线提取了数据。目前,我将提取作为 3 个单独的列表。有没有一种方法可以从所有三个栅格中提取数据并将它们编译成一个table,每个栅格的数据都有不同的列?
这是我目前使用的代码
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)
简而言之,您可以 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
在堆叠栅格上 returns 一个包含矩阵的列表。您最不想做的就是将其作为 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) <- c("new_name_1", "new_name_2")
修改它们。
我有 3 个栅格,其中我使用 shapefile 中的多段线提取了数据。目前,我将提取作为 3 个单独的列表。有没有一种方法可以从所有三个栅格中提取数据并将它们编译成一个table,每个栅格的数据都有不同的列?
这是我目前使用的代码
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)
简而言之,您可以 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
在堆叠栅格上 returns 一个包含矩阵的列表。您最不想做的就是将其作为 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) <- c("new_name_1", "new_name_2")
修改它们。