本实验用于展示如何使用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)
hrbs$link <- lapply(hrbs$path,extract_link) head(hrbs$link)
alllink <- all_link(hlj_roadnet) head(alllink,20)
使用多核计算
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))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.