Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.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
从spatialpolygondataframe中从光栅堆栈提取值_R_Geospatial_Polygon_Raster - Fatal编程技术网

从spatialpolygondataframe中从光栅堆栈提取值

从spatialpolygondataframe中从光栅堆栈提取值,r,geospatial,polygon,raster,R,Geospatial,Polygon,Raster,我有一个光栅堆栈,里面有27个光栅。我在一个空间多边形数据框中有27个对应的多边形。我想将多边形[I]覆盖在光栅[I]上,从光栅[I]中提取并求和值,计算多边形[I]中的单元数,然后将求和值除以单元数。换句话说,光栅是一种利用率分布或核心使用密度。我想知道在多边形与光栅重叠的区域中有多少用途。我想除以多边形中的单元数,以考虑多边形的大小 我有一个脚本,是给我这样做的,只是它是为了从一个光栅中提取数据,只通过数据帧中任意数量的空间多边形。它工作,它的丑陋,我现在想把它转换成更流线型的东西。我只希望

我有一个光栅堆栈,里面有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))