修复路口运行评测页面分流转向比在丁字路口或缺少某个进口道分支时的计算逻辑异常

This commit is contained in:
wangxu 2026-03-25 16:27:49 +08:00
parent 2d9dccad50
commit 8a326e7a58
1 changed files with 29 additions and 29 deletions

View File

@ -748,22 +748,22 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
inroadid_list = [roads_dir_dict[k]['in'] for k in roads_dir_dict.keys()]
outroadid_list = [roads_dir_dict[k]['out'] for k in roads_dir_dict.keys()]
for dir in roads_dir_dict.keys():
out_road_id = roads_dir_dict[dir]['out']
if 'udr_' in out_road_id:
roadid = roads_dir_dict[dir]['in']
if 'udr_' in roadid:
continue
l_rate, s_rate, r_rate = 0, 0, 0
out_l_rate, out_s_rate, out_r_rate = 0, 0, 0
in_flow_rate, out_flow_rate = 0, 0
l_num, s_num, r_num = 0, 0, 0
out_l_num, out_s_num, out_r_num = 0, 0, 0
if out_road_id != '-' and out_road_id in outroad_info_dict.keys():
out_road_info = g_roadnet.query_road(out_road_id)
if roadid != '-' and roadid in road_delay_dict.keys():
inroad_info = g_roadnet.query_road(roadid)
split_turns_set = set()
for inroadid in inroadid_list:
inroad = g_roadnet.query_road(inroadid)
if not inroad:
for outroadid in outroadid_list:
outroad = g_roadnet.query_road(outroadid)
if not outroad:
continue
angle = g_roadnet.calc_road_turn_angle_without_abs(out_road_info, inroad)
angle = g_roadnet.calc_road_turn_angle_without_abs(inroad_info, outroad)
if abs(angle) <= 30:
split_turns_set.add(0)
elif abs(angle) >= 150:
@ -772,51 +772,51 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
split_turns_set.add(2)
else:
split_turns_set.add(1)
car_num = outroad_info_dict[out_road_id].turn_info.turn_ratio_1 + outroad_info_dict[out_road_id].turn_info.turn_ratio_0 + outroad_info_dict[out_road_id].turn_info.turn_ratio_2
car_num = road_delay_dict[roadid].delay_info.turn_ratio_1 + road_delay_dict[roadid].delay_info.turn_ratio_0 + road_delay_dict[roadid].delay_info.turn_ratio_2
in_flow_rate = int(car_num / cross_sum_car_num * 100) if cross_out_sum_car_num != 0 else 0
l_rate = max(1, round(outroad_info_dict[out_road_id].turn_info.turn_ratio_1 / car_num * 100)) if car_num != 0 else 0
s_rate = max(1, round(outroad_info_dict[out_road_id].turn_info.turn_ratio_0 / car_num * 100)) if car_num != 0 else 0
r_rate = max(1, round(outroad_info_dict[out_road_id].turn_info.turn_ratio_2 / car_num * 100)) if car_num != 0 else 0
l_rate = max(1, round(road_delay_dict[roadid].delay_info.turn_ratio_1 / car_num * 100)) if car_num != 0 else 0
s_rate = max(1, round(road_delay_dict[roadid].delay_info.turn_ratio_0 / car_num * 100)) if car_num != 0 else 0
r_rate = max(1, round(road_delay_dict[roadid].delay_info.turn_ratio_2 / car_num * 100)) if car_num != 0 else 0
if 0 not in split_turns_set:
s_rate = '-'
if 1 not in split_turns_set:
l_rate = '-'
if 2 not in split_turns_set:
r_rate = '-'
l_num = outroad_info_dict[out_road_id].turn_info.turn_ratio_1
s_num = outroad_info_dict[out_road_id].turn_info.turn_ratio_0
r_num = outroad_info_dict[out_road_id].turn_info.turn_ratio_2
l_num = road_delay_dict[roadid].delay_info.turn_ratio_1
s_num = road_delay_dict[roadid].delay_info.turn_ratio_0
r_num = road_delay_dict[roadid].delay_info.turn_ratio_2
rate_list = fix_to_100(l_rate, s_rate, r_rate)
l_rate, s_rate, r_rate = rate_list[0] if rate_list[0] == '-' else int(rate_list[0]), rate_list[1] if rate_list[1] == '-' else int(rate_list[1]), rate_list[2] if rate_list[2] == '-' else int(rate_list[2])
roadid = roads_dir_dict[dir]['in']
if roadid != '-' and roadid in road_delay_dict.keys():
inroad_info = g_roadnet.query_road(roadid)
out_road_id = roads_dir_dict[dir]['out']
if out_road_id != '-' and out_road_id in outroad_info_dict.keys():
out_road_info = g_roadnet.query_road(out_road_id)
merge_turns_set = set()
for outroadid in outroadid_list:
outroad = g_roadnet.query_road(outroadid)
if not outroad:
for inroadid in inroadid_list:
inroad = g_roadnet.query_road(inroadid)
if not inroad:
continue
angle = g_roadnet.calc_road_turn_angle_without_abs(inroad_info, outroad)
angle = g_roadnet.calc_road_turn_angle_without_abs(out_road_info, inroad)
if abs(angle) <= 30:
merge_turns_set.add(0)
elif abs(angle) >= 150:
merge_turns_set.add(3)
elif angle > 0:
merge_turns_set.add(2)
else:
merge_turns_set.add(1)
out_car_num = road_delay_dict[roadid].delay_info.car_num
else:
merge_turns_set.add(2)
out_car_num = outroad_info_dict[out_road_id].turn_info.car_num
out_flow_rate = int(out_car_num / cross_out_sum_car_num * 100) if cross_out_sum_car_num != 0 else 0
out_l_rate = max(1, round(road_delay_dict[roadid].delay_info.turn_ratio_1 / out_car_num * 100)) if out_car_num != 0 else 0
out_s_rate = max(1, round(road_delay_dict[roadid].delay_info.turn_ratio_0 / out_car_num * 100)) if out_car_num != 0 else 0
out_r_rate = max(1, round(road_delay_dict[roadid].delay_info.turn_ratio_2 / out_car_num * 100)) if out_car_num != 0 else 0
out_l_rate = max(1, round(outroad_info_dict[out_road_id].turn_info.turn_ratio_1 / out_car_num * 100)) if out_car_num != 0 else 0
out_s_rate = max(1, round(outroad_info_dict[out_road_id].turn_info.turn_ratio_0 / out_car_num * 100)) if out_car_num != 0 else 0
out_r_rate = max(1, round(outroad_info_dict[out_road_id].turn_info.turn_ratio_2 / out_car_num * 100)) if out_car_num != 0 else 0
if 0 not in merge_turns_set:
out_s_rate = '-'
if 1 not in merge_turns_set:
out_l_rate = '-'
if 2 not in merge_turns_set:
out_r_rate = '-'
out_l_num, out_s_num, out_r_num = road_delay_dict[roadid].delay_info.turn_ratio_1, road_delay_dict[roadid].delay_info.turn_ratio_0, road_delay_dict[roadid].delay_info.turn_ratio_2
out_l_num, out_s_num, out_r_num = outroad_info_dict[out_road_id].turn_info.turn_ratio_1, outroad_info_dict[out_road_id].turn_info.turn_ratio_0, outroad_info_dict[out_road_id].turn_info.turn_ratio_2
rate_list = fix_to_100(out_l_rate, out_s_rate, out_r_rate)
out_l_rate, out_s_rate, out_r_rate = rate_list[0] if rate_list[0] == '-' else int(rate_list[0]), rate_list[1] if rate_list[1] == '-' else int(rate_list[1]), rate_list[2] if rate_list[2] == '-' else int(rate_list[2])
road_flow_turn_rate[roadid] = {