提问人:PAnderton 提问时间:11/14/2023 最后编辑:PAnderton 更新时间:11/15/2023 访问量:32
Python OSMNX:如何在边缘上获得更逼真的速度?
Python OSMNX: How to get more realistic speeds on edges?
问:
我正在尝试根据驾驶时间进行一些研究(例如,人们愿意为某些服务开车离开住所的时间......然而,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)
答:
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 中的合适位置。
评论