用距离模拟地表水流的R-转移函数
我正在尝试使用用距离模拟地表水流的R-转移函数,r,geospatial,spatial,r-raster,sp,R,Geospatial,Spatial,R Raster,Sp,我正在尝试使用gdistanceshortestPath功能模拟从指定原点到单个下坡目标点的陆上(地表)水流。我需要帮助定义相应的转换函数,因为我需要确保成本最低的路径只允许水沿着路径流向与前一个单元值相等或更小的高程单元。下例中的transitionFunction选择了最小高程单元,但基于我定义的transitionFunction,该值可能仍然大于上一个单元值 我意识到,当上述定义符合我的要求时,路径可能在到达目标点之前终止。这很好,尽管我希望尽可能保留从原点到终止点的路径 此外,如果有人
gdistance
shortestPath
功能模拟从指定原点到单个下坡目标点的陆上(地表)水流。我需要帮助定义相应的转换函数
,因为我需要确保成本最低的路径只允许水沿着路径流向与前一个单元值相等或更小的高程单元。下例中的transitionFunction
选择了最小高程单元,但基于我定义的transitionFunction
,该值可能仍然大于上一个单元值
我意识到,当上述定义符合我的要求时,路径可能在到达目标点之前终止。这很好,尽管我希望尽可能保留从原点到终止点的路径
此外,如果有人知道一个不同的R包能够模拟这种事情,请让我知道
library(gdistance)
library(raster)
library(elevatr)
library(sp)
#load example DEM raster
data(lake)
elevation <- get_elev_raster(lake, z = 9)
#remove negative elevation values from raster
elevation[elevation < 0] <- NA
#create origin and goal points with same projection as elevation raster
origin <- SpatialPoints(cbind(1790000, 640000), proj4string = CRS("+proj=aea +lat_1=20 +lat_2=60 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0"))
goal <- SpatialPoints(cbind(1820000, 540000), proj4string = CRS("+proj=aea +lat_1=20 +lat_2=60 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0"))
#create df data and convert to SpatialPointsDataFrame
odf <- data.frame("flowreg" = 1)
gdf <- data.frame("flowreg" = 2)
origindf <- SpatialPointsDataFrame(origin, odf)
goaldf <- SpatialPointsDataFrame(goal, gdf)
trCost1 <- transition(elevation, transitionFunction=function(x) 1/min(x), directions=8)
trCost1gc <- geoCorrection(trCost1, type="c")
plot(raster(trCost1))
sPath1 <- shortestPath(trCost1, origin, goal,
output="SpatialLines")
plot(elevation)
plot(origindf, add = TRUE, col='red', cex = 5)
plot(goaldf, add = TRUE, col='green', cex = 5)
lines(sPath1)
库(gdistance)
图书馆(光栅)
图书馆
图书馆(sp)
#加载示例DEM光栅
数据(湖泊)
高程我找到了草地GIS(在R中使用rgrass7
访问)R.排水功能或raster::flowPath
实现了我在上述问题中尝试的操作。您当前的代码是否没有保留从原点到其终止位置的路径?从你的数字我看不出来。当前代码保留了路径,是的。问题在于,transitionFunction允许路径“上坡”(即流向比中心单元更高的高程单元)。我想让这条路像地表水一样顺流而下。如果你有任何想法,请告诉我。