代码之家  ›  专栏  ›  技术社区  ›  B. Davis

创建包含特定光栅值的多边形

  •  0
  • B. Davis  · 技术社区  · 7 年前

    这个 raster 包可用于生成示例数据集。

    library(raster)
    filename <- system.file("external/test.grd", package="raster")
    r <- raster(filename)
    

    像下面的光栅一样,我的真实数据类似于动物栖息地的地图,并且“好”和“坏”区域分布不均匀。

    enter image description here

    为了更紧密地反映我的真实数据,我们可以在其他三个光栅上添加一点变化,并制作一个堆栈。

    s <- stack(r, r+250, r-250, r+100)
    

    s 是否可以创建围绕所有堆栈层中小于300的所有单元的多边形?

    作为扩展,我的最终目标是计算结果多边形之间的面积(或百分比)重叠。

    如有任何建议(具体或一般),将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  1
  •   coletl user6273920    7 年前

    由于使用的是光栅堆栈,因此所有单元格都应该具有相同的面积。在这种情况下,我认为根本不需要使用多边形。(注意,我对示例数据做了一些调整。)

    library(raster)
    filename <- system.file("external/test.grd", package="raster")
    r <- raster(filename)
    s <- stack(r, r + 50, r - 50, r + 100)
    
    # Create a new raster stack with results of a logical test
    s2 <- s < 300
    
    # Create a raster indicating which cells of the new stack
    # have values that are all TRUE
    r2 <- sum(s2) == length(unstack(s2))
    # Multiply by the area of a single cell
    r3 <- r2 * area(r2)[1]
    
    # Sum the area for all raster values
    sum(values(r3), na.rm = TRUE)
    ## 124800
    

    如果您想使用多边形,并且光栅不太大,请将堆栈转换为 SpatialPolygonsDataFrame 应该很快。这里有一个类似的方法,可以得到相同的结果:

    # Create a new raster stack with results of a logical test
    s2 <- s < 300
    
    # Convert to sp object
    spdf <- as(s2, "SpatialPolygonsDataFrame")
    
    # Index to the rows/features where the values in s2 were all TRUE
    spdf2 <- spdf[which(rowSums(spdf@data) == length(unstack(s))), ]
    
    rgeos::gArea(spdf2)
    ## 124800