【问题标题】:Calculate number of NA and non-NA values in a raster but with new resolution and extent计算栅格中 NA 和非 NA 值的数量,但具有新的分辨率和范围
【发布时间】:2022-02-15 01:48:14
【问题描述】:

我需要计算原始分辨率为 1 x 0.00811 但聚合为 2 度并具有新范围的栅格中 NA 和非 NA 值的数量。

原始栅格(可在此处获得:https://datadryad.org/stash/dataset/doi:10.5061/dryad.052q5,参见输出 1)与另一个数据集(不幸的是,不是开源的)合并以在输出 2 中生成栅格:

输出 1

class      : RasterLayer 
dimensions : 19142, 35738, 684096796  (nrow, ncol, ncell)
resolution : 0.01, 0.00811  (x, y)
extent     : -178.6931, 178.6869, -65.29534, 89.94628  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
source     : HumanFootprintWGS84.tif 
names      : HumanFootprintWGS84 
values     : 0, 50  (min, max)

输出 2

dimensions : 19142, 35738, 684096796  (nrow, ncol, ncell)
resolution : 0.01, 0.00811  (x, y)
extent     : -178.6931, 178.6869, -65.29534, 89.94628  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
source     : r_tmp_2022-02-10_145403_42352_01781.grd 
names      : layer 
values     : 0.6730382, 1  (min, max)

我用于重新采样的栅格是一个虚拟的,如下:

输出 3

class      : RasterLayer 
dimensions : 65, 180, 11700  (nrow, ncol, ncell)
resolution : 2, 2  (x, y)
extent     : -180, 180, -65, 65  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 

不幸的是,合并并因此重新采样的栅格在海岸线和湖泊附近有很多 NA 值;而st_warp 中的平均方法将 NA 值转换为 0,这会扭曲某些单元格的平均值的计算。

我决定通过将平均值乘以非 NA 值的数量/(非 NA 的数量 - NA 的数量)来调整平均得到的值,即:

平均x {非NA值的数量/(非NA值的数量/NA值的数量)}

为此,我需要知道非 NA 和 NA 值的数量是原始合并栅格(输出 2),但分辨率为 2 度,输出 3 的范围(-180、180、-65、65)。

我是地图和栅格的新手,如果这是一个基本问题,我深表歉意。

我尝试使用原始数据集和虚拟网格的坐标进行栅格化,但这不会让我得到 NA 值的数量,而只是单元格的数量(加上合并的栅格超过 5.1 Gb)。我试图修剪 NA 值(愚蠢的想法)和 st_warp 但没有平均(无论如何都使用最近的邻居)。

如果有人有任何想法或有更优雅的解决方案,我将不胜感激。

衷心感谢,

编辑:通过反复试验,我发现重新采样(再次感谢您,@Robert Hijmans)和 st_warp 都会有所不同,无论这些值是加载到内存中还是不是。

以下是示例输出,加载和不加载值:

terra::resample with averaging without data loaded in memory

terra::resample with averaging with data loaded in memory

【问题讨论】:

  • 也许你在寻找freq(r, value=NA)。或者(可能效率较低)cellStats(is.na(r), sum)
  • 谢谢。大概。诀窍是在合并值上测量它,但使用新的 2 度分辨率和新范围。我尝试了聚合,但令人讨厌的是,我需要乘以一个非整数才能达到 2 度,我认为聚合是不可能的。
  • 如果您需要通过非整数值更改分辨率,请参见此处。 stackoverflow.com/a/37956798/2761575
  • 下次请提供可重现的数据集,而不是数据的图片:youtu.be/3EID3P1oisg

标签: r r-raster r-stars


【解决方案1】:

示例数据

library(terra)
#terra 1.5.20
library(geodata)
w <- world(path=".")
# input raster
x <- rast(res=3)
x <- rasterize(w, x, field=1)

# output raster
r <- rast(res=10)

解决方案:

rs <- resample(x, r, "sum")

rs
#class       : SpatRaster 
#dimensions  : 18, 36, 1  (nrow, ncol, nlyr)
#resolution  : 10, 10  (x, y)
#extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84 
#source      : memory 
#name        :     layer 
#min value   : 0.1111111 
#max value   :  11.11111 

plot(rs)

为此,您需要terra 1.5.20。目前是development version。在 Windows 或 OSX 上安装它的最简单方法是使用 install.packages('terra', repos='https://rspatial.r-universe.dev')

terra 的早期版本忽略了“sum”选项。

回应您的评论:当我使用文件作为数据源时,sumaverage 得到相同的结果:

xx <- writeRaster(x, "test.tif", overwrite=T)
rs <- resample(xx, r, "sum")

我们可以将结果与精确提取多边形进行比较(这也有效,但会在大数据集上阻塞 R)

p <- as.polygons(r)
e <- extract(x, p, exact=TRUE, fun=sum, na.rm=TRUE)
re <- rast(r)    
re[e[,1]] <- e[,2]

plot(rs, re, xlab="resample", ylab="extract")

【讨论】:

  • 谢谢,太棒了。烦人的是,我需要一个平均值(而不是总和),并且理想情况下不想松开存在一些 NA 的单元格,如果我运行 st_warp 并将栅格加载为代理(不知道为什么)或当我尝试terra::resample 中的总和(上图)。我注意到当我尝试 terra::resample 中的 min 和 max 方法时不会发生这种情况。我知道平均方法还没有运行,不是吗?再次感谢您。
  • 谢谢,平均值不起作用,我已经解决了这个问题。您还可以使用总和并将其除以所有非 NA 值的总和。像resample(!is.na(x), r, "sum") 这样的东西。对于我的示例数据,平均值始终为 1。
  • 再次感谢您。我认为平均方法只使用非 NA 值,不是吗?奇怪的是,根据值是否在内存中,重采样的输出与 terra 中的平均值存在差异。我也遇到过 stars::st_warp 的情况。如果内存中没有所有值,任何包含 NA 值的单元格都会丢失。虽然所有值都在内存中,但它们仍然存在,平均值是在非 NA 值上计算的(我希望/假设)。你以前遇到过这种情况吗?再次感谢您。
  • 我在原始问题中添加了示例。好奇...不知道为什么会这样。
  • 这很好奇,因为我没有看到(请参阅我的扩展答案)。您的文件可能有一些意想不到的地方。你能把它发给我,或者创建一个重现这个的例子吗?你不需要“假设”;该手册非常清楚,您可以检查我展示的一些示例数据和您自己的数据会发生什么。如果使用 NA 值,则结果必须是 NA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多