在R语言中计算并可视化网络路径的行驶距离
在R语言中计算并可视化网络路径的行驶距离
嗨,看起来你已经完成了最关键的步骤——构建路网并找到最短路径的节点序列啦!接下来咱们一步步搞定路径距离计算和可视化,很简单的~
一、计算最短路径的行驶距离
首先,咱们得先给路网的每条边加上实际地理长度属性,因为默认的sfnetwork不会自动带这个。然后提取出最短路径对应的边,把它们的长度加起来就是总距离了:
# 1. 给网络的边添加长度属性(单位和你的CRS一致,这里是米) net <- net %>% activate("edges") %>% mutate(length = st_length(geometry)) # 2. 从最短路径结果中提取节点序列 path_nodes <- sps$vpath[[1]] # 3. 提取这条路径对应的所有边 path_edges <- net %>% activate("edges") %>% slice(as.integer(E(net, path = path_nodes))) # 4. 计算总行驶距离(把米转换成公里的话除以1000) total_distance <- sum(path_edges$length) # 如果要转公里:total_distance_km <- total_distance / 1000 cat("总行驶距离:", total_distance, "米\n")
这里解释下:我们先激活edges(边),用st_length()计算每条边的实际地理长度;然后用E(net, path = path_nodes)获取路径对应的边,最后求和就能得到总距离。你的CRS是NAD83/Statistics Canada Lambert,单位是米,直接求和就是米数,转公里除以1000就行。
二、可视化地理路径
接下来把路径在地图上画出来,咱们用ggplot2来做会更直观,先加载包:
library(ggplot2) # 1. 把所有需要绘图的对象转换成sf格式 original_roads <- st_as_sf(a) path_sf <- st_as_sf(path_edges) pt_sf <- st_sf(type = c("起点", "终点"), geometry = c(pt1, pt2)) # 2. 绘制分层地图 ggplot() + # 绘制原始路网(浅灰色细线,作为背景) geom_sf(data = original_roads, color = "lightgray", size = 0.1) + # 绘制最短路径(红色粗线,突出显示) geom_sf(data = path_sf, color = "red", size = 1) + # 绘制起点和终点(不同颜色的点) geom_sf(data = pt_sf, aes(color = type), size = 3) + # 设置颜色和标题 scale_color_manual(values = c("起点" = "blue", "终点" = "green")) + labs(title = "CN Tower到Toronto Pearson机场的最短行驶路径", color = "点位类型") + theme_minimal()
如果不想用ggplot2,也可以用sf的基础绘图功能:
# 先画背景路网 plot(st_geometry(original_roads), col = "lightgray", lwd = 0.1) # 添加路径 plot(st_geometry(path_sf), col = "red", lwd = 2, add = TRUE) # 添加起点终点 plot(st_geometry(pt_sf), col = c("blue", "green"), pch = 16, cex = 2, add = TRUE) # 添加图例 legend("topright", legend = c("起点", "终点", "路径", "路网"), col = c("blue", "green", "red", "lightgray"), pch = c(16,16,NA,NA), lwd = c(NA,NA,2,0.1))
这样就能清晰看到你的最短路径在地图上的位置啦!
备注:内容来源于stack exchange,提问作者stats_noob




