重新采样栅格

时间:2016-06-21 23:55:16

标签: r gis resolution raster

我正在尝试将具有高分辨率(25米)和分类数据(1到13)的森林覆盖栅格重新采样到具有较低分辨率(~1 km)的新RasterLayer。我的想法是将森林覆盖数据与其他低分辨率栅格数据结合起来:

  1. 我尝试了raster::resample(),但由于数据是绝对的,我丢失了很多信息:

    summary(as.factor(df$loss_year_mosaic_30m))
      0       1   2   3  4   5   6   7  8   9   10  11   12  13
    3777691  65  101 50 151 145 159 295 291 134 102 126 104  91 
    

    如您所见,新栅格具有所需的分辨率,但也有很多零。我认为这很正常,因为我在resample中使用了'ngb'选项。

  2. 第二种策略是使用raster::aggregate(),但我发现难以定义因子整数,因为分辨率的变化并不简单(如分辨率的两倍或相似)。

    我的高分辨率栅格具有以下分辨率,我希望它以相同的程度将其聚合为0.008333333, 0.008333333 (x, y)分辨率。

    loss_year
    class       : RasterLayer 
    dimensions  : 70503, 59566, 4199581698  (nrow, ncol, ncell)
    resolution  : 0.00025, 0.00025  (x, y)
    extent      : -81.73875, -66.84725, -4.2285, 13.39725  (xmin, xmax, ymin, ymax)
    coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
    data source : /Volumes/LaCie/Deforestacion/Hansen/loss_year_mosaic_30m.tif 
    names       : loss_year_mosaic_30m 
    values      : 0, 13  (min, max)
    

    我在aggregate帮助的描述之后尝试了~33.33因子:“单元格数是x的单元格数除以fact*fact(当事实是单个数字时) “。尽管如此,生成的栅格数据似乎与我的其他低分辨率栅格具有相同的行数和列数。

  3. 我从未使用过这种高分辨率的数据,而且我的计算也受到限制(其中一些命令可以使用clusterR并行化,但有时它们比非并行化命令花费的时间相同,特别是它们不适用于最近的neighboor计算)。

    我缺乏想法;也许我可以尝试layerize获得一个计数栅格,但我必须“聚集”并出现factor问题。由于这个过程花了我几天的时间来处理,我想知道创建低分辨率栅格的最有效方法,而不会丢失太多信息

    可重现的例子如下:

    r_hr <- raster(nrow=70, ncol=70) #High resolution raster with categorical data
    set.seed(0)
    r_hr[] <- round(runif(1:ncell(r_hr), 1, 5))
    r_lr <- raster(nrow=6, ncol=6) #Low resolution raster
    

    第一个策略:信息丢失

    r <- resample(r_hr, r_lr, method = "ngb") #The raster data is categorical
    

    第二个策略:难以定义总因子

    r <- aggregate(r_hr, factor) #How to define a factor to get exactly the same number of cells of h_lr?
    

    另一种选择:layerize

    r_brick <- layerize(r_hr)
    aggregate(r_brick, factor) #How to define factor to coincide with the r_lr dimensions? 
    

    感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

r_hr <- raster(nrow=70, ncol=70) #High resolution raster with categorical data
set.seed(0)
r_hr[] <- round(runif(1:ncell(r_hr), 1, 5))
r_lr <- raster(nrow=6, ncol=6)

r_hr
#class       : RasterLayer 
#dimensions  : 70, 70, 4900  (nrow, ncol, ncell)
#resolution  : 5.142857, 2.571429  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory
#names       : layer 
#values      : 1, 5  (min, max)

r_lr
#class       : RasterLayer 
#dimensions  : 6, 6, 36  (nrow, ncol, ncell)
#resolution  : 60, 30  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 

直接聚合是不可能的,因为70/6不是整数。

dim(r_hr)[1:2] / dim(r_lr)[1:2]
#[1] 11.66667 11.66667

最近邻重新取样也不是一个好主意,因为结果是任意的。

以下是您建议的逐层方法dww also showed already

b <- layerize(r_hr)
fact <- round(dim(r_hr)[1:2] / dim(r_lr)[1:2])
a <- aggregate(b, fact)
x <- resample(a, r_lr)

现在你有比例了。如果你想要一个单独的课程

y <- which.max(x)

在这种情况下,另一种方法是聚合类

ag <- aggregate(r_hr, fact, modal) 
agx <- resample(ag, r_lr, method='ngb')

请注意,agxy是相同的。但是它们都可能有问题,因为你可能有5个类的单元格,每个类别大约有20%,选择一个胜利者是不合理的。

答案 1 :(得分:4)

将土地覆盖图聚合成%覆盖层是非常标准的做法。即你应该瞄准生产13层,每层都像网格单元中的%覆盖层。这样做可以降低分辨率,同时保留尽可能多的信息。 N.B如果您需要与%不同的摘要统计信息,则应通过更改fun =中的aggregate函数,轻松地将以下方法调整为您想要的任何统计信息。

以下方法非常快(我的笔记本电脑只需几秒钟即可处理包含1亿个单元格的栅格):

Nhr <- 1e4 # resolution of high-res raster
Nlr <- 333 # resolution of low-res raster
Nratio <- as.integer(Nhr/Nlr) # ratio of high to low resolutions, to nearest integer value for aggregation

# create some rasters
r.hr <- raster(ncols=Nhr, nrows=Nhr)
r.lr <- raster(ncols=Nlr, nrows=Nlr)
r.hr[] <- sample(1:13, Nhr^2, replace=T)

# aggregate high res raster to *almost* the same resolution as the low res one (to nearest integer number of cells)
# each resulting layerN contains the fraction of area within that cell in which value of original raster is N. 
layer1 <- raster::aggregate(r.hr, Nratio, fun=function(x, na.rm=T) {mean(x==1, na.rm=na.rm)})
layer2 <- raster::aggregate(r.hr, Nratio, fun=function(x, na.rm=T) {mean(x==2, na.rm=na.rm)})

# and resample low res raster to the desired resolution
layer1 <- raster::resample(layer1, r.lr, method = "ngb") # Note you may prefer method = 'bilinear', depending on purpose.
layer2 <- raster::resample(layer2, r.lr, method = "ngb")

为每个图层重复,并将图层构建为堆栈或多波段栅格