Python应用指南:地铁两站之间最短路径查询

随着城市交通的发展,地铁已成为许多城市居民日常出行的重要方式之一。地铁网络的复杂性和站点数量的增加使得乘客在选择最佳路线时面临挑战。为了帮助乘客快速、准确地找到从起始站到目的站的最短乘坐线路,本篇文章我们来求一下地铁两站之间最短路径查询的查询,通过Python脚本快速找到从起始站到目的站的最短乘坐线路,结合pandas、networkx和matplotlib等库,实现了地铁网络的数据读取、图结构的构建、最短路径算法的应用以及结果的可视化展示,本篇文章依然以厦门市地铁为例。

首先,我们先获取厦门市所有地铁站点的坐标数据,数据获取方法可以参考:

利用高德API获取整个城市的公交路线并可视化(六)_通过简单的地图api(如google maps或openstreetmap),计算景点之间的交通时间-CSDN博客

这里就不再赘述,直接来到脚本计算部分,先讲一下方法思路,一共四个步骤;

方法思路

  1. 从CSV文件中读取厦门地铁站点和线路数据
  2. 使用networkx库构建地铁网络的图结构,每个站点作为一个节点,每条线路作为连接节点的边
  3. 利用networkx库提供的最短路径算法(如Dijkstra算法),计算从起始站到目的站的最短乘坐线路
  4. 使用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 是否连通。如果图是连通的,那么图中的任意两个顶点都至少存在一条路径相连接。  对于无向图来说,这意味着图中不存在孤立的子图或部分。换句话说,如果你能从任何一点出发到达其他所有的点,那么这个图就是连通的;

可视化地铁网络图,并高亮两个站间最短路径;

发散一下换成公交线路路也同样可行,只是需要增加一个公交线路字段,来界定换乘线路;

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

### 地铁场景下的可视化大屏设计与实现 #### 设计思路 在地铁场景中,数据可视化大屏主要用于实时监控、运营管理和公众信息服务。为了有效传达信息并提高用户体验,这类大屏应具备高效的信息传递能力以及良好的视觉效果[^1]。 对于面向乘客的大屏而言,其重点在于提供清晰易懂的服务资讯,如列车时刻表、线路图等;而针对内部管理使用的屏幕,则更强调功能性和实用性,需支持多种数据分析图表来辅助决策制定过程。因此,在设计时要根据不同用途调整布局结构和交互方式[^2]。 #### 技术实现 技术层面上,构建一个稳定可靠的数据传输通道至关重要。考虑到地铁环境可能存在网络波动的情况,建议采用本地缓存机制配合云端同步更新策略,确保即使在网络不佳的情况下也能正常显示重要通知或紧急消息[^4]。 此外,由于地铁站内空间有限且光线复杂多变,选用高亮、宽视角的专业显示屏可以提升观看体验。同时利用边缘计算节点处理部分前端渲染任务,减轻服务器负担的同时加快响应速[^3]。 #### 应用案例分析 某一线城市轨道交通集团曾成功部署了一套完整的智慧车站解决方案,其中包括多个大型LED拼接墙组成的综合指挥中心大屏系统。该方案不仅实现了对全线网客流分布状况的动态监测预警,还集成了视频安防、设备运维等多个子系统的集成展示平台,极大提高了运营管理效率和服务质量水平。 ```python # Python伪代码示例:模拟获取地铁客流量统计数据并通过API发送至大屏端口 import requests def get_passenger_flow(station_id): url = f"https://api.metro.com/stations/{station_id}/flow" response = requests.get(url) if response.status_code == 200: data = response.json() send_to_dashboard(data) def send_to_dashboard(flow_data): dashboard_url = "http://localhost:8080/updateFlowData" headers = {'Content-Type': 'application/json'} result = requests.post(dashboard_url, json=flow_data, headers=headers) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图说交通

买猫粮,楼下的流浪猫在等我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值