You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在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

火山引擎 最新活动