修复路口运行评测页面分流转向比在丁字路口或缺少某个进口道分支时的计算逻辑异常以及流向对比中变化值计算异常问题

This commit is contained in:
wangxu 2026-03-25 15:41:09 +08:00
parent 1622eb5928
commit 2d9dccad50
2 changed files with 39 additions and 39 deletions

View File

@ -139,18 +139,18 @@ def parse_comp_inroad_delay_infos(inroad_delay_infos, comp_inroad_delay_infos):
flow_diff_data = { flow_diff_data = {
'item': '变化量', 'item': '变化量',
'service_level': '-' if flow_comp_data['service_level'] == '-' or flow_item_data['service_level'] == '-' else compare_level(flow_comp_data['service_level'], flow_item_data['service_level']), 'service_level': '-' if flow_comp_data['service_level'] == '-' or flow_item_data['service_level'] == '-' else compare_level(flow_comp_data['service_level'], flow_item_data['service_level']),
'stop_times': '-' if flow_comp_data['stop_times'] == '-' or flow_item_data['stop_times'] == '-' else round(flow_comp_data['stop_times'] - flow_item_data['stop_times'], 2), 'stop_times': '-' if flow_item_data['stop_times'] == '-' or flow_comp_data['stop_times'] == '-' else round(flow_item_data['stop_times'] - flow_comp_data['stop_times'], 2),
'high_park_percent': '-' if '-' in flow_comp_data['high_park_percent'] or '-' in flow_item_data['high_park_percent'] else str(int(float(flow_comp_data['high_park_percent'].replace('%', '')) - float(flow_item_data['high_park_percent'].replace('%', '')))) + '%', 'high_park_percent': '-' if '-' in flow_item_data['high_park_percent'] or '-' in flow_comp_data['high_park_percent'] else str(int(float(flow_item_data['high_park_percent'].replace('%', '')) - float(flow_comp_data['high_park_percent'].replace('%', '')))) + '%',
'park_time': '-' if flow_comp_data['park_time'] == '-' or flow_item_data['park_time'] == '-' else round(flow_comp_data['park_time'] - flow_item_data['park_time'], 2), 'park_time': '-' if flow_item_data['park_time'] == '-' or flow_comp_data['park_time'] == '-' else round(flow_item_data['park_time'] - flow_comp_data['park_time'], 2),
'delay_time': '-' if flow_comp_data['delay_time'] == '-' or flow_item_data['delay_time'] == '-' else round(flow_comp_data['delay_time'] - flow_item_data['delay_time'], 2), 'delay_time': '-' if flow_item_data['delay_time'] == '-' or flow_comp_data['delay_time'] == '-' else round(flow_item_data['delay_time'] - flow_comp_data['delay_time'], 2),
'speed': '-' if flow_comp_data['speed'] == '-' or flow_item_data['speed'] == '-' else round(flow_comp_data['speed'] - flow_item_data['speed'], 2), 'speed': '-' if flow_item_data['speed'] == '-' or flow_comp_data['speed'] == '-' else round(flow_item_data['speed'] - flow_comp_data['speed'], 2),
'move_speed': '-' if flow_comp_data['move_speed'] == '-' or flow_item_data['move_speed'] == '-' else round(flow_comp_data['move_speed'] - flow_item_data['move_speed'], 2), 'move_speed': '-' if flow_item_data['move_speed'] == '-' or flow_comp_data['move_speed'] == '-' else round(flow_item_data['move_speed'] - flow_comp_data['move_speed'], 2),
'stop_times_color': '-' if flow_item_data['stop_times'] == '-' or flow_comp_data['stop_times'] == '-' else calc_index_color(flow_item_data['stop_times'], flow_comp_data['stop_times'], 'stop_times'), 'stop_times_color': '-' if flow_comp_data['stop_times'] == '-' or flow_item_data['stop_times'] == '-' else calc_index_color(flow_item_data['stop_times'], flow_comp_data['stop_times'], 'stop_times'),
'high_park_percent_color': '-' if '-' in flow_item_data['high_park_percent'] or '-' in flow_comp_data['high_park_percent'] else calc_index_color(float(flow_item_data['high_park_percent'].replace('%', '')), float(flow_comp_data['high_park_percent'].replace('%', '')), 'high_park_percent'), 'high_park_percent_color': '-' if '-' in flow_comp_data['high_park_percent'] or '-' in flow_item_data['high_park_percent'] else calc_index_color(float(flow_item_data['high_park_percent'].replace('%', '')), float(flow_comp_data['high_park_percent'].replace('%', '')), 'high_park_percent'),
'park_time_color': '-' if flow_item_data['park_time'] == '-' or flow_comp_data['park_time'] == '-' else calc_index_color(flow_item_data['park_time'], flow_comp_data['park_time'], 'park_time'), 'park_time_color': '-' if flow_comp_data['park_time'] == '-' or flow_item_data['park_time'] == '-' else calc_index_color(flow_item_data['park_time'], flow_comp_data['park_time'], 'park_time'),
'delay_time_color': '-' if flow_item_data['delay_time'] == '-' or flow_comp_data['delay_time'] == '-' else calc_index_color(flow_item_data['delay_time'], flow_comp_data['delay_time'], 'delay_time'), 'delay_time_color': '-' if flow_comp_data['delay_time'] == '-' or flow_item_data['delay_time'] == '-' else calc_index_color(flow_item_data['delay_time'], flow_comp_data['delay_time'], 'delay_time'),
'speed_color': '-' if flow_item_data['speed'] == '-' or flow_comp_data['speed'] == '-' else calc_index_color(flow_item_data['speed'], flow_comp_data['speed'], 'speed'), 'speed_color': '-' if flow_comp_data['speed'] == '-' or flow_item_data['speed'] == '-' else calc_index_color(flow_item_data['speed'], flow_comp_data['speed'], 'speed'),
'move_speed_color': '-' if flow_item_data['move_speed'] == '-' or flow_comp_data['move_speed'] == '-' else calc_index_color(flow_item_data['move_speed'], flow_comp_data['move_speed'], 'move_speed') 'move_speed_color': '-' if flow_comp_data['move_speed'] == '-' or flow_item_data['move_speed'] == '-' else calc_index_color(flow_item_data['move_speed'], flow_comp_data['move_speed'], 'move_speed')
} }
flow_delay_datas[item_turn] = { flow_delay_datas[item_turn] = {
'item_data': flow_item_data, 'item_data': flow_item_data,

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