具有多个点的最低成本路径

时间:2012-03-07 16:54:04

标签: r gis

我正在尝试将双变量位置点连接在一起以形成路线。我的观点指的是鱼的位置,所以我需要的路径只能通过水,而不是周围的土地。基本上,我需要进行多个最低成本路径分析并完全加入它们。我想在R中这样做,因为我在那里有比在ArcGIS,python,modelbuilder等方面更多的经验。

我已经使用ArcGIS创建了一个成本曲面,水的编码为0,土地编码为“NoData”,并将其导入R.

我尝试过使用gdistance pkg中的shortestPath,但是当我尝试在两点之间运行它时,R总是会关闭我。例如:

costpath=shortestPath(costtrans,c29924[1,],c29924[2,],output="SpatialLines")

其中我的成本表面是“costtrans”,而“c29924”是具有我的纬度/经度位置的SpatialPointsDataFrame。我曾计划运行一个循环,以便我可以为数据框中的每一行执行此操作。但是,我不知道为什么R不能很好地处理一次迭代。在将我的成本表面转换为第一个争论的过渡对象时,我收到以下警告消息:

Warning messages:
1: In array(ans, c(len.a%/%d2, d.ans), if (!all(vapply(dn.ans, is.null,  :
Reached total allocation of 6057Mb: see help(memory.size)
2: In array(ans, c(len.a%/%d2, d.ans), if (!all(vapply(dn.ans, is.null,  :
Reached total allocation of 6057Mb: see help(memory.size)
3: In as.vector(transition.values) :
Reached total allocation of 6057Mb: see help(memory.size)
4: In as.vector(transition.values) :
Reached total allocation of 6057Mb: see help(memory.size)
5: In .TM.repl.i.mat(as(x, "TsparseMatrix"), i = i, value = value) :
number of items to replace is not a multiple of replacement length

非常感谢任何解决此问题的建议,或其他我初步目标的方法!

2 个答案:

答案 0 :(得分:5)

可以使用gdistance包执行您想要的操作。这可能是栅格大小的问题(即它对于内存而言太大),在这种情况下,您可以使用aggregate()包中的raster对其进行升级。如另一条评论中所述,这也可能是您对陆地和海洋参数化的问题。

以下是我认为你想要实现的一个例子(下图)。我已经将土地参数化为高成本障碍(= 10000个成本单位),而海洋则没有障碍(= 1个成本单位)。另请注意,我采用反转来产生电导表面。如果您想要位置之间的路径长度,可以使用costDistance()来完成,这将以栅格为单位将结果作为地理路径长度。

library(gdistance)

## Create cost surface where "land" exists in the middle
cost <- raster(nrow=100, ncol=100, 
           xmn=0, xmx=100, ymn=0, ymx=100, crs="+proj=utm")
cost[] <- 1
cost[cellFromRowColCombine(cost, 50:55,20:80)] <- 10000

## Produce transition matrices, and correct because 8 directions
trCost <- transition(1/cost, mean, directions=8)
trCost <- geoCorrection(trCost, type="c")

## Create three points (representing three points in time series)
pts <- cbind(x=c(20, 60, 40), y=c(80, 60, 20))

## Display results
plot(cost)
plot(SpatialPoints(pts), add=TRUE, pch=20, col="red")
text(pts[,1]+2, pts[,2]+2, 1:nrow(pts))
plot(shortestPath(trCost, pts[1,], pts[2,], output="SpatialLines"), add=TRUE)
plot(shortestPath(trCost, pts[2,], pts[3,], output="SpatialLines"), add=TRUE)

Example plot of least-cost paths around land

答案 1 :(得分:0)

您可以使用minimum spanning tree,其中每条边的成本是距离和其他因素的函数。在您的情况下,如果边缘与非水相交,请将权重设置为无穷大,确保它永远不会被使用,除非最后需要连接图形。如果图形未连接,则可以在每个断开连接的点组上运行两个或更多最小生成树。有关易于实现的算法,请参阅维基百科,尤其是Prim's算法。