如何从OpenStreetMap中提取street graph或street network?
从OpenStreetMap提取道路网络(Street Graph/Street Network)操作指南
一、可使用的工具推荐
根据你的技术栈、处理数据范围不同,可选四类工具:
- OSMnx(Python库):最适合快速提取中小范围(城市级)路网的工具,封装了OSM数据调用、标签过滤、拓扑构建全流程,无需手动处理原始OSM数据格式,是做路网分析、路径规划的首选工具
- Osmium Tool(命令行工具):适合处理大范围OSM原始数据,可快速完成大文件的标签过滤、区域裁剪,性能远高于Python脚本,适合批处理场景
- QGIS(桌面端GIS软件):适合可视化操作需求,不需要写代码即可完成路网提取、拓扑校验、成果导出,适合非开发人员使用
- Osm2pgsql + PostGIS(数据库工具链):适合处理国家/洲际级别的超大规模路网,可通过SQL灵活完成要素筛选、拓扑计算、自定义属性扩展,适合企业级生产场景
二、具体实现步骤
通用流程
不管用什么工具,提取路网的核心逻辑都是一致的:
- 确定提取范围:支持自定义坐标 bounding box、行政区域名称、自定义矢量边界三种范围定义方式
- 道路要素过滤:基于OSM的
highway标签筛选符合需求的道路,常见的机动车路网保留标签包括motorway、trunk、primary、secondary、tertiary、residential、unclassified,不需要的步行道、自行车道、服务性道路可直接过滤 - 拓扑构建:关联OSM的路径(way)和节点(node)数据,处理路段连接关系、单行线属性、道路权重(长度/通行时间等)
- 数据清洗:去除孤立路段、拓扑错误、重复节点,导出为需要的格式(GraphML、Shapefile、GeoJSON等)
各工具实操示例
OSMnx 操作示例
- 安装:
pip install osmnx - 提取指定城市机动车路网代码示例:
import osmnx as ox # 提取上海市机动车可通行路网 G = ox.graph_from_place("Shanghai, China", network_type="drive") # 保存为保留完整拓扑的GraphML格式 ox.save_graphml(G, "shanghai_drive_network.graphml") # 导出为Shapefile格式用于GIS软件打开 ox.save_graph_shapefile(G, filepath="./shanghai_road_network/")
- 常用
network_type参数:drive(机动车路网)、walk(步行路网)、bike(骑行路网)、all(全类型道路)
Osmium Tool 操作示例
- 提前下载对应范围的OSM原始PBF格式文件
- 过滤道路要素命令:
osmium tags-filter input.osm.pbf w/highway=motorway,trunk,primary,secondary,tertiary,residential -o road_only.osm.pbf - 裁剪指定bbox范围路网命令:
osmium extract -b 120.8,30.7,122.2,31.5 road_only.osm.pbf -o shanghai_road.osm.pbf
QGIS 操作示例
- 顶部菜单栏选择「矢量」->「OpenStreetMap」->「下载数据」,选择提取范围后下载OSM数据
- 在Processing工具箱搜索「Extract specific tags」工具,筛选
highway标签符合要求的道路要素 - 搜索「Network from lines」工具,选择筛选后的道路图层,构建拓扑路网
三、注意事项
- 标签筛选要匹配使用场景:如果做机动车路径规划,除了筛选道路类型,还要注意处理
oneway(单行线)、access(通行权限)标签,避免把禁止机动车通行的路段纳入路网 - 大范围数据不要调用公共API:提取省级以上路网时,不要直接用OSMnx的在线API下载,容易触发限流,建议先下载对应区域的完整PBF文件本地处理
- 必须做拓扑校验:OSM是用户贡献的开源数据,存在少量路段断开、标签错标的问题,提取后要检查拓扑,删除度数为0的孤立节点、长度小于1米的异常路段
- 坐标系统一:OSM原始数据默认是WGS84(EPSG:4326)地理坐标系,如果要计算道路长度、做空间分析,需要先投影到对应区域的平面坐标系,避免距离计算出现误差
内容的提问来源于stack exchange,提问作者ethicnology
相关产品推荐
相关产品推荐

