首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中加速rasterFromXYZ

在R中加速rasterFromXYZ
EN

Stack Overflow用户
提问于 2020-01-06 20:06:38
回答 1查看 877关注 0票数 0

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

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

EN

回答 1

Stack Overflow用户

发布于 2020-01-06 20:24:37

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

小小的例子:

代码语言:javascript
复制
> 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可以得到以下结果:

代码语言:javascript
复制
> 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表的排序不同,那么您可能需要执行一些其他操作,或者这可能是正确的。注意,这里我必须提前知道有多少行和列:

代码语言:javascript
复制
r2 = raster(matrix(d[,3],ncol=3,nrow=4,byrow=TRUE)[4:1,])

然后设置范围。在这里,我必须预先知道范围,在本例中,比最小和最大值宽半个单元格,我的单元格大小是一个单位:

代码语言:javascript
复制
extent(r2) = c(xmin=0.5, xmax=3.5, ymin=0.5, ymax=4.5)

无论你做什么,都需要花费一段时间在100,000,000个像元栅格上,所以用与你的真实数据格式相似的较小的例子来测试,看看这是否成功。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59611827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档