gdistance中

时间:2017-12-10 14:10:31

标签: r gis

以下代码是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手册中的上述代码运行了两个版本的转换函数,并获得了这两个非常不同的图: enter image description here enter image description here

使用costDistance(T, c1, c2)我的第一个距离为21.1,第二个距离为13.6。

显然,这些是非常不同的结果。所以,我的问题是,从成本矩阵/图层/栅格创建TransitionLayer对象的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

这确实是一个重要的区别。有关详细信息,请查看有关调和平均值的维基百科文章。

在示例中,输入栅格中的值是成本。因此,正确的方法是首先采用成本的算术平均值,然后采用它的倒数来得到电导。旅行者体验原始单元的一半成本和目标单元成本的一半(成本1 +成本2)/ 2.

因此1 / mean(x)对于这种情况是正确的。

如果输入栅格具有电导值,则另一个函数是正确的:mean(1 / x)。