Python OSMNX:如何在边缘上获得更逼真的速度?

Python OSMNX: How to get more realistic speeds on edges?

提问人:PAnderton 提问时间:11/14/2023 最后编辑:PAnderton 更新时间:11/15/2023 访问量:32

问:

我正在尝试根据驾驶时间进行一些研究(例如,人们愿意为某些服务开车离开住所的时间......然而,osmnx 的驱动时间比实际的要快得多。我认为这是因为它默认为每条边的最大速度,而没有考虑到交叉点等发生的停止和启动。我想知道是否有办法为边缘分配新的速度,它会调整边缘的长度。因此,对于城市驾驶,即使限速可能为 30 英里/小时,平均速度也要慢得多,因为人们必须经过的所有节点/十字路口都需要停止和启动。

因此,简而言之,我是否可以应用随边缘长度而变化的自定义速度(使用 maxspeed 和边缘长度作为输入的公式)?或者有更好的方法可以解决这个问题吗?

当我将其与谷歌进行比较时,距离非常接近,但时间却很远(在下面的示例中,6 分钟与 10-11 分钟)。

例:

import numpy as np
import osmnx as ox
import networkx as nx

G = ox.graph_from_address(
    "50 North Temple, Salt Lake City, UT 84150",
    dist=10000,
    network_type="drive",
    truncate_by_edge=True,
) 

G = ox.add_edge_speeds(G)
G = ox.add_edge_travel_times(G)
origin = (40.741630,-111.862470)
destination = (40.768860,-111.837560)
origin_node = ox.distance.nearest_nodes(G, origin[1], origin[0])
destination_node = ox.distance.nearest_nodes(G, destination[1], destination[0])
route = ox.shortest_path(G, origin_node, destination_node,weight="travel_time")
route_length = int(sum(ox.utils_graph.route_to_gdf(G, route, "length")["length"]))
route_time = int(sum(ox.utils_graph.route_to_gdf(G, route, "travel_time")["travel_time"]))
print("Route is", route_length/1609.34, "miles and takes", route_time/60, "minutes.")
fig, ax = ox.plot_graph_route(G, route, route_color="c", node_size=0)
时间 地理编码 驱动器 OSMNX

评论

0赞 gboeing 11/15/2023
本学期,我目前有一个 RA 团队在实验室工作,通过转弯惩罚和流量控制来增强 OSMnx 路由。

答:

0赞 Kevin P. 11/15/2023 #1

我有一个类似的应用程序,我遍历计算出的路线的节点,为沿途遇到的每个停车标志和交通信号灯添加时间惩罚。

        route = nx.shortest_path(G, start_node, destination_node, weight=weight) # Returns a list of nodes comprising the route, weighted according to the parameter weight

    # Experimental code to add delays for traffic signals and stop signs
    traffic_signal_count = stop_sign_count = 0
    traffic_signal_delay = stop_sign_delay = 0

    # Loop through all the nodes of the route counting
    # the traffic signals and stop signs encountered

    for nodeid in route:

        node = G.nodes[nodeid]
        if 'highway' in node:
            nodehighway = node['highway']
            if nodehighway == 'traffic_signals':
                traffic_signal_count += 1
            elif nodehighway == 'stop':
                stop_sign_count += 1
            else:
                pass

    # TODO: Make the delay factor configurable
    traffic_signal_delay = traffic_signal_count * 10   # 10 second delay
    stop_sign_delay = stop_sign_count * 20

    route_travel_time += ( traffic_signal_delay + stop_sign_delay )

我一直在考虑向 OSMNX 提交增强请求,以将其添加为可配置选项,作为 OSMNX 中的合适位置。