以下代码是gdistance的pdf手册中转换函数的示例:
library(raster)
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)
T <- transition(r, function(x) 1/mean(x), 8)
# 1/mean: reciprocal to get permeability
T <- geoCorrection(T)
c1 <- c(5.5,1.5)
c2 <- c(1.5,5.5)
#make a SpatialLines object for visualization
sPath1 <- shortestPath(T, c1, c2, output="SpatialLines")
plot(r)
lines(sPath1)
#make a TransitionLayer for further calculations
sPath2 <- shortestPath(T, c1, c2)
plot(raster(sPath2))
我特别感兴趣的是:
T <- transition(r, function(x) 1/mean(x), 8)
因为我遇到了许多人做以下事情的例子:
T <- transition(1/r, mean, 8)
据我所知,这是1/mean(x)
和mean(1/x)
之间的区别,它们并不相同。
为了验证这一点,我使用gdistance手册中的上述代码运行了两个版本的转换函数,并获得了这两个非常不同的图:
使用costDistance(T, c1, c2)
我的第一个距离为21.1,第二个距离为13.6。
显然,这些是非常不同的结果。所以,我的问题是,从成本矩阵/图层/栅格创建TransitionLayer对象的正确方法是什么?
答案 0 :(得分:0)
这确实是一个重要的区别。有关详细信息,请查看有关调和平均值的维基百科文章。
在示例中,输入栅格中的值是成本。因此,正确的方法是首先采用成本的算术平均值,然后采用它的倒数来得到电导。旅行者体验原始单元的一半成本和目标单元成本的一半(成本1 +成本2)/ 2.
因此1 / mean(x)对于这种情况是正确的。
如果输入栅格具有电导值,则另一个函数是正确的:mean(1 / x)。