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

OSMnx中primary道路speed_kph异常值强制修正方法咨询

问题:OSMnx中马德里Primary道路速度异常值的强制修正方法

问题背景

我使用Python的OSMnx包处理西班牙马德里的OpenStreetMap数据,执行了以下操作:

  1. 创建马德里区域的边界框并生成路网:
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)
  1. 为所有边填充速度和旅行时间:
import networkx as nx
import osmnx as ox

H = ox.speed.add_edge_speeds(H)
H = ox.speed.add_edge_travel_times(H)
  1. 按道路类型统计参数:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:26:05