【问题标题】:Fastest way to mask raster using points使用点遮罩栅格的最快方法
【发布时间】:2020-05-01 16:59:28
【问题描述】:

我有一个非常大的rasterbrick 和一些坐标保存在不同的对象中。我希望将这些点用作掩码,为我的点所在的所有单元格除了返回 NA(对于我的特定应用程序,我需要保留输入 rasterbrick 的范围、分辨率和原点) .

我可以通过以下方式做到这一点:

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

# Load a rasterbrick
b <- brick(system.file("external/rlogo.grd", package="raster"))

# Create some random points as test points for masking
pts<-as_tibble(rasterToPoints(b[[1]])) %>% 
  select(x, y) %>% 
  sample_n(15, replace = TRUE)

plot(b[[1]])
points(pts)

# Convert points to SpatialPoints so they can be passed to `mask`
pts <- st_as_sf(x = pts, coords = c("x", "y"),
                crs = crs(b))

# Mask stack using pts
xx<-raster::mask(b, pts)
plot(xx)

在此示例中,代码执行速度非常快,但如果按比例放大,则可能需要很长时间才能运行。对于大型多层rasterbrick,执行此操作的更有效方法是什么?对于规模感,我的 rasterbrick's are360, 720, 259200, 3653 (nrow, ncol, ncell, nlayers)` 所以加快速度会很棒。

【问题讨论】:

    标签: r raster


    【解决方案1】:

    这是很多层。

    您的代码(经过一些简化)

    library(raster)
    b <- brick(system.file("external/rlogo.grd", package="raster"))
    set.seed(1)
    pts <- sampleRandom(b, 10, sp=TRUE)
    xx <- raster::mask(b, pts)
    

    两种方案,不知道快不快。

    备选方案 1

    y <- rasterize(pts, b, 1)
    m <- mask(b, y)
    

    备选方案 2

    v <- extract(b, pts)
    r <- rasterize(pts, b, v)
    

    【讨论】:

    • 谢谢罗伯特。是的,我希望这些栅格不是那么大,但我正在处理 ISIMIP 每日气候数据;每个堆栈都是十年(在全球范围内)的每日气候数据,因此尺寸非常大。我想基本上“丢弃”全球所有我不需要的数据,除了我已经拥有的一些随机选择的点。我认为掩蔽可以让我这样做,但也许这不是最好的方法。
    • 暂时接受这个答案;虽然我不认为这两种解决方案都更快,但它们确实为我最初的问题提供了替代解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2015-03-23
    相关资源
    最近更新 更多