项目介绍
高德地图 API 提供公交线路、站点、坐标和轨迹。我把线路、站点与轨迹分别整理后,用地图查看空间分布,计算线路长度、站距与绕行程度,再按共同站名建立线路之间的连接。项目采集得到 874 条有效线路和 5,616 个唯一站点;网络分析进一步说明哪些线路可以直接换乘,以及线路之间的可达关系。
项目过程
- 01
先发现线路,再获取线路详情
采集从青岛公交线路的候选编号开始。程序使用数字和专线前缀等关键词查询线路名称接口,把返回的线路编号汇总去重,再按编号请求详细信息。名称查询与详情查询分开,便于在接口配额条件下组织采集。
查看处理方法与依据收起技术细节
- 02
按间隔采集,每 50 个线路 ID 保存结果
关键词查询逐个执行,每次结束后等待 0.3 秒;线路详情处理后等待 0.03 秒。每处理 50 个线路 ID,程序将累计结果保存到 Excel,采集结束时再保存一次。
查看处理方法与依据收起技术细节
- 03
分别整理线路、站点和轨迹
Pandas 清理缺少必要信息的线路与站点,按线路名称去重,并把接口返回的轨迹字符串展开成逐点坐标。线路表、站点表和轨迹表分别保存,既能查单条线路,也能汇总全市空间分布。
查看处理方法与依据收起技术细节
- 04
用地图和综合页面分别展示空间与网络结果
地图让读者查看公交站点、线路轨迹和城市中的分布。项目保留 Plotly 综合交互地图与 Folium 增强地图,支持查看不同图层、线路信息和站点;综合分析页面集中展示网络指标与图表。
查看处理方法与依据收起技术细节
- 05
计算线路长度、站距与绕行程度
整理地图之后,继续用线路长度、站点数、平均站距和非直线系数描述这批线路。平均站距按所有线路的总里程除以相邻站点区间总数计算,非直线系数比较实际路线与起终点直线距离。
查看处理方法与依据收起技术细节
- 06
按共同站点建立线路之间的连接
NetworkX 用于保存和计算网络关系。本项目把公交线路作为节点,把每条线路经过的站点名称整理成集合,再逐对比较两条线路的站名集合。存在共同站名时,就在这两条线路之间建立一条连接。
查看处理方法与依据收起技术细节
- 07
计算连接数量、可达关系与路径长度
程序统计每条线路可以直接连接多少条其他线路,排序得到换乘连接较多的线路,再检查整个网络是否相互可达。如果网络分成多个部分,路径指标在最大的连通部分上计算,也就是其中线路可以相互到达的最大集合。
查看处理方法与依据收起技术细节
滚轮缩放 · 拖动空白处移动 · 点击节点阅读
先发现线路,再获取线路详情
采集从青岛公交线路的候选编号开始。程序使用数字和专线前缀等关键词查询线路名称接口,把返回的线路编号汇总去重,再按编号请求详细信息。名称查询与详情查询分开,便于在接口配额条件下组织采集。
查看处理方法与依据收起技术细节
先采集并整理线路、站点与轨迹,再制作地图、计算线路基本特征,最后按共同站名建立换乘网络。以下按答辩展示与项目报告的内容展开。
1先发现线路,再获取线路详情
- 用数字和专线关键词模糊搜索线路
- 收集返回的线路 ID,并去重
- 按 ID 查询站点、距离与轨迹
- 根据首站位置过滤范围,得到 874 条有效线路
候选线路编号及其线路详情,作为后续清洗的原始输入。
工具与方法:Python · Requests · 高德公交接口 · 线路 ID 去重
查看处理方法与依据收起处理方法与依据
- 用数字和专线关键词模糊搜索线路
- 收集返回的线路 ID,并去重
- 按 ID 查询站点、距离与轨迹
- 根据首站位置过滤范围,得到 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 保存结果
- 关键词查询逐个执行,每次完成后等待 0.3 秒
- 按排序后的线路 ID 逐个请求详情
- 每处理 50 个 ID,保存当前累计线路与站点
- 每个 ID 处理后等待 0.03 秒,结束时再保存最终结果
阶段保存与最终保存的线路、站点 Excel 文件。
工具与方法:Requests · 顺序请求 · 固定等待间隔 · 每 50 个 ID 保存
查看处理方法与依据收起处理方法与依据
- 关键词查询逐个执行,每次完成后等待 0.3 秒
- 按排序后的线路 ID 逐个请求详情
- 每处理 50 个 ID,保存当前累计线路与站点
- 每个 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分别整理线路、站点和轨迹
- 检查线路名称、距离和站点坐标
- 删除无效记录,并按规则去重
- 将轨迹字符串拆成有顺序的经纬度点
- 得到线路表、站点表与轨迹表
清理后的线路、站点和轨迹数据,供地图与网络计算分别使用。
工具与方法:Pandas · 缺失与重复检查 · 轨迹字符串解析
查看处理方法与依据收起处理方法与依据
- 检查线路名称、距离和站点坐标
- 删除无效记录,并按规则去重
- 将轨迹字符串拆成有顺序的经纬度点
- 得到线路表、站点表与轨迹表
| 处理对象 | 实际规则 | 保存结果或用途 |
|---|---|---|
| 线路表 | 去除线路名或距离缺失、距离不大于 0 的记录,按线路名去重 | 874 条有效线路 |
| 站点表 | 去除站名缺失、经纬度缺失或为 0 的记录,保留所在线路和站序 | 22,198 条站点行程记录;材料汇总 5,616 个唯一站点 |
| 轨迹表 | 按分号拆出坐标点,再按逗号拆出经纬度,保留线路与点序号 | 310,411 个轨迹坐标点 |
| 坐标处理 | 高德 v3 返回十进制度,直接使用数值;地图采用相同的 GCJ-02 坐标系 | 不额外除以 60,也不在两种坐标系之间转换 |
站点行程记录表示某条线路经过某一站。同一个站被多条线路经过,会在站点表中出现多次,所以站点记录数与唯一站点数不同。
GCJ-02 是高德采用的地图坐标系。数据与底图使用同一套坐标,可以直接叠加;这和经纬度是否需要换算成十进制度是两个不同问题。
4用地图和综合页面分别展示空间与网络结果
- 读取清洗后的站点与线路轨迹
- 在高德底图上展示站点、线路和路网
- Plotly 按需显示线路,Folium 增强地图交互
- 通过搜索、图层切换和高亮查看具体线路
交互地图、综合分析页面、答辩展示与项目报告。
工具与方法:Plotly · Folium · HTML · 地图图层与分析图表
查看处理方法与依据收起处理方法与依据
- 读取清洗后的站点与线路轨迹
- 在高德底图上展示站点、线路和路网
- Plotly 按需显示线路,Folium 增强地图交互
- 通过搜索、图层切换和高亮查看具体线路
| 展示功能 | Plotly 版本 | Folium 版本 |
|---|---|---|
| 显示规模 | 默认显示 20 条,可切换为 50、100、200 或全部线路 | 使用 Canvas 绘制线路,配合独立图层控制 |
| 查看站点 | 以点展示站点分布,支持名称搜索 | 缩小时将密集站点聚合为带数量的标记,放大后展开 |
| 查看线路 | 不同线路使用不同颜色,悬停查看名称 | 悬停显示线路名与方向,点击后定位并高亮 4 秒 |
| 切换视图 | 站点、线路、路网三个视图 | 站点、线路、路网图层分别管理 |
| 底图与坐标 | 使用高德底图,与采集数据的坐标系一致 | 同样使用高德底图,无需额外坐标系转换 |
两种地图处理的是同一批整理后的资料。Plotly 通过限制首次显示的线路数量减少同时绘制的内容;Folium 通过站点聚合、独立图层与线路高亮,方便查看密集区域和具体路线。
地图用于观察线路走向、站点分布和跨区域连接。具体线路之间是否存在共同站点,由后面的网络建模单独计算。
5计算线路长度、站距与绕行程度
- 读取 874 条线路的长度、站点数和起终点坐标
- 分别计算长度、站数、站距与绕行程度
- 生成统计图和结果表
- 描述这批线路的基本特征
线路基本特征统计、分布图和结果表。
工具与方法:Pandas · Haversine 距离公式 · Matplotlib
查看处理方法与依据收起处理方法与依据
- 读取 874 条线路的长度、站点数和起终点坐标
- 分别计算长度、站数、站距与绕行程度
- 生成统计图和结果表
- 描述这批线路的基本特征
| 指标 | 怎样计算 | 报告结果 |
|---|---|---|
| 平均线路长度 | 对每条线路的全程距离求平均 | 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按共同站点建立线路之间的连接
- 每条线路对应一个节点,整理它经过的站名集合
- 逐对比较线路,共比较 381,501 对
- 至少有一个共同站名 → 建立一条无向连接
- 保存 874 个节点与 25,929 条连接
线路节点、可换乘连接及共同站名数量,供后续网络指标计算。
工具与方法:NetworkX · 站名集合比较 · 无向网络
查看处理方法与依据收起处理方法与依据
- 每条线路对应一个节点,整理它经过的站名集合
- 逐对比较线路,共比较 381,501 对
- 至少有一个共同站名 → 建立一条无向连接
- 保存 874 个节点与 25,929 条连接
| 网络里的对象 | 在公交数据中表示什么 |
|---|---|
| 线路节点 | 按清洗后站点表中的线路名分组,每组建立一个节点 |
| 站名集合 | 每条线路先去掉空站名,再对站名去重 |
| 两两比较 | 只比较不同线路,每对比较一次;共同站名至少 1 个就连接 |
| 连接数量属性 | 共同站名个数保存为 weight;如共同经过乙、丙两站,则为 2 |
| 输出文件 | 保存 GEXF 网络文件、按共同站名数排序的连接表、按直接相连线路数排序的节点表 |
例如 A 线经过甲、乙、丙站,B 线经过乙、丁站,两条线路有共同站名“乙”,程序就建立连接。若有两个共同站名,连接上记录的数量就是 2。
874 条线路每对只比较一次,共 874×873÷2=381,501 对。连接数占所有可能线路对的比例约为 6.8%,即网络密度约 0.068。
NetworkX 生成无向网络,导出 GEXF 文件、连接表和各线路直接相连数量表。匹配依据为相同站名,实际换乘还需考虑站点位置与步行条件。
7计算连接数量、可达关系与路径长度
- 统计每条线路直接相连的线路数量
- 找出彼此能够到达的线路集合
- 在最大连通部分计算最短路径
- 结合聚类系数描述局部连接与整体可达关系
网络规模、连接较多的线路、可达范围和路径指标。
工具与方法:NetworkX · 邻接线路统计 · 连通性检查 · 最短路径 · 聚类系数
查看处理方法与依据收起处理方法与依据
- 统计每条线路直接相连的线路数量
- 找出彼此能够到达的线路集合
- 在最大连通部分计算最短路径
- 结合聚类系数描述局部连接与整体可达关系
| 指标 | 含义 | 本次结果或计算范围 |
|---|---|---|
| 直接连接数量 | 一条线路与多少条其他线路具有共同站名 | 平均 59.3;材料记录地铁 1 号线最多,为 176 |
| 最大连通部分 | 通过一次或多次连接可以相互到达的最大线路集合 | 861 个节点,占 98.5% |
| 平均最短路径 | 在最大连通部分,计算各线路之间最少连接步数并求平均 | 2.57 步 |
| 网络直径 | 同一计算范围内,最短路径中最长的一条 | 6 步 |
| 聚类系数 | 观察一条线路的相邻线路之间是否也经常连接,再对全图求平均 | 0.553 |
这些数字分别回答“直接连接多不多”“大部分线路能否互达”“需要经过多少条连接”。平均路径 2.57 的范围是最大连通部分,不直接表示任意两个地理位置的实际换乘次数。
采集材料包含地铁 1 号线等轨道线路,因此这里的网络按采集到的公共交通线路理解。最终将指标、连接较多的线路和统计图整理到综合页面、答辩展示及项目报告中。
图片与材料
点击文件夹展开,再点击图片放大。
线路地图:查看公交线路与站点在城市中的空间分布。
分析结果
- 01
采集数据包含 874 条有效线路、5,616 个唯一站点;换乘网络以线路为节点,按共同站名建立连接,记录了 25,929 条线路间连接。
- 02
原项目记录的平均路径长度约为 2.57。这个指标对应线路节点之间的连接步数,代码在网络不完全连通时使用最大连通部分计算。
- 03
交互地图、综合分析和答辩展示分别保留空间位置、网络指标与过程说明,相关代码和数据脚本可以继续核对。
分析中的判断与处理
地图用于查看站点与线路的位置,NetworkX 用于计算线路之间的连接与路径。单条线路、全市分布、换乘网络和综合指标分别展示,读者可以根据问题选择页面。班次、拥堵和步行时间需要额外数据支持,现有分析聚焦线路连接结构。
我与 AI 如何完成项目
Claude Code + DeepSeek Pro
个人完成。本人负责采集范围、网络构建口径、结果验证和展示结构;AI协助代码实现。
我怎样把课程实例变成完整项目
我先提供课程实例、目标城市和需要复现的分析结果,再与Claude Code和DeepSeek Pro讨论数据来源、采集范围、缓存方式、网络定义和展示页面。项目随后拆成API采集、数据整理、网络构建、指标计算和可视化。
AI负责哪些实现工作
我负责给ai提供高德api,ai负责请求、缓存、失败重试、数据清理、NetworkX网络构建、Folium地图和HTML展示代码,并参与技术路线与结果解释。
我怎样检查网络是否建立正确
我检查线路数、唯一站点数、线路轨迹和网络边数量,并分别查看单条线路地图、全市分布和换乘网络。地图用于检查空间位置,NetworkX用于计算线路连接与路径,两类结果分别保留。
参考与使用说明
结果适用范围
- 结果受API返回范围、采集时间和线路变更影响,不等于实时公交调度系统。
- 公开仓库不包含高德API密钥,使用者需通过环境变量自行配置。
- 网络连通不等于实际出行体验,仍缺少班次、拥堵和步行时间。