You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OSMnx自行车基础设施评估重复问题:路径与道路关联实现单独统计

解决自行车基础设施统计重复问题:关联自行车道与对应道路

问题根源

当使用network_type='bike'时,OSMnx会同时纳入两类路径:

  • 允许自行车通行的主路(如residential、primary,带bicycle=yes或cycleway系列标签)
  • 独立的专用自行车道(highway=cycleway)
    相邻的主路与独立自行车道会被分别统计,导致重复计算。

解决方案思路

  1. 区分两类路径的属性标记
  2. 通过空间关联识别相邻的主路与独立自行车道
  3. 选择去重或属性合并策略,避免重复评估

修正后的完整代码

首先修正原代码中的标签拼写错误(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:29:55