R:gdistance:转换堆栈汇总计算时间错误

时间:2018-01-12 15:26:36

标签: r matrix

我有一个带有大约1百万个细胞的数字高程模型(DEM),我使用Toblers Hiking函数生成一个转换矩阵,有8个neigbors,如van Etten 2017所述。

class       : TransitionLayer 
dimensions  : 1395, 778, 1085310  (nrow, ncol, ncell)
resolution  : 299.8762, 300.1004  (x, y)
extent      : 4192608, 4425912, 2775384, 3194024  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=merc +lon_0=45 +k=1 +x_0=5000000 +y_0=0 +datum=WGS84 
+units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
values      : conductance 
matrix class: dgCMatrix

我有第二个光栅描述Landuse与旅行速度有关的因素(草地= 1,沙漠= 2,岩石= 5,河流= 20,海= 99)。由此,我使用平均值计算转换矩阵。

tr_LU<-transition(LU_agg, mean, 8, symm=F)

LU_transition矩阵:

class       : TransitionLayer 
dimensions  : 1395, 778, 1085310  (nrow, ncol, ncell)
resolution  : 299.8762, 300.1004  (x, y)
extent      : 4192608, 4425912, 2775384, 3194024  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=merc +lon_0=45 +k=1 +x_0=5000000 +y_0=0 +datum=WGS84 
+units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
values      : conductance 
matrix class: dsCMatrix 

我想将两个过渡层放在一起,所以我将它们堆叠起来并通过计算产品来总结它们。

st<-stack(tr_LU,conductance)
trProd<-prod(st)
在我中止它们之前,计算耗时超过30小时,考虑到它只有800万次简单乘法(两个光栅~1百万个单元;用8个邻居计算的转换 - > 8百万个值),这对我来说似乎不太可能是现实的。没有给出错误,只有30小时的CPU使用率持续25%。

这个计算时间可能是现实的还是某种错误?

如果现实哪种其他方式可以关联两个Rasters?我考虑将DEM转换矩阵转换为累积成本表面栅格,并将其单元格值与LandUse-raster中的单元格值相乘。但是我如何将结果转换回转换矩阵,因为gdistance需要一个?

可以访问DEM-和LU-raster以及完整的脚本here

2 个答案:

答案 0 :(得分:0)

首先尝试使用较小的示例。这些功能不是很优化,因为它们依赖于Matrix和igraph包。要使计算可行,您可以先聚合数据。通常,聚合不会在距离计算中过多地改变最终结果。

以下玩具示例有效。

library(gdistance)

r <- raster(nrows=6, ncols=7, xmn=0, xmx=7, ymn=0, ymx=6, crs="+proj=utm +units=m")

r[] <- c(2, 2, 1, 1, 5, 5, 5,
         2, 2, 8, 8, 5, 2, 1,
         7, 1, 1, 8, 2, 2, 2,
         8, 7, 8, 8, 8, 8, 5,
         8, 8, 1, 1, 5, 3, 9,
         8, 1, 1, 2, 5, 3, 9)

Tr <- transition(r, function(x) 1/mean(x), 8)

TrProd <- Tr * Tr

或者

s <- stack(Tr, Tr)
p <- prod(s)

答案 1 :(得分:0)

我通过使用算术函数而不是prod()函数解决了这个问题。而不是

s <- stack(Tr, Tr)
p <- prod(s)

我用过

tr_accumulated<-tr_DEM*tr_LU

算术函数也有点响应:对于其他所有函数(如+, - ,/),它都会引发错误“操作太大”。只有*函数似乎有效,所以我事先反转了tr_LU的值,最后得到了我想要的结果。

显然,通过这种设置,我在R功能/系统资源的限制下工作,我仍然不理解prod()函数的行为。使用工作代码需要~1分钟,prod()函数超过30小时。不应该prod() - 函数在某一点完成或中断并抛出错误信息?