本实验用于展示如何使用HVS包来实现“虚拟收费站”的单日流量计算功能。

首先载入HVS包和其他包(magrittr用于便捷的管道计算,knitr用于格式化输出)

library(HVS)
library(magrittr)
library(knitr)

第一步:载入基础数据

load("D:/R/packages/HVS/data-raw/hlj_roadnet.RData")
load("D:/R/packages/HVS/data-raw/hrbs.RData")
load("D:/R/packages/HVS/data-raw/indextable.RData")

路网邻接权重矩阵

hlj_roadnet[1:10,1:10]

哈尔滨收费数据

head(hrbs,10)

编号序号对应表

head(indextable,20)

第二步:路径匹配

计算任意两点间路径

dijkstra_matrix函数,输入:邻接权重矩阵;

输出:

result <- dijkstra_matrix(weight_mat = hlj_roadnet)
mileage <- result[[1]]
path <- result[[2]]
mileage[1:10,1:10]
path[[1]][[99]]
path[[2]][[66]]

编码转序号

将收费数据的ENSTATIONINDEX列输入indextoseq函数得到对应序号,记为ENSEQ;出口同理。

hrbs$ENSEQ <- indextoseq(hrbs$ENSTATIONINDEX)
hrbs$EXSEQ <- indextoseq(hrbs$EXSTATIONINDEX)

去掉序号为0的,即编码找不到的(收费数据中有一些收费站编码在路网中暂无对应信息)

hrbs <- hrbs[hrbs$ENSEQ != 0 & hrbs$EXSEQ != 0,]
dim(hrbs)

路径匹配

将每一条收费数据的OD匹配出路径。

hrbs$path <- mapply(function(O,D) path[[O]][[D]],hrbs$ENSEQ,hrbs$EXSEQ)
head(hrbs$path)

第三步:交通流计算

拆分link

hrbs$link <- lapply(hrbs$path,extract_link)
head(hrbs$link)

得到所有link

alllink <- all_link(hlj_roadnet)
head(alllink,20)

计算所有link单日交通量

使用多核计算

library(parallel)
cores <- detectCores()
cluster <- makePSOCKcluster(cores)
l <- parLapply(cluster,alllink,caculate_natureflow,hrbs$link)
names(l) <- alllink
system.time(parLapply(cluster,alllink,caculate_natureflow,hrbs$link))

使结果输出

d <- data.frame(traffic_volumn = simplify2array(l))
d$seqlink <- rownames(d)
d$indexlink <- seqlinktoindexlink(rownames(d))
rownames(d) <- 1:nrow(d)
d <- d[,c(3,2,1)]
kable(head(d,40))


ahorawzy/HVS documentation built on May 29, 2019, 1:52 a.m.