OSMnx自行车基础设施评估重复问题:路径与道路关联实现单独统计
解决自行车基础设施统计重复问题:关联自行车道与对应道路
问题根源
当使用network_type='bike'时,OSMnx会同时纳入两类路径:
- 允许自行车通行的主路(如
residential、primary,带bicycle=yes或cycleway系列标签) - 独立的专用自行车道(
highway=cycleway)
相邻的主路与独立自行车道会被分别统计,导致重复计算。
解决方案思路
- 区分两类路径的属性标记
- 通过空间关联识别相邻的主路与独立自行车道
- 选择去重或属性合并策略,避免重复评估
修正后的完整代码
首先修正原代码中的标签拼写错误(cylceway:left改为cycleway:left),再添加去重/关联逻辑:
import networkx as nx import osmnx as ox import math import geopandas as gpd ox.config(use_cache=True, log_console=True) useful_tags_way = ['bus','bridge', 'tunnel', 'oneway', 'lanes','foot', 'ref', 'name', 'highway', 'maxspeed', 'service', 'access', 'area','landuse', 'width','cycle_network', 'est_width', 'junction', 'surface', 'bicycle', 'traffic_sign','oneway:bicycle', 'cycle_barrier', 'cycleway','cycleway:both:lane', 'cycleway:both','smoothness','parking','parking:lane:right','parking:lane:left', 'cycleway:right','cycleway:right:lane','junction','level','class:bicycle', 'tracktype', 'cycleway:left', 'cycleway:left:lane','bicycle:conditional','oneway:bicycle','cycleway:surface', 'bicycle_road', 'cycleway:width','cycleway:lane','hgv','cycleway:left:segregated','cycleway:right:segregated'] ox.utils.config(useful_tags_way=useful_tags_way) # 目标区域中心点 latitude, longitude = 48.016696, 7.810164 # 计算150米对应的经纬度偏移 meters_per_lat = 111320 meters_per_lon = 40075000 * math.cos(math.radians(latitude)) / 360 delta_lat = 150 / meters_per_lat delta_lon = 150 / meters_per_lon # 边界框 north = latitude + delta_lat south = latitude east = longitude + delta_lon west = longitude # 加载自行车网络 G = ox.graph_from_bbox(north, south, east, west, network_type='bike', simplify=False, retain_all=True, truncate_by_edge=True) gdf_nodes, gdf_edges = ox.graph_to_gdfs(G) # -------------------------- # 核心处理:去重/关联自行车道与主路 # -------------------------- # 1. 标记路径类型 gdf_edges['edge_type'] = 'road_with_bike' gdf_edges.loc[gdf_edges['highway'] == 'cycleway', 'edge_type'] = 'independent_cycleway' # 2. 识别相邻的主路与独立自行车道(缓冲1米,可根据实际调整) cycleway_buffer = gdf_edges[gdf_edges['edge_type'] == 'independent_cycleway'].buffer(1) # 找出与独立自行车道相交的主路 adjacent_roads = gdf_edges[gdf_edges['edge_type'] == 'road_with_bike'].sjoin( cycleway_buffer.to_frame('geometry'), how='inner', predicate='intersects' ).index.unique() # 3. 策略1:保留独立自行车道,移除对应的重复主路 gdf_edges_clean = gdf_edges.drop(adjacent_roads) # (可选)策略2:保留主路,合并相邻自行车道的属性后移除独立自行车道 # for road_idx in adjacent_roads: # # 找到相邻的独立自行车道 # nearby_cycleways = gdf_edges[gdf_edges['edge_type'] == 'independent_cycleway'].intersects(gdf_edges.loc[road_idx, 'geometry']) # if any(nearby_cycleways): # # 合并自行车道宽度属性到主路 # cycleway_width = gdf_edges[nearby_cycleways]['cycleway:width'].dropna().iloc[0] # gdf_edges.loc[road_idx, 'associated_cycleway_width'] = cycleway_width # # 移除独立自行车道 # gdf_edges_clean = gdf_edges[gdf_edges['edge_type'] != 'independent_cycleway'] # -------------------------- # 后续输出与可视化 # -------------------------- print(gdf_edges_clean.columns) gdf_edges_clean.to_csv('edges_clean.csv', index=False) gdf_nodes.to_csv('nodes.csv', index=False) print("去重后数据已保存为edges_clean.csv和nodes.csv。") G_clean = ox.graph_from_gdfs(gdf_nodes, gdf_edges_clean) G_projected = ox.project_graph(G_clean) ox.plot_graph(G_projected)
关键说明
- 标签修正:原代码中
cylceway:left拼写错误,已改为cycleway:left,确保完整加载自行车道相关标签。 - 空间关联:使用1米缓冲区识别相邻路径,可根据实际道路宽度调整缓冲距离。
- 去重策略:
- 策略1适合优先统计专用自行车道的场景,移除相邻的主路避免重复。
- 策略2适合将自行车设施属性合并到主路,保留主路作为统计单元。
内容的提问来源于stack exchange,提问作者Kevin Drost
相关产品推荐
相关产品推荐

