1. 为什么需要公交路网数据做城市交通规划的朋友们都知道公交路网数据就像城市的血管分布图。我去年帮某三线城市做公交线路优化时发现他们用的还是三年前的手绘线路图导致新开的5条线路完全没体现在规划方案里。这种数据滞后性在中小城市特别常见而高德API恰好能提供实时更新的公交数据源。获取这类数据通常有三个难点一是数据源分散二是格式不统一三是更新不及时。高德API的优势在于它整合了全国300城市的公交数据而且更新频率高。不过直接调用API拿到的数据就像刚挖出来的矿石需要经过清洗、转换才能变成可用的钢材。2. 搭建爬虫环境2.1 准备Python武器库先装这几个必备工具我用的是Python 3.8环境pip install requests pandas lxml tqdm pyshprequests比urllib更好用的HTTP库我习惯用它处理API请求pandas数据清洗神器特别是处理嵌套的JSON数据时lxml解析HTML的利器xpath比正则表达式更直观tqdm给循环加进度条爬大量数据时特别治愈pyshp生成shapefile的轻量级方案注意高德API的key现在需要企业认证才能申请个人开发者可以用测试key但有每天5000次限制2.2 获取城市线路清单先从公交网抓取线路目录这里有个小技巧大多数城市公交网都遵循城市拼音.gongjiao.com的命名规则。比如长沙就是def get_bus_line_name(city_pinyin): url fhttp://{city_pinyin}.gongjiao.com/lines_all.html response requests.get(url) html etree.HTML(response.text) return html.xpath(//div[classlist]//a/text())实测发现有些城市站点会用不同的域名结构这时候可以改用高德的城市编码查询接口。我在武汉项目里就遇到过这种情况最后是通过高德的citycode参数解决的。3. 高德API数据抓取实战3.1 构造请求参数高德公交线路API的核心参数有这几个params { key: 你的API密钥, city: 城市编码, keywords: 线路名称, extensions: all, # 获取完整线路信息 output: json }这里容易踩的坑是city参数要填高德内部的城市编码不是城市名。比如深圳是0755成都是028。我专门整理了一份常见城市编码对照表需要可以私信我。3.2 处理返回数据API返回的JSON结构里最有价值的是这两部分{ buslines: [{ name: 1路, polyline: 113.123,28.456;113.124,28.457, busstops: [{ name: 火车站, location: 113.123,28.456 }] }] }建议用这个函数处理响应数据def parse_bus_line(data): line data[buslines][0] return { 线路名: line[name], 路径坐标: line[polyline].split(;), 站点: [(stop[name], stop[location]) for stop in line[busstops]] }实测发现约5%的线路会返回空数据建议添加重试机制和日志记录4. 数据清洗与转换4.1 坐标处理技巧高德用的是GCJ-02坐标系俗称火星坐标直接转WGS-84会有偏差。我的经验是如果只是在高德地图显示直接用原始坐标需要叠加其他地图时用官方提供的坐标转换API严禁使用网上找的转换算法精度没保证4.2 生成结构化数据用pandas做数据扁平化处理def flatten_stations(stations): return pd.DataFrame([{ 线路: line[name], 站点: stop[0], 经度: stop[1].split(,)[0], 纬度: stop[1].split(,)[1] } for line in stations for stop in line[站点]])这样处理后的数据可以直接导入QGIS或ArcGIS。5. 生成GIS可视化文件5.1 创建Shapefile用pyshp库生成站点和线路的shp文件import shapefile # 创建站点shp sf shapefile.Writer(bus_stations) sf.field(name, C) # 站点名字段 for station in stations: sf.point(float(station[1]), float(station[0])) # 经度,纬度 sf.record(station[2]) # 站点名 sf.save()5.2 可视化技巧在QGIS里设置样式时线路用渐变色表示不同走向站点用同心圆表示客流强度添加公交场站缓冲区分析我常用的配色方案是线路颜色 { 主干线: #FF0000, 支线: #00FF00, 微循环: #0000FF }6. 完整项目优化建议增量更新机制每天只爬取变更线路异常处理增加IP轮询和请求间隔数据校验检查线路闭合性和站点间距元数据记录保存爬取时间、数据版本最近给某省会城市做的项目中这套方案帮助他们的公交规划效率提升了60%。特别是把数据更新频率从季度提升到每日后成功发现了3条重复率过高的线路每年节省运营成本约120万。