从spatialpolygondataframe中从光栅堆栈提取值
我有一个光栅堆栈,里面有27个光栅。我在一个空间多边形数据框中有27个对应的多边形。我想将多边形[I]覆盖在光栅[I]上,从光栅[I]中提取并求和值,计算多边形[I]中的单元数,然后将求和值除以单元数。换句话说,光栅是一种利用率分布或核心使用密度。我想知道在多边形与光栅重叠的区域中有多少用途。我想除以多边形中的单元数,以考虑多边形的大小 我有一个脚本,是给我这样做的,只是它是为了从一个光栅中提取数据,只通过数据帧中任意数量的空间多边形。它工作,它的丑陋,我现在想把它转换成更流线型的东西。我只希望我身边有人能帮忙,因为这可能需要一段时间 这是我收到的代码和我对正在发生的事情的总结:从spatialpolygondataframe中从光栅堆栈提取值,r,geospatial,polygon,raster,R,Geospatial,Polygon,Raster,我有一个光栅堆栈,里面有27个光栅。我在一个空间多边形数据框中有27个对应的多边形。我想将多边形[I]覆盖在光栅[I]上,从光栅[I]中提取并求和值,计算多边形[I]中的单元数,然后将求和值除以单元数。换句话说,光栅是一种利用率分布或核心使用密度。我想知道在多边形与光栅重叠的区域中有多少用途。我想除以多边形中的单元数,以考虑多边形的大小 我有一个脚本,是给我这样做的,只是它是为了从一个光栅中提取数据,只通过数据帧中任意数量的空间多边形。它工作,它的丑陋,我现在想把它转换成更流线型的东西。我只希望
msum99Kern07 = SpatialPolygonDataFrame (many polygons)
KERNWolfPIX07m = Raster (this is a single raster, I have 27 rasters I put into a stack
)
#从光栅到多个多边形提取值
sRISK_Moose07m也许我遗漏了什么,但我认为你把问题复杂化了。对我来说,你有:
光栅堆栈:光栅列表:ss
与ss相同大小的多边形列表:polys
您需要从(ss、polys)中为每对(层、多边形)应用extract
sapply(1:nlayers(ss),function(i){
也许我遗漏了什么,但我认为你把问题复杂化了。对我来说,你有:
光栅堆栈:光栅列表:ss
与ss相同大小的多边形列表:polys
您需要从(ss、polys)中为每对(层、多边形)应用extract
sapply(1:nlayers(ss),function(i){
m当你问关于R的问题时,总是使用简单的可重复的例子,而不是你自己的数据;除非你想做的事情对这样的例子有效,但对你的数据无效,但仍然显示了有效的例子和你得到的错误信息。你通常可以从帮助文件中的例子开始,如下所示?提取
r <- raster(ncol=36, nrow=18)
r[] <- 1:ncell(r)
s <- stack(r, r*2)
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
polys <- SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1),
Polygons(list(Polygon(cds2)), 2)))
v <- extract(s, polys, small=TRUE)
#cellnumbers for each polygon
sapply(v, NROW)
# mean for each polygon
sapply(v, function(x) apply(x, 2, mean, na.rm=T))
r当您询问有关r的问题时,请始终使用简单的可复制示例,而不是您自己的数据;除非您想做的事情可能适用于此类示例,但不适用于您的数据,但仍然显示了有效的示例以及您收到的错误消息。您通常可以从帮助文件中的示例开始,如下所示从?摘录
r <- raster(ncol=36, nrow=18)
r[] <- 1:ncell(r)
s <- stack(r, r*2)
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
polys <- SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1),
Polygons(list(Polygon(cds2)), 2)))
v <- extract(s, polys, small=TRUE)
#cellnumbers for each polygon
sapply(v, NROW)
# mean for each polygon
sapply(v, function(x) apply(x, 2, mean, na.rm=T))
r感谢您尝试此操作。我知道这是一个巨大的挑战,我担心这对人们来说太多了。我不知道如何提供数据使其可复制-对此表示抱歉。我将尝试您的代码,我只是害怕您关于与ss大小相同的多边形的声明。您的意思是相同的范围吗?@Kerry我的意思是2LIST的大小是一样的。不是吗?是的,有和多边形一样多的光栅。光栅[1]需要与多边形[1]一起使用,正如我所想的那样。我试图运行您提供的纸条,但有些东西不起作用。我的多边形层实际上是一个空间多边形数据框架
(使用getverticeshr
命令创建)。当我运行脚本时,我得到:extract中出错(Rastwtrial[[I]],moose99kern[I],method=“bilinear”,:为函数“extract”选择方法时计算参数“y”时出错:[.data.frame中出错(x@data,i,j,…,drop=FALSE):未定义选定列
是否有办法向您提供数据,以便您重现错误?我使用了dput命令,希望您可以将我的示例数据放入R并开始工作???感谢您的尝试。我知道这是一个巨大的挑战,我担心这对人们来说太多了。我不知道如何向m提供数据让它可复制-很抱歉。我会试试你的代码,我只是害怕你关于多边形大小与ss相同的说法。你的意思是相同的范围吗?@Kerry我的意思是这两个列表的大小相同。不是吗?是的,光栅和多边形一样多。光栅[1]需要与多边形[1]一起使用正如您所做的,我想。我试图运行您提供的scrip,但有些东西不起作用。我的多边形层实际上是一个spatialpolygondatafram
(使用getverticeshr
命令创建)。当我运行脚本时,我得到:提取错误(Rastwtrial[[I]],moose99kern[I],method=“bilinear”,:在为函数“extract”选择方法时计算参数“y”时出错:“.data.frame”中出错(x@data,i,j,…,drop=FALSE):未定义选定列
是否有办法向您提供数据,以便您重现错误?我使用了dput命令,希望您可以将示例数据放入R并开始工作???我没有非常小的多边形(即多边形小于光栅网格单元大小),也没有光栅之外的多边形。我确实使用了我唯一知道的方法—它是我使用的数据的子集—来展示示例数据。我不知道其他“共享”我的问题的方法。我没有非常小的多边形(即,多边形小于光栅网格单元大小),我也没有光栅之外的多边形。我确实使用了我唯一知道的方法——这是我使用的数据的一个子集——提供了示例数据。我不知道有其他方法可以“共享”我的问题。
dput(mtestpoly)
new("SpatialPolygonsDataFrame"
, data = structure(list(id = structure(1:2, .Label = c("F01001_1", "F07002_1"
), class = "factor"), area = c(1259.93082578125, 966.364499511719
)), .Names = c("id", "area"), row.names = c("F01001_1", "F07002_1"
), class = "data.frame")
, polygons = list(<S4 object of class structure("Polygons", package = "sp")>,
<S4 object of class structure("Polygons", package = "sp")>)
, plotOrder = 1:2
, bbox = structure(c(6619693.77161797, 1480549.31292137, 6625570.48348294,
1485861.5586371), .Dim = c(2L, 2L), .Dimnames = list(c("x", "y"
), c("min", "max")))
, proj4string = new("CRS"
, projargs = NA_character_
new("RasterStack"
, filename = ""
, layers = list(<S4 object of class structure("RasterLayer", package = "raster")>,
<S4 object of class structure("RasterLayer", package = "raster")>)
, title = character(0)
, extent = new("Extent"
, xmin = 1452505.6959799
, xmax = 1515444.7110552
, ymin = 6575235.1959799
, ymax = 6646756.8040201
)
, rotated = FALSE
, rotation = new(".Rotation"
, geotrans = numeric(0)
, transfun = function ()
NULL
)
, ncols = 176L
, nrows = 200L
, crs = new("CRS"
, projargs = NA_character_
)
, z = list()
, layernames = "Do not use the layernames slot (it is obsolete and will be removed)\nUse function 'names'"
)
sapply(1:nlayers(ss), function(i) {
m <- extract(ss[[i]],polys[i], method='bilinear', na.rm= T)[[1]]
d <- ifelse (!is.null(m) , sum(m)/length(m), NA)
d
})
## generate some data
library(raster)
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
## In your case you need something like SpatialPolygons(moose99kern)
polys <- SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1),
Polygons(list(Polygon(cds2)), 2)))
r <- raster(ncol=36, nrow=18)
r[] <- 1:ncell(r)
r1 <- raster(ncol=36, nrow=18)
r1[] <- seq(-1,-2,length.out=ncell(r1))
ss <- stack(r,r1)
## density compute
sapply(1:nlayers(ss), function(i) {
## sum of values of the cells of a Raster ss[[i]] covered by the poly polys[i]
m <- extract(ss[[i]],polys[i], method='bilinear', na.rm= T)[[1]]
d <- ifelse (!is.null(m) , sum(m)/length(m), NA)
})
[1] 387.815789 -1.494714
r <- raster(ncol=36, nrow=18)
r[] <- 1:ncell(r)
s <- stack(r, r*2)
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
polys <- SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1),
Polygons(list(Polygon(cds2)), 2)))
v <- extract(s, polys, small=TRUE)
#cellnumbers for each polygon
sapply(v, NROW)
# mean for each polygon
sapply(v, function(x) apply(x, 2, mean, na.rm=T))