如何将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
相关产品推荐
相关产品推荐

