OSMnx中primary道路speed_kph异常值强制修正方法咨询
问题:OSMnx中马德里Primary道路速度异常值的强制修正方法
问题背景
我使用Python的OSMnx包处理西班牙马德里的OpenStreetMap数据,执行了以下操作:
- 创建马德里区域的边界框并生成路网:
north, south, east, west = 40.45, 40.40, -3.691, -3.74 # 创建边界框内的路网 H = ox.graph_from_bbox(north, south, east, west, network_type="drive_service") fig, ax = ox.plot_graph(H, node_size=0, edge_color="w", edge_linewidth=0.2)
- 为所有边填充速度和旅行时间:
import networkx as nx import osmnx as ox H = ox.speed.add_edge_speeds(H) H = ox.speed.add_edge_travel_times(H)
- 按道路类型统计参数:
edges = ox.graph_to_gdfs(H, nodes=False) edges["highway"] = edges["highway"].astype(str) edges.groupby("highway")["length", "speed_kph", "travel_time"].mean().round(1)
发现primary道路的speed_kph均值为561.5,该值明显异常。尝试通过自定义速度字典修正但未生效:
H = ox.graph_from_bbox(north, south, east, west, network_type="drive_service") hwy_speeds = {"primary": 50} H = ox.add_edge_speeds(H, hwy_speeds) H = ox.add_edge_travel_times(H) edges = ox.graph_to_gdfs(H, nodes=False) edges["highway"] = edges["highway"].astype(str) edges.groupby("highway")["length", "speed_kph", "travel_time"].mean().round(1)
请问是否可以强制修正该speed_kph的异常值?
解决方案
可以通过以下几种方式强制修正异常的速度值:
方法1:直接遍历并修改边属性
跳过add_edge_speeds的自动逻辑,直接对所有primary类型的边手动设置速度:
# 遍历图中所有边(包含key和属性数据) for u, v, key, data in H.edges(keys=True, data=True): # 兼容OSM中highway字段为列表的情况 if isinstance(data["highway"], list): if "primary" in data["highway"]: data["speed_kph"] = 50 else: if data["highway"] == "primary": data["speed_kph"] = 50 # 基于修正后的速度重新计算旅行时间 H = ox.speed.add_edge_travel_times(H)
方法2:调整自定义速度字典的优先级
add_edge_speeds默认优先使用OSM原生的maxspeed标签,仅当该标签缺失时才会调用自定义字典。如果异常值来自错误的原生maxspeed,可以设置fallback=True强制覆盖原生值:
hwy_speeds = {"primary": 50} # 设置fallback=True,强制使用自定义速度忽略原生maxspeed H = ox.speed.add_edge_speeds(H, hwy_speeds=hwy_speeds, fallback=True) H = ox.speed.add_edge_travel_times(H)
方法3:先清理异常值再重新关联图数据
先导出边数据框修正异常值,再将修正后的数据重新导入图中:
# 导出边数据框(不包含节点) edges = ox.graph_to_gdfs(H, nodes=False) # 筛选primary道路并替换异常速度(这里以速度>100为异常阈值) mask = edges["highway"].astype(str) == "primary" edges.loc[mask, "speed_kph"] = edges.loc[mask, "speed_kph"].apply(lambda x: 50 if x > 100 else x) # 将修正后的边数据与原节点数据重新组合为图 H = ox.graph_from_gdfs(ox.graph_to_gdfs(H, edges=False), edges) # 重新计算旅行时间 H = ox.speed.add_edge_travel_times(H)
内容的提问来源于stack exchange,提问作者aloplop85
相关产品推荐
相关产品推荐

