【问题标题】:Extracting percentage distribution of values within a raster, from a polygon subset从多边形子集中提取栅格内值的百分比分布
【发布时间】:2020-08-10 03:58:24
【问题描述】:

我有一个栅格和sf 多边形,如下所示:

library(raster)
libary(sf)

# Create raster r
r = raster(ncol=1000, nrow=1000, xmn=0, xmx=1000, ymn=0, ymx=1000)
values(r) = round(runif(ncell(r),1,10))

# Create sf polygon
poly_sf = st_sfc(st_polygon(list(cbind(c(0,10,50,100,0),c(0,70,300,500,0)))))

栅格包含值介于 1 和 10 之间的像元。我希望能够在多边形poly_sf 生成的栅格像元子集中生成一个数据框,其中包含每个值的总像元的总体百分比.我查看了exactextractr,但还没有弄清楚如何使用该软件包实现我想要的。

【问题讨论】:

    标签: r r-raster sf


    【解决方案1】:

    您可以使用raster 包中的mask 函数,但您需要将多边形转换为sf 对象:

    library(raster)
    library(sf)
    
    # Create raster r
    r = raster(ncol=1000, nrow=1000, xmn=0, xmx=1000, ymn=0, ymx=1000)
    values(r) = round(runif(ncell(r),1,10))
    
    # Create sf polygon
    poly_sf = st_sfc(st_polygon(list(cbind(c(0,10,50,100,0),c(0,70,300,500,0)))))
    p2 <- st_as_sf(poly_sf)
    
    # Plot the raster object:
    plot(r)
    

    您可以使用mask 函数创建掩码:

    plot(mask(r, p2))
    

    因此,要从此蒙版对象中提取值,您可以使用mask 函数并使用table 计算每个值的比例:

    # Subset the polyfon from the SF object: 
    subset_ra <- mask(r, p2)
    
    # Calculate the porportion of each value
    df <- as.data.frame(table(as.matrix(subset_ra)))
    df$Percent <- df$Freq / sum(df$Freq) * 100
    
       Var1 Freq   Percent
    1     1  154  5.517736
    2     2  329 11.787890
    3     3  287 10.283053
    4     4  290 10.390541
    5     5  325 11.644572
    6     6  305 10.927983
    7     7  319 11.429595
    8     8  312 11.178789
    9     9  315 11.286277
    10   10  155  5.553565
    

    它回答了你的问题吗?

    【讨论】:

    • 是的。它做了!当我尝试crop(r, p2) %&gt;% hist(plot=F, breaks = c(1:10)) 时,我实现了同样的目标,而且速度更快(至少对于我的问题而言)。但我不明白为什么......
    • 不客气。但要谨慎使用crop,因为如果您查看hist ($counts) 的输出,您会发现这个数字比使用mask.. 的数字要高得多。所以,我认为使用crop 会使对面。
    • raster::crop 将光栅的范围缩小到另一个对象的边界框,而 raster::mask 将仅选择特定掩蔽对象内的单元格(并保留原始范围)。在矩形蒙版的特殊情况下,结果将是等效的,其中蒙版及其边界框相等 - 但这不能保证,请谨慎行事
    • 感谢您的解释!确实你是对的,crop 得到一个带有第二个对象边界的矩形框。这也是我包含mask 输出的图形表示的原因。
    • 当掩码sf对象是一个几何体时,此方法有效,但是如何将其应用于具有多个几何体的对象?
    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多