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

如何将OSMnx获取的路线米数转换为行驶分钟数?

解决方法

1. 先获取带限速信息的路网

OSMnx默认下载的路网可能没有完整限速数据,得先下载包含maxspeed标签的道路,或者用工具自动补全缺失的限速值:

# 以起点为中心,下载5公里范围内的机动车路网,过滤常见道路类型
G = ox.graph_from_point(center_point=(fromLatLng[0], fromLatLng[1]), dist=5000,
                        network_type='drive', custom_filter='["highway"~"motorway|trunk|primary|secondary|tertiary|residential"]')

# 自动补全缺失的限速(基于道路类型的默认值)
G = ox.add_edge_speeds(G)
# 计算每条边的行驶时间(秒),公式:长度(米) / (限速(km/h) / 3.6) 转成米/秒
G = ox.add_edge_travel_times(G)

2. 计算路径的基础行驶时间

不用再只算长度,直接基于每条路的限速算时间:

orig_node = ox.nearest_nodes(G, X=fromLatLng[1], Y=fromLatLng[0])
dest_node = ox.nearest_nodes(G, X=toLatLng[1], Y=toLatLng[0])

# 获取时间优先的最短路径(也可以选长度优先,之后自己算时间)
route = nx.shortest_path(G, orig_node, dest_node, weight='travel_time')

# 累加路径中所有边的行驶时间
total_time_sec = 0
for u, v in zip(route[:-1], route[1:]):
    # 同一段路可能有多条边,选时间最短的那条
    edge_data = min(G[u][v].values(), key=lambda x: x['travel_time'])
    total_time_sec += edge_data['travel_time']

# 转成分钟
base_minutes = total_time_sec / 60
print('基础行驶时间(分钟):', base_minutes)

3. 估算红绿灯等额外延误

OSMnx没有红绿灯的精确数据,只能做近似估算:

  • 路径里的节点数减1就是经过的交叉口数量,给每个交叉口设置平均延误时间(比如城市道路每个红绿灯平均等30-60秒,郊区可以少点)。
# 假设每个交叉口平均延误45秒
intersection_num = len(route) - 1
delay_sec = intersection_num * 45

# 总时间加上延误
total_with_delay_minutes = (total_time_sec + delay_sec) / 60
print('含红绿灯延误的预估时间(分钟):', total_with_delay_minutes)

4. 区分摩托车和汽车的时间

摩托车在部分路段速度更灵活,可以调整限速比例来计算:

# 复制路网,单独设置摩托车的限速和行驶时间
G_moto = G.copy()
for u, v, key, data in G_moto.edges(data=True, keys=True):
    # 按道路类型调整限速:快速路提10%,普通道路提5%,可根据实际情况改
    if data['highway'] in ['motorway', 'trunk']:
        moto_speed = data['maxspeed'] * 1.1
    else:
        moto_speed = data['maxspeed'] * 1.05
    # 计算摩托车的行驶时间
    data['moto_travel_time'] = data['length'] / (moto_speed / 3.6)

# 累加摩托车的总行驶时间
moto_total_sec = 0
for u, v in zip(route[:-1], route[1:]):
    edge_data = min(G_moto[u][v].values(), key=lambda x: x['moto_travel_time'])
    moto_total_sec += edge_data['moto_travel_time']

# 加上红绿灯延误
moto_total_with_delay_minutes = (moto_total_sec + delay_sec) / 60
print('摩托车含延误预估时间(分钟):', moto_total_with_delay_minutes)

内容的提问来源于stack exchange,提问作者AnonymousUser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:45:37