用Python玩转城市路网OSMnx一键下载北京/上海街道数据并可视化分析城市街道网络数据是交通规划、商业选址和空间分析的基础。传统获取方式往往需要复杂的GIS软件和专业数据源而Python生态中的OSMnx库彻底改变了这一局面——只需几行代码就能下载全球任意城市的道路数据并立即进行专业级分析。本文将带你从零开始用OSMnx获取北京金融街区域的步行网络计算关键指标并生成热力图与拓扑图。1. 环境配置与数据获取安装OSMnx仅需一条命令但需要注意其依赖的GeoPandas库在Windows系统可能需要额外步骤。推荐使用conda管理环境conda create -n street_analysis python3.9 conda activate street_analysis conda install -c conda-forge osmnx geopandas matplotlib获取城市路网的核心函数是graph_from_place其network_type参数支持三种模式drive机动车道路网默认walk步行网络含人行道、小巷bike自行车专用道以下代码获取上海陆家嘴区域的步行网络并自动清理外围孤立道路import osmnx as ox ox.settings.log_console True # 显示下载进度 # 获取陆家嘴3公里范围内的步行网络 graph ox.graph_from_address( 陆家嘴环路, dist3000, network_typewalk, clean_peripheryTrue )注意clean_peripheryTrue会移除网络边缘的孤立路段确保数据连贯性但可能丢失部分边界道路。2. 数据预处理与质量检查原始路网数据往往包含需要处理的拓扑问题。OSMnx提供了一套完整的预处理工具常见数据问题及解决方案问题类型检测方法处理函数适用场景重复节点ox.stats.count_duplicate_nodes(graph)ox.consolidate_intersections交叉口建模自循环边ox.stats.count_self_loops(graph)ox.utils_graph.remove_self_loops路径分析无效几何ox.utils_graph.has_invalid_geometries(graph)ox.utils_graph.remove_invalid_geometries可视化处理后的数据可以导出为多种格式# 保存为GraphML保留完整网络属性 ox.save_graphml(graph, lujiazui_walk.graphml) # 导出为Shapefile兼容GIS软件 ox.io.save_graph_shapefile(graph, filepath./shanghai_streets)3. 路网指标计算与分析OSMnx内置20余种网络指标计算方法。以下展示关键指标的计算与可视化import matplotlib.pyplot as plt # 计算基础指标 metrics ox.basic_stats(graph) print(f节点数量: {metrics[n]}) print(f道路长度: {metrics[street_length_total]:.2f}米) # 生成街道方向玫瑰图 fig, ax ox.plot_orientation(graph, showFalse) ax.set_title(陆家嘴街道方向分布, fontsize14) plt.tight_layout() plt.show()更复杂的空间分析示例——计算500米步行可达范围from shapely.geometry import Point # 以东方明珠为起点 start_point (31.2396, 121.4998) G_projected ox.project_graph(graph) center_node ox.distance.nearest_nodes(G_projected, start_point[1], start_point[0]) # 计算等时圈 isochrone ox.isochrone.isochrone( G_projected, center_node, time10, # 10分钟步行 walk_speed4.5 # km/h ) # 可视化 ax isochrone.plot(figsize(10,10), alpha0.3, colorblue) ox.plot_graph(G_projected, axax, node_size0)4. 高级可视化技巧基础网络图往往难以呈现复杂信息OSMnx支持深度定制可视化热力图生成# 计算节点中心性 nc ox.plot.get_node_colors_by_attr( graph, ox.betweenness_centrality(graph), cmapplasma ) # 绘制带中心性热力图 fig, ax ox.plot_graph( graph, node_colornc, node_size20, edge_linewidth1, bgcolorwhite )3D高程可视化# 添加高程数据 graph ox.add_node_elevations_google(graph, api_keyYOUR_KEY) # 生成3D图形 fig, ax ox.plot_graph( graph, node_colorelevation, node_size20, edge_linewidth0.5, showFalse, dpi100 ) ax.set_title(带高程的3D路网, fontsize14) ax.view_init(elev50, azim45) plt.tight_layout()5. 实战案例咖啡店选址分析结合路网与POI数据演示一个完整的商业分析流程# 获取咖啡馆数据 tags {amenity: cafe} cafes ox.geometries_from_place(静安区, 上海, tags) # 计算最近咖啡馆距离 nodes, edges ox.graph_to_gdfs(graph) nodes[nearest_cafe] nodes.geometry.apply( lambda x: cafes.distance(x).min() ) # 可视化结果 fig, ax ox.plot_graph( graph, node_colornodes[nearest_cafe], node_size20, edge_linewidth0.5, cmapviridis_r )提示实际项目中应结合人口密度、竞品分布等多维数据本例仅演示技术方法。处理大规模城市数据时建议分区域下载后合并# 分区块下载北京数据 places [朝阳区, 海淀区, 东城区] graphs [ox.graph_from_place(f{p}, 北京) for p in places] # 合并网络 big_graph ox.utils_graph.combine_graphs(graphs)最后分享一个实用技巧使用ox.settings全局配置可以显著提升工作效率ox.settings.cache_folder ./osm_cache # 设置缓存目录 ox.settings.timeout 600 # 延长API超时时间 ox.settings.memory ox.settings.memory * 2 # 增加内存限制