← 全部项目

青岛公交线路与换乘网络

如何从公开地图API还原城市公交网络,并识别换乘结构与关键节点?

跟着图解看项目怎么完成从数据到结果,逐步查看处理过程
2026 · 青岛公交网络

项目介绍

高德地图 API 提供公交线路、站点、坐标和轨迹。我把线路、站点与轨迹分别整理后,用地图查看空间分布,计算线路长度、站距与绕行程度,再按共同站名建立线路之间的连接。项目采集得到 874 条有效线路和 5,616 个唯一站点;网络分析进一步说明哪些线路可以直接换乘,以及线路之间的可达关系。

874有效公交线路
5,616唯一站点
31万线路轨迹点
25,929换乘网络边
PythonAmap APIPandasNetworkXFoliumPlotlyHTML

项目过程

先采集并整理线路、站点与轨迹,再制作地图、计算线路基本特征,最后按共同站名建立换乘网络。以下按答辩展示与项目报告的内容展开。

1先发现线路,再获取线路详情

  1. 用数字和专线关键词模糊搜索线路
  2. 收集返回的线路 ID,并去重
  3. 按 ID 查询站点、距离与轨迹
  4. 根据首站位置过滤范围,得到 874 条有效线路

候选线路编号及其线路详情,作为后续清洗的原始输入。

工具与方法:Python · Requests · 高德公交接口 · 线路 ID 去重

查看处理方法与依据收起处理方法与依据
  1. 用数字和专线关键词模糊搜索线路
  2. 收集返回的线路 ID,并去重
  3. 按 ID 查询站点、距离与轨迹
  4. 根据首站位置过滤范围,得到 874 条有效线路
采集步骤怎样执行为什么这样做
模糊搜索搜索“6”可以匹配 6 路、16 路、66 路等多条线路;另搜索隧道、黄岛等名称一次请求取得多个候选 ID
收集 ID答辩记录共收集 1,779 个唯一线路 ID同一线路被多个关键词命中后,只保留一个候选 ID
查询详情根据线路 ID 获取名称、起终点、距离、站序、站点坐标和 polyline 轨迹后续地图与换乘分析需要完整线路信息
范围过滤按首站坐标限定采集范围,排除范围外的线路保留此次核心城区及周边的研究范围

报告记录,常规关键词查询每日只有 100 次额度,因此采用模糊匹配,并通过 JS 平台 Key 收集线路 ID,再使用线路 ID 查询取得详情。约 1,000 个关键词是采集策略的一部分,并非一次请求能查询全部关键词。

我负责提供高德 API 并确定所需数据,AI 协助编写 Python 请求和解析代码。Requests 发送请求,JSON 解析返回内容,Pandas 将结果保存成表格。

2按间隔采集,每 50 个线路 ID 保存结果

  1. 关键词查询逐个执行,每次完成后等待 0.3 秒
  2. 按排序后的线路 ID 逐个请求详情
  3. 每处理 50 个 ID,保存当前累计线路与站点
  4. 每个 ID 处理后等待 0.03 秒,结束时再保存最终结果

阶段保存与最终保存的线路、站点 Excel 文件。

工具与方法:Requests · 顺序请求 · 固定等待间隔 · 每 50 个 ID 保存

查看处理方法与依据收起处理方法与依据
  1. 关键词查询逐个执行,每次完成后等待 0.3 秒
  2. 按排序后的线路 ID 逐个请求详情
  3. 每处理 50 个 ID,保存当前累计线路与站点
  4. 每个 ID 处理后等待 0.03 秒,结束时再保存最终结果
具体设置代码怎样执行对应含义
关键词请求间隔每次查询结束后 sleep 0.3 秒开始下一次请求前,还需计入上次请求本身的耗时
关键词进度首次和每完成 20 个关键词打印进度这是进度提示,不是每批发送 20 个请求
详情请求间隔每个线路 ID 处理结束后 sleep 0.03 秒脚本逐个处理,没有并发批量请求
阶段保存每处理 50 个 ID,把累计结果写入两份 Excel保存时线路按 ID 去重,站点按 ID+站序号去重
请求失败详情先使用第一组凭据;未成功时尝试第二组,两次都未成功则跳过没有无限重试或指数增加等待时间的机制
重新运行读取旧文件中的 ID 加入候选集合,之后仍请求全部候选的详情已保存文件可供后续清洗使用,采集脚本没有跳过已完成详情的逻辑

采集分为“搜索 ID”和“查询详情”两个步骤,分别控制请求节奏。0.3 秒和 0.03 秒是每次处理完成后的等待时间,还需要加上请求本身耗时。

线路和站点分别保存为 Excel;每 50 个 ID 保存的是当前累计结果。已有文件可以直接交给后续清洗使用,重新启动采集脚本时仍会请求候选 ID 的详情。

3分别整理线路、站点和轨迹

  1. 检查线路名称、距离和站点坐标
  2. 删除无效记录,并按规则去重
  3. 将轨迹字符串拆成有顺序的经纬度点
  4. 得到线路表、站点表与轨迹表

清理后的线路、站点和轨迹数据,供地图与网络计算分别使用。

工具与方法:Pandas · 缺失与重复检查 · 轨迹字符串解析

查看处理方法与依据收起处理方法与依据
  1. 检查线路名称、距离和站点坐标
  2. 删除无效记录,并按规则去重
  3. 将轨迹字符串拆成有顺序的经纬度点
  4. 得到线路表、站点表与轨迹表
处理对象实际规则保存结果或用途
线路表去除线路名或距离缺失、距离不大于 0 的记录,按线路名去重874 条有效线路
站点表去除站名缺失、经纬度缺失或为 0 的记录,保留所在线路和站序22,198 条站点行程记录;材料汇总 5,616 个唯一站点
轨迹表按分号拆出坐标点,再按逗号拆出经纬度,保留线路与点序号310,411 个轨迹坐标点
坐标处理高德 v3 返回十进制度,直接使用数值;地图采用相同的 GCJ-02 坐标系不额外除以 60,也不在两种坐标系之间转换

站点行程记录表示某条线路经过某一站。同一个站被多条线路经过,会在站点表中出现多次,所以站点记录数与唯一站点数不同。

GCJ-02 是高德采用的地图坐标系。数据与底图使用同一套坐标,可以直接叠加;这和经纬度是否需要换算成十进制度是两个不同问题。

4用地图和综合页面分别展示空间与网络结果

  1. 读取清洗后的站点与线路轨迹
  2. 在高德底图上展示站点、线路和路网
  3. Plotly 按需显示线路,Folium 增强地图交互
  4. 通过搜索、图层切换和高亮查看具体线路

交互地图、综合分析页面、答辩展示与项目报告。

工具与方法:Plotly · Folium · HTML · 地图图层与分析图表

查看处理方法与依据收起处理方法与依据
  1. 读取清洗后的站点与线路轨迹
  2. 在高德底图上展示站点、线路和路网
  3. Plotly 按需显示线路,Folium 增强地图交互
  4. 通过搜索、图层切换和高亮查看具体线路
展示功能Plotly 版本Folium 版本
显示规模默认显示 20 条,可切换为 50、100、200 或全部线路使用 Canvas 绘制线路,配合独立图层控制
查看站点以点展示站点分布,支持名称搜索缩小时将密集站点聚合为带数量的标记,放大后展开
查看线路不同线路使用不同颜色,悬停查看名称悬停显示线路名与方向,点击后定位并高亮 4 秒
切换视图站点、线路、路网三个视图站点、线路、路网图层分别管理
底图与坐标使用高德底图,与采集数据的坐标系一致同样使用高德底图,无需额外坐标系转换

两种地图处理的是同一批整理后的资料。Plotly 通过限制首次显示的线路数量减少同时绘制的内容;Folium 通过站点聚合、独立图层与线路高亮,方便查看密集区域和具体路线。

地图用于观察线路走向、站点分布和跨区域连接。具体线路之间是否存在共同站点,由后面的网络建模单独计算。

5计算线路长度、站距与绕行程度

  1. 读取 874 条线路的长度、站点数和起终点坐标
  2. 分别计算长度、站数、站距与绕行程度
  3. 生成统计图和结果表
  4. 描述这批线路的基本特征

线路基本特征统计、分布图和结果表。

工具与方法:Pandas · Haversine 距离公式 · Matplotlib

查看处理方法与依据收起处理方法与依据
  1. 读取 874 条线路的长度、站点数和起终点坐标
  2. 分别计算长度、站数、站距与绕行程度
  3. 生成统计图和结果表
  4. 描述这批线路的基本特征
指标怎样计算报告结果
平均线路长度对每条线路的全程距离求平均19.61 km;中位数 15.93 km
平均站点数各线路站点数求和,再除以线路数25.4 站/线;中位数 24 站
平均站距总里程(米)÷各线路相邻站点区间总数17,136,460 ÷(22,198 − 874),约 803.6 米
非直线系数线路实际长度÷起终点直线距离;直线距离根据经纬度计算中位数 1.61

平均站距为什么要减去线路数?一条有 5 个站点的线路,只有 4 段相邻站点区间。对所有线路加总,区间数就是站点行程总数减线路数,再用总里程除以区间数。

非直线系数表示实际路线相对起终点直线距离长多少。例如某条线路该系数为 1.61,表示实际长度为起终点直线距离的 1.61 倍;报告中的 1.61 是各线路的中位数。

Pandas 计算统计量,Haversine 公式根据经纬度求球面直线距离,Matplotlib 绘制分布图和散点图。结合地图,可以继续观察线路长度、站点数和走向之间的关系。

6按共同站点建立线路之间的连接

  1. 每条线路对应一个节点,整理它经过的站名集合
  2. 逐对比较线路,共比较 381,501 对
  3. 至少有一个共同站名 → 建立一条无向连接
  4. 保存 874 个节点与 25,929 条连接

线路节点、可换乘连接及共同站名数量,供后续网络指标计算。

工具与方法:NetworkX · 站名集合比较 · 无向网络

查看处理方法与依据收起处理方法与依据
  1. 每条线路对应一个节点,整理它经过的站名集合
  2. 逐对比较线路,共比较 381,501 对
  3. 至少有一个共同站名 → 建立一条无向连接
  4. 保存 874 个节点与 25,929 条连接
网络里的对象在公交数据中表示什么
线路节点按清洗后站点表中的线路名分组,每组建立一个节点
站名集合每条线路先去掉空站名,再对站名去重
两两比较只比较不同线路,每对比较一次;共同站名至少 1 个就连接
连接数量属性共同站名个数保存为 weight;如共同经过乙、丙两站,则为 2
输出文件保存 GEXF 网络文件、按共同站名数排序的连接表、按直接相连线路数排序的节点表

例如 A 线经过甲、乙、丙站,B 线经过乙、丁站,两条线路有共同站名“乙”,程序就建立连接。若有两个共同站名,连接上记录的数量就是 2。

874 条线路每对只比较一次,共 874×873÷2=381,501 对。连接数占所有可能线路对的比例约为 6.8%,即网络密度约 0.068。

NetworkX 生成无向网络,导出 GEXF 文件、连接表和各线路直接相连数量表。匹配依据为相同站名,实际换乘还需考虑站点位置与步行条件。

7计算连接数量、可达关系与路径长度

  1. 统计每条线路直接相连的线路数量
  2. 找出彼此能够到达的线路集合
  3. 在最大连通部分计算最短路径
  4. 结合聚类系数描述局部连接与整体可达关系

网络规模、连接较多的线路、可达范围和路径指标。

工具与方法:NetworkX · 邻接线路统计 · 连通性检查 · 最短路径 · 聚类系数

查看处理方法与依据收起处理方法与依据
  1. 统计每条线路直接相连的线路数量
  2. 找出彼此能够到达的线路集合
  3. 在最大连通部分计算最短路径
  4. 结合聚类系数描述局部连接与整体可达关系
指标含义本次结果或计算范围
直接连接数量一条线路与多少条其他线路具有共同站名平均 59.3;材料记录地铁 1 号线最多,为 176
最大连通部分通过一次或多次连接可以相互到达的最大线路集合861 个节点,占 98.5%
平均最短路径在最大连通部分,计算各线路之间最少连接步数并求平均2.57 步
网络直径同一计算范围内,最短路径中最长的一条6 步
聚类系数观察一条线路的相邻线路之间是否也经常连接,再对全图求平均0.553

这些数字分别回答“直接连接多不多”“大部分线路能否互达”“需要经过多少条连接”。平均路径 2.57 的范围是最大连通部分,不直接表示任意两个地理位置的实际换乘次数。

采集材料包含地铁 1 号线等轨道线路,因此这里的网络按采集到的公共交通线路理解。最终将指标、连接较多的线路和统计图整理到综合页面、答辩展示及项目报告中。

图片与材料

分析结果

  1. 01

    采集数据包含 874 条有效线路、5,616 个唯一站点;换乘网络以线路为节点,按共同站名建立连接,记录了 25,929 条线路间连接。

  2. 02

    原项目记录的平均路径长度约为 2.57。这个指标对应线路节点之间的连接步数,代码在网络不完全连通时使用最大连通部分计算。

  3. 03

    交互地图、综合分析和答辩展示分别保留空间位置、网络指标与过程说明,相关代码和数据脚本可以继续核对。

分析中的判断与处理

地图用于查看站点与线路的位置,NetworkX 用于计算线路之间的连接与路径。单条线路、全市分布、换乘网络和综合指标分别展示,读者可以根据问题选择页面。班次、拥堵和步行时间需要额外数据支持,现有分析聚焦线路连接结构。

我与 AI 如何完成项目

Claude Code + DeepSeek Pro

个人完成。本人负责采集范围、网络构建口径、结果验证和展示结构;AI协助代码实现。

我怎样把课程实例变成完整项目

我先提供课程实例、目标城市和需要复现的分析结果,再与Claude Code和DeepSeek Pro讨论数据来源、采集范围、缓存方式、网络定义和展示页面。项目随后拆成API采集、数据整理、网络构建、指标计算和可视化。

AI负责哪些实现工作

我负责给ai提供高德api,ai负责请求、缓存、失败重试、数据清理、NetworkX网络构建、Folium地图和HTML展示代码,并参与技术路线与结果解释。

我怎样检查网络是否建立正确

我检查线路数、唯一站点数、线路轨迹和网络边数量,并分别查看单条线路地图、全市分布和换乘网络。地图用于检查空间位置,NetworkX用于计算线路连接与路径,两类结果分别保留。

参考与使用说明

结果适用范围
  • 结果受API返回范围、采集时间和线路变更影响,不等于实时公交调度系统。
  • 公开仓库不包含高德API密钥,使用者需通过环境变量自行配置。
  • 网络连通不等于实际出行体验,仍缺少班次、拥堵和步行时间。

查看项目动画图解 ↗

下一个项目上市公司研发投入与专利数据整合
项目截图打开原文件 ↗
100%滚轮缩放 · 拖动查看