R 使用一个shapefile(具有多个多边形)批处理/提取一个光栅的原始数据?

R 使用一个shapefile(具有多个多边形)批处理/提取一个光栅的原始数据?,r,r-raster,R,R Raster,如果我们有一个光栅,比如一个国家的整数高程数据, 一个多边形形状文件,比如说,将那个国家的300个河流流域离散化,每个流域都有一个唯一的名称,我们如何最容易地为所有流域获得这样的输出 basinID, gridcellelev a, 320 a, 321 a, 320 b, 17 b, 18 b, 19 最麻烦的方法似乎是将单个shapefile过滤/转换为300个shapefile, 将光栅剪切300次到300个唯一ID光栅中,读回,为每个盆地生成单独的表格,然后将它们全部剪切到一起 另一方

如果我们有一个光栅,比如一个国家的整数高程数据, 一个多边形形状文件,比如说,将那个国家的300个河流流域离散化,每个流域都有一个唯一的名称,我们如何最容易地为所有流域获得这样的输出

basinID, gridcellelev
a, 320
a, 321
a, 320
b, 17
b, 18
b, 19
最麻烦的方法似乎是将单个shapefile过滤/转换为300个shapefile, 将光栅剪切300次到300个唯一ID光栅中,读回,为每个盆地生成单独的表格,然后将它们全部剪切到一起

另一方面,理想的方法似乎是跳过文件生成,不保存xy数据,并从仅使用一个光栅和一个形状文件创建同一个表格-通过某种方式选择盆中的单元,用basinID标记它们,创建表格,丢失坐标,并不断迭代和追加该表,直到第300个盆地

我不是在寻找任何统计数据,只是网格单元高程的原始数据列表,这可能是某些标准剪裁方法的一部分。我相信ArcMap的标准光栅剪辑属性表输出不是原始数据,而是单元格的计数/频率。那也行

我不知道如何最小限度地复制光栅和多边形形状文件, 因此,如果有任何提示/库/函数/示例,我将不胜感激。作为起点:

library(tidyverse)
library(raster)
library(rgdal)
library(sf)

elev_raster <- raster("spain_elev_meters.tif") #integer raster
basins <- readOGR("spainbasins.shp", "spainbasins") %>% st_as_sf() #unique basin ID column: `basinID` 
库(tidyverse)
图书馆(光栅)
图书馆(rgdal)
图书馆(sf)

elev_raster如果您搜索“提取光栅形状文件”,我想您会找到答案

示例数据:

library(raster)
p <- shapefile(system.file("external/lux.shp", package="raster"))
r <- raster(p)
values(r) <- 1:ncell(r)
解决方案1。提取值并应用函数。例如
mean

x <- extract(r, p, fun=mean, na.rm=TRUE)
解决方案2。以获得您要求的结构

x <- extract(r, p)
z <- do.call(rbind, lapply(1:length(x), function(i) cbind(i, x[[i]])))
得到这个结果的另一种方法是使用我上面所做的

x <- extract(r, p)
z <- do.call(rbind, lapply(1:length(x), function(i) cbind(i, x[[i]])))

x谢谢@Robert Hijmas的提示。我不是在寻找一个平均值,我也不知道在
p
中,shapefile的任何特征将在哪里被选择/迭代-如果lux.shp中有300行独特的多边形呢?我希望有一个表格,其中包含每个多边形的网格高程原始列表(“问题中的basinID”)或每个多边形的高程频率列表。致力于获得可重复性最小的多多边形样本形状文件和问题中添加的光栅。这是R。操作是矢量化的(迭代是隐式的)。勒克斯有12个多边形哦,我明白了,很好,12个多边形-谢谢你说得清楚。因此,如果我不希望每个多边形有一个值,而是希望每个多边形的所有单元格值的列表(原始值或频率),我想我可以按照正确的等效值fun=count或fun=freq做一些事情,或者甚至不包括函数,所以
x不包括函数,就像我的
解决方案2
中那样,从那里开始。如果你想要频率,你可以做
x是否可以添加解决方案3以获得答案中的频率?我看到您基本上在上面的评论中列出了所有内容,但我仍然难以完成它,特别是如何填写
。我意识到我可以从原始计数中获得频率,但我猜单独保存原始计数然后计数可能会更快。我正在阅读您关于这个惊人的库及其所有功能的非常详尽的文档。
v
#[1] 14.00000 43.40000 49.00000 36.00000 29.50000 59.00000 91.00000 71.83333
#[9] 73.50000 87.16667 78.50000 59.57143
x <- extract(r, p)
z <- do.call(rbind, lapply(1:length(x), function(i) cbind(i, x[[i]])))
i <- sapply(x, length)
j <- rep(1:length(i), i)
z <- cbind(j, unlist(x))

colnames(z) = c("ID", "value")
head(z)
#     ID value
#[1,]  1     4
#[2,]  1     5
#[3,]  1    13
#[4,]  1    14
#[5,]  1    15
#[6,]  1    22
tail(z)
#      ID value
#[51,] 12    55
#[52,] 12    56
#[53,] 12    57
#[54,] 12    64
#[55,] 12    65
#[56,] 12    66
values(r) <- rep(1:4, 25)
f <- extract(r, p, fun=function(i,...) table(i)) 
x <- extract(r, p) 
ff <- lapply(x, table)
ff[1:2]
#[[1]]
#1 2 3 4 
#3 2 1 1 

#[[2]]
#1 2 3 4 
#1 1 2 1 
x <- extract(r, p)
z <- do.call(rbind, lapply(1:length(x), function(i) cbind(i, x[[i]])))
fff <- tapply(z[,2], z[,1], table)