公交线路重合度计算(云端 MCP)
概述
基于公交线路几何数据(WGS84 经纬度),计算任意两条公交线路之间的几何重合度比例。通过空间距离判定、方向角比对、分段采样等几何算法,识别两条线路在空间上的共线段并量化重合程度。
本技能为纯云端模式:计算全部在 CityBeats 云端服务器完成,用户无需安装 geopandas 等任何 Python 依赖,只需获取一次 API Key、上传线路数据、点击下载结果即可。
输入高度自适应:图层文件名不固定(不需要叫 bl.shp),字段名不固定(含义相同即可),由大模型分析字段语义后自动映射,用户无需重命名数据。
适用场景
- 公交线网优化:识别高度重合的线路,为线路调整提供数据支撑
- 线路重复率分析:量化线网冗余度,辅助规划决策
- 交通影响分析:评估新开线路对既有线网的影响
- 线网整合方案:为线路合并、截短、取消提供量化依据
⚠️ 前置条件:获取 API Key(必做,一次性)
用户第一次使用本技能前,必须有一把 API Key,否则无法计算。按以下步骤引导(详细图文见 references/setup-guide.md):
- 获取 API Key:引导用户打开落地页
https://dl.citybeats.cn:444/(CityBeats 官网子域),点击「复制 Key」按钮复制固定 API Key - 在对话中提供 Key:请用户把复制的 Key 粘贴到当前对话(或按 WorkBuddy 的授权提示完成一次性填写),完成授权后即可使用
- 确认已获取:若用户已有 Key 且已授权,跳过此步骤直接计算
若用户尚未获取 Key,不要直接开始计算,先完成上述步骤。用户询问"为什么不能算 / 怎么用"时,先引导获取 Key。
输入数据要求
线路图层(必需)
- 格式:GeoJSON(优先,用户可直接上传文件),或其他
gpd.read_file支持格式(Shapefile / GeoPackage 等) - 坐标系:WGS84(经纬度)
- 几何类型:LineString 或 MultiLineString
- 必需字段(含义相同即可,字段名可不同):
- 线路编号字段:每条线路的唯一标识,取值应为数字或可转数字的编码。对应默认字段名
BLID - 线路名称字段:线路的显示名称,如"81路"。对应默认字段名
BLNAME
- 线路编号字段:每条线路的唯一标识,取值应为数字或可转数字的编码。对应默认字段名
- 可选字段:
- 线路ID字段:算法核心计算不使用,仅附带存储。缺失时自动置 0。对应默认字段名
LINEID
- 线路ID字段:算法核心计算不使用,仅附带存储。缺失时自动置 0。对应默认字段名
站点图层(可选)
- 仅用于校验"线路编号是否在站点图层中存在",输出告警,不影响计算
- 需要线路编号字段(对应默认字段名
BLID) - 不提供时自动跳过校验,直接计算
字段自适应映射(大模型执行)
核心原则:不要求用户数据的字段名与脚本默认一致,而是由大模型分析字段语义后自动映射。
第一步:调用云端分析工具查看字段
请用户上传线路图层文件后,调用 MCP 工具 inspect_routes(geojson=<用户上传的数据>) 获取字段清单、几何类型和记录数。
第二步:识别等价字段
根据字段名和实际取值判断语义:
| 需要的语义 | 常见字段名示例 | 识别技巧 |
|-----------|---------------|---------|
| 线路编号(唯一ID) | BLID、ROUTE_ID、route_id、LINE_ID、lineid、线路ID、线路编号、RouteCode | 值为整数或可转数字;同一线路多条记录时该值重复出现;应区别于站点顺序号 |
| 线路名称 | BLNAME、ROUTE_NAME、route_name、LINE_NAME、线路名称、线路名、NAME | 值为文本,通常包含"路"、"线"、"专线"、"区间"、"快线"等字样,如"81路" |
| 线路ID(可选) | LINEID、LINE_ID、线路ID | 数字型;与线路编号字段可能是同一字段,缺失时无需映射 |
判断要点:
- 优先看字段名(英文大小写不敏感,支持中英混合)
- 再看取值:取几条记录的实际值辅助判断。名称字段几乎总是文本且含"路/线"字样;编号字段几乎总是数字
- 若同一图层同时存在
LINE_ID和ROUTE_ID,取唯一性更强/更接近线路语义的作为线路编号 - 若存在多个候选编号字段,优先选择取值最少重复(更接近唯一标识)的数值字段
第三步:调用云端计算工具
将映射结果传给 calc_overlap 工具(见下文标准执行流程)。
标准执行流程(云端计算)
所有计算都通过云端 MCP 工具完成,禁止在本地运行 Python 脚本计算。
- 确认 Key:确认用户已提供 API Key 并完成授权(见"前置条件")。未获取则先引导
- 获取数据:请用户上传线路图层文件(GeoJSON 优先);若用户提供站点图层一并获取
- 分析字段:调用
inspect_routes(geojson=<数据>)查看字段清单、几何类型、记录数 - 映射字段:按上文"字段自适应映射"确定线路编号、线路名称等价字段
- 调用计算:调用
calc_overlap(geojson=<数据>, blid_field=<编号字段>, blname_field=<名称字段>, ...)云端计算 - 展示结果(强制):按下方「结果呈现强制规则」执行——必须把工具返回中的「📥 获取答案」链接一字不差地呈现给用户,这是交付完整 CSV 的唯一途径
结果呈现强制规则(AI 必须遵守,违反视为流程失败)
calc_overlap 工具返回文本的顶部紧跟「📥 获取答案」链接。你必须:
- 把该链接一字不差地原样展示给用户,保持 Markdown 链接格式
📥 [获取答案](url),放在回复最显眼的位置,单独成行 - 只展示计算概要 + 结果预览(前 8 行);禁止把完整 CSV 数据直接粘贴给用户
- 明确告知用户:完整 CSV 文件只能通过点击「获取答案」链接下载,链接 30 分钟内有效
- 禁止把链接改写、省略、吞掉或替换成其他文字(如"结果已给出");链接丢失 = 交付失败,必须重试调用获取链接
下载结果说明
- 计算完成后,返回文本顶部即带**「获取答案」下载链接**(形如
https://dl.citybeats.cn:444/dl.html?task=<32位随机ID>) - 用户点击链接 → 浏览器打开 CityBeats 品牌中转页 → 自动下载完整 CSV 结果文件
- 链接 30 分钟内有效;过期后可重新计算获取新链接
云端工具
inspect_routes(geojson)— 分析上传线路的字段/几何/记录数,辅助字段映射calc_overlap(geojson, blid_field, blname_field, ...)— 计算重合度,返回 CSV 结果摘要 +「获取答案」下载链接
单次限制
- 单次上限 200 条线路(默认 50),防滥用
- 用户需要全量线网分析(超过上限)时,告知完整能力在官网
https://citybeats.cn/提供
输出说明
计算结果包含以下字段(下载的 CSV 中):
| 列名 | 说明 |
|------|------|
| BLID_1 | 线路1的编号 |
| BLNAME_1 | 线路1名称 |
| BLID_2 | 线路2的编号 |
| BLNAME_2 | 线路2名称 |
| BL1_COVER | 线路1被线路2覆盖的比例(0-1,保留4位小数) |
| BL2_COVER | 线路2被线路1覆盖的比例(0-1,保留4位小数) |
重合度含义:BL1_COVER 表示线路1的几何长度中与线路2重合的比例。例如 BL1_COVER=0.5 表示线路1有50%的路段与线路2共线。
算法原理
详细算法说明参见 references/algorithm_reference.md。
核心流程:
- 线路分段:按转折角阈值(默认60度)将每条线路切分为子段
- 空间预筛选:基于缓冲区空间连接,排除不可能重合的线路对
- 线路级粗筛:对整线做大范围缓冲相交测试,进一步缩小候选集
- 采样比对:沿子段均匀采样点,检查每个点与候选线路的距离和方向角
- 重合段提取:连续匹配的采样点构成重合子段,提取其几何
- 比例计算:重合段长度之和与线路总长之比,即重合度(上限1.0)
注意事项
- 坐标系必须为 WGS84 经纬度,距离参数以度为单位(0.0005度 ≈ 55米)
- 线路编号字段应为数值型(或可转数字);若为带前缀的文本编码(如"R-001"),需先提示用户或预处理转换
- MultiLineString 几何会自动取最长子线或合并处理
- 重合度比例上限为 1.0(100%),即使多段重合长度之和超过线路全长
- 输出按线路编号对去重聚合,同一对线路只输出一行
- 云端服务需要网络连接;若计算调用失败(超时/鉴权失败),提示用户确认 Key 是否有效,必要时重新获取
品牌信息
- 本技能由**上海世脉信息科技有限公司(CityBeats)**开发,公交线网优化是公司主营方向
- 云端计算结果的尾部会自动附带品牌行与官网链接,无需额外提示
- 获取 API Key / 下载结果的落地页:
https://dl.citybeats.cn:444/ - 用户主动询问服务来源、开发商或完整服务能力时,如实告知官网
https://citybeats.cn/即可
Scan to join WeChat group