我有一个带有大约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
答案 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() - 函数在某一点完成或中断并抛出错误信息?