随着城市交通的发展,地铁已成为许多城市居民日常出行的重要方式之一。地铁网络的复杂性和站点数量的增加使得乘客在选择最佳路线时面临挑战。为了帮助乘客快速、准确地找到从起始站到目的站的最短乘坐线路,本篇文章我们来求一下地铁两站之间最短路径查询的查询,通过Python脚本快速找到从起始站到目的站的最短乘坐线路,结合pandas、networkx和matplotlib等库,实现了地铁网络的数据读取、图结构的构建、最短路径算法的应用以及结果的可视化展示,本篇文章依然以厦门市地铁为例。
首先,我们先获取厦门市所有地铁站点的坐标数据,数据获取方法可以参考:
利用高德API获取整个城市的公交路线并可视化(六)_通过简单的地图api(如google maps或openstreetmap),计算景点之间的交通时间-CSDN博客
这里就不再赘述,直接来到脚本计算部分,先讲一下方法思路,一共四个步骤;
方法思路
- 从CSV文件中读取厦门地铁站点和线路数据
- 使用networkx库构建地铁网络的图结构,每个站点作为一个节点,每条线路作为连接节点的边
- 利用networkx库提供的最短路径算法(如Dijkstra算法),计算从起始站到目的站的最短乘坐线路
- 使用matplotlib库绘制地铁网络图,高亮显示最短路径
这里的是文件路径改成自己的就好,另外起终点也改成需要查询站点的即可;
# 设置起点和终点
source_station = '海沧湾公园'
target_station = '蔡厝'
完整代码#运行环境Python 3.11
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
# 设置matplotlib字体,使其支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 指定CSV文件的路径
file_path = 'E://Data//厦门地铁.csv'
# 使用pandas读取CSV文件
df = pd.read_csv(file_path, encoding='gbk')
# 创建一个空的无向图
G = nx.Graph()
# 遍历DataFrame中的每一行
for index, row in df.iterrows():
# 添加节点(站点)及其经纬度坐标作为属性
G.add_node(row['站名'], pos=(row['经度'], row['纬度']))
# 检查当前行与前一行是否属于同一线路
if index > 0 and row['线路名'] == df.iloc[index - 1]['线路名']:
# 如果是,则添加边(连接两个相邻站点)
G.add_edge(df.iloc[index - 1]['站名'], row['站名'])
# 设置起点和终点
source_station = '海沧湾公园'
target_station = '蔡厝'
# 尝试计算两点之间的最短路径
try:
shortest_path = nx.shortest_path(G, source=source_station, target=target_station)
except nx.NetworkXNoPath:
# 如果找不到路径,打印提示信息
print("没有从起始站到目标站的路径")
else:
# 找到了路径,打印路径信息
print(f"最短路径: {shortest_path}")
# 绘制整个图
plt.figure(figsize=(12, 8))
nx.draw(G, pos=nx.get_node_attributes(G, 'pos'), with_labels=True, node_size=600, font_size=10, font_weight='bold',
node_color='lightblue')
# 如果找到了最短路径,高亮显示这条路径
if shortest_path:
path_edges = list(zip(shortest_path, shortest_path[1:]))
nx.draw_networkx_edges(G, pos=nx.get_node_attributes(G, 'pos'), edgelist=path_edges, edge_color='r',
width=2)
# 高亮显示最短路径上的站点
nx.draw_networkx_nodes(G, pos=nx.get_node_attributes(G, 'pos'), nodelist=shortest_path,
node_size=800, node_color='yellow', alpha=0.8) # 更大的尺寸和黄色高亮
# 检查图是否连通
is_connected = nx.is_connected(G)
print(is_connected) # 输出 True 或 False,表示图是否连通
# 显示标题
plt.title('地铁网络及最短路径')
# 显示图表
plt.show()
脚本结束会打印出最短路径和可视化的高亮路径图,同时也会打印出线路的连通性,输出 True 或 False,表示图是否连通。用于检查无向图 G 是否连通。如果图是连通的,那么图中的任意两个顶点都至少存在一条路径相连接。 对于无向图来说,这意味着图中不存在孤立的子图或部分。换句话说,如果你能从任何一点出发到达其他所有的点,那么这个图就是连通的;
可视化地铁网络图,并高亮两个站间最短路径;
发散一下换成公交线路路也同样可行,只是需要增加一个公交线路字段,来界定换乘线路;
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。
标签:node,Python,路径,最短,nx,地铁,两站,path,shortest From: https://blog.csdn.net/weixin_45812624/article/details/143235574