Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中从XYZ加速光栅_R_Parallel Processing_Raster_R Raster - Fatal编程技术网

在R中从XYZ加速光栅

在R中从XYZ加速光栅,r,parallel-processing,raster,r-raster,R,Parallel Processing,Raster,R Raster,我想从包含超过1亿个单元格的data.table创建光栅。目前,我将data.table转换为data.frame,然后使用raster包中的rasterFromXYZ函数。不幸的是,光栅包非常慢,创建光栅需要4-5个小时 是否有任何软件包或已实施的解决方案来加速此过程?如果不是(我假设是这样),我认为最快的解决方案应该是分割big data.table以创建许多小光栅,然后在最后合并它们?数据表是按行和列排序的,您是否已经知道网格的几何结构?如果是这样的话,您可能可以通过创建一个大小和形状合适

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


是否有任何软件包或已实施的解决方案来加速此过程?如果不是(我假设是这样),我认为最快的解决方案应该是分割big data.table以创建许多小光栅,然后在最后合并它们?

数据表是按行和列排序的,您是否已经知道网格的几何结构?如果是这样的话,您可能可以通过创建一个大小和形状合适的矩阵,然后从该矩阵创建一个光栅并为其指定几何体来加快速度

小小的例子:

> 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)

无论你做什么,都需要在100000000个单元格光栅上花费一段时间,因此,请使用与实际数据格式相似的较小示例进行测试,看看它是否成功。

也许你可以避免创建光栅层对象,将数据保持在XYZ形式,并以某种方式处理它?你需要光栅做什么?