【问题标题】:Speed up rasterFromXYZ in R在 R 中加速 rasterFromXYZ
【发布时间】:2020-01-06 12:06:37
【问题描述】:

我想从包含超过 1 亿个像元的 data.table 创建一个栅格。目前,我将data.table 转换为data.frame,然后使用raster 包中的rasterFromXYZ 函数。不幸的是,光栅包非常慢,创建光栅需要 4-5 小时。

是否有任何包或已经实施的解决方案来加快这个过程?如果不是(这就是我的假设),我认为最快的解决方案应该是划分大 data.table 以创建许多小栅格,然后在最后合并它们?

【问题讨论】:

  • 也许您可以避免创建 RasterLayer 对象,将数据保持在其 XYZ 形式并以某种方式使用它?您需要栅格做什么?

标签: r parallel-processing raster r-raster


【解决方案1】:

数据表是否按行和列排序,您是否已经知道网格的几何形状?如果是这样,那么您可能可以通过创建一个大小和形状正确的矩阵来加快速度,然后从该矩阵创建一个栅格并将几何分配给它。

小例子:

> d = data.frame(expand.grid(1:3,1:4),1:12)
> d
   Var1 Var2 X1.12
1     1    1     1
2     2    1     2
3     3    1     3
4     1    2     4
5     2    2     5
6     3    2     6
7     1    3     7
8     2    3     8
9     3    3     9
10    1    4    10
11    2    4    11
12    3    4    12

使用rasterFromXYZ 得到这个:

> r1 = rasterFromXYZ(d)
> r1
class      : RasterLayer 
dimensions : 4, 3, 12  (nrow, ncol, ncell)
resolution : 1, 1  (x, y)
extent     : 0.5, 3.5, 0.5, 4.5  (xmin, xmax, ymin, ymax)
crs        : NA 
source     : memory
names      : X1.12 
values     : 1, 12  (min, max)

现在该函数要做的一些事情是通过 X 和 Y 坐标来计算网格几何形状。但是,如果您已经知道范围和大小,那么您也可以通过几个步骤创建相同的栅格。

首先以正确的方式制作一个矩阵 - 对于我在d 中的排序,我需要按行填充矩阵并将行翻转以获得正确的顺序。如果您的 XYZ 表的顺序不同,那么您可能需要进行一些其他操作,或者它可能是正确的。注意这里我要提前知道有多少行和列:

r2 = raster(matrix(d[,3],ncol=3,nrow=4,byrow=TRUE)[4:1,])

然后设置范围。这里我必须提前知道范围,在这种情况下,比最小值和最大值宽半个单元格,我的单元格大小是一个单位:

extent(r2) = c(xmin=0.5, xmax=3.5, ymin=0.5, ymax=4.5)

无论您在 100,000,000 个像元栅格上做什么,都需要一段时间,因此请使用与您的真实数据相似的格式对较小的示例进行测试,看看是否成功。

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 2014-05-24
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多