diff --git a/app/cross_eva_views.py b/app/cross_eva_views.py index 3ee83ce..5be0767 100644 --- a/app/cross_eva_views.py +++ b/app/cross_eva_views.py @@ -32,9 +32,9 @@ def query_cross_usable_date_api(): return query_cross_usable_date(dict(request.args)) -@app.route('/api/query_cross_delay_info', methods=['GET']) +@app.route('/api/query_cross_delay_info', methods=['POST']) def query_cross_delay_info_api(): - return query_cross_delay_info(dict(request.args)) + return query_cross_delay_info(request.json) if __name__ == '__main__': diff --git a/app/cross_evaluate_worker.py b/app/cross_evaluate_worker.py index 9c057af..7e35ef3 100644 --- a/app/cross_evaluate_worker.py +++ b/app/cross_evaluate_worker.py @@ -96,7 +96,6 @@ def query_cross_delay_info(params): tp_start = 't' + str(tp_start) elif query_type == 2: tp_start = 'h' + str(tp_start) - cross_delay_data_list = db_cross.query_cross_delay_info(crossid, nodeid, date_list, tp_start, tp_end) avg_cross_delay_info = gen_avg_cross_delay_pb(cross_delay_data_list) if not avg_cross_delay_info: diff --git a/app/db_cross_delay.py b/app/db_cross_delay.py index 7dd31a8..2c93281 100644 --- a/app/db_cross_delay.py +++ b/app/db_cross_delay.py @@ -19,6 +19,7 @@ class CrossDbHelper(TableDbHelperBase): return self.do_select(sql) def query_cross_delay_info(self, crossid, nodeid, date_list, tp_start, tp_end): + date_list = ','.join(["'" + str(item) + "'" for item in date_list]) sql = f""" select * from traffic_{nodeid}.cross_delay where crossid = '{crossid}' and day in ({date_list}) and tp_start = '{tp_start}' and tp_end = '{tp_end}' """ diff --git a/app/eva_common.py b/app/eva_common.py index 548a451..352ae58 100644 --- a/app/eva_common.py +++ b/app/eva_common.py @@ -2,11 +2,12 @@ # @Author: Owl # @Date: 2025/10/10 19:51 # @Description: 路口评价相关的公共函数 +import copy import json import logging -from copy import copy import requests +from google.protobuf.json_format import MessageToJson import proto.xlcomm_pb2 as pb from app.global_source import db_tmnet, db_cross @@ -32,29 +33,42 @@ int_internet_code2str = { } int_cross_model2str = { - 1: '快', - 2: '主', - 3: '次', - 4: '支' + '1': '快', + '2': '主', + '3': '次', + '4': '支' } def gen_avg_cross_delay_pb(cross_delay_data_list): + """ + 路口评价指标数据聚合 + :param cross_delay_data_list: + :return: + """ + cross_delay_pb_list = [] + for item in cross_delay_data_list: + item_delay_pb = pb.xl_cross_delayinfo_t() + item_delay_pb.ParseFromString(item['data']) + cross_delay_pb_list.append(item_delay_pb) avg_cross_delay = None - if len(cross_delay_data_list) == 0: + if len(cross_delay_pb_list) == 0: return avg_cross_delay - elif len(cross_delay_data_list) == 1: - avg_cross_delay = cross_delay_data_list[0] + elif len(cross_delay_pb_list) == 1: + avg_cross_delay = cross_delay_pb_list[0] return avg_cross_delay avg_cross_delay = pb.xl_cross_delayinfo_t() - avg_cross_delay.crossid = cross_delay_data_list[0].crossid - avg_cross_delay.tp = cross_delay_data_list[0].tp + avg_cross_delay.crossid = cross_delay_pb_list[0].crossid + avg_cross_delay.tp.start_hm = cross_delay_pb_list[0].tp.start_hm + avg_cross_delay.tp.end_hm = cross_delay_pb_list[0].tp.end_hm + avg_cross_delay.tp.weekday = cross_delay_pb_list[0].tp.weekday + avg_cross_delay.tp.type = cross_delay_pb_list[0].tp.type avg_cross_delay.daynum = 0 sum_car_num, delay_time, stop_times, queue_len, speed, jam_index, park_time, std_flow, high_park_percent, truck_percent, park_percent, move_speed, imbalance_index\ = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 # 路口延误数据指标聚合逻辑 - for item in cross_delay_data_list: - item_delay_info = item.delay_info() + for item in cross_delay_pb_list: + item_delay_info = item.delay_info item_car_num = item_delay_info.car_num if item_car_num != 0: sum_car_num += item_car_num @@ -72,23 +86,23 @@ def gen_avg_cross_delay_pb(cross_delay_data_list): std_flow += item_delay_info.std_flow avg_cross_delay.delay_info.car_num = sum_car_num - avg_cross_delay.delay_info.delay_time = delay_time / sum_car_num + avg_cross_delay.delay_info.delay_time = int(delay_time / sum_car_num) avg_cross_delay.delay_info.stop_times = stop_times / sum_car_num - avg_cross_delay.delay_info.queue_len = queue_len / sum_car_num - avg_cross_delay.delay_info.speed = speed / sum_car_num + avg_cross_delay.delay_info.queue_len = int(queue_len / sum_car_num) + avg_cross_delay.delay_info.speed = int(speed / sum_car_num) avg_cross_delay.delay_info.jam_index = jam_index / sum_car_num - avg_cross_delay.delay_info.park_time = park_time / sum_car_num - avg_cross_delay.delay_info.high_park_percent = high_park_percent / sum_car_num - avg_cross_delay.delay_info.truck_percent = truck_percent / sum_car_num - avg_cross_delay.delay_info.park_percent = park_percent / sum_car_num - avg_cross_delay.delay_info.move_speed = move_speed / sum_car_num + avg_cross_delay.delay_info.park_time = int(park_time / sum_car_num) + avg_cross_delay.delay_info.high_park_percent = int(high_park_percent / sum_car_num) + avg_cross_delay.delay_info.truck_percent = int(truck_percent / sum_car_num) + avg_cross_delay.delay_info.park_percent = int(park_percent / sum_car_num) + avg_cross_delay.delay_info.move_speed = int(move_speed / sum_car_num) # avg_cross_delay.delay_info.imbalance_index = imbalance_index / sum_car_num - avg_cross_delay.delay_info.std_flow = std_flow / len(cross_delay_data_list) + avg_cross_delay.delay_info.std_flow = int(std_flow / len(cross_delay_pb_list)) # 进口道延误数据聚合处理逻辑 inroad_delay_info_dict = {} - for item in cross_delay_data_list: - inroad_delay_infos = item.inroad_delay_infos() + for item in cross_delay_pb_list: + inroad_delay_infos = item.inroad_delay_infos for inroad_item in inroad_delay_infos: inroadid = inroad_item.inroadid if inroadid not in inroad_delay_info_dict: @@ -99,57 +113,59 @@ def gen_avg_cross_delay_pb(cross_delay_data_list): flow_delay_info_dict = {} max_stop_times, min_stop_times = 0, 99999 for inroadid in inroad_delay_info_dict.keys(): - delay_infos = inroad_delay_info_dict[inroadid] - inroad_sum_car_num, inroad_delay_time, inroad_stop_times, inroad_queue_len, inroad_speed, inroad_jam_index, inroad_park_time, inroad_high_park_percent, inroad_truck_percent, inroad_park_percent, inroad_move_speed, inroad_imbalance_index, inroad_std_flow\ - = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ffs, capacity = delay_infos[0].ffs, delay_infos[0].capacity + road_delay_infos = inroad_delay_info_dict[inroadid] + inroad_sum_car_num, inroad_delay_time, inroad_stop_times, inroad_queue_len, inroad_speed, inroad_jam_index, inroad_park_time, inroad_high_park_percent, inroad_truck_percent, inroad_park_percent, inroad_move_speed, inroad_imbalance_index, inroad_std_flow, inroad_travel_time\ + = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ffs, capacity = road_delay_infos[0].delay_info.ffs, road_delay_infos[0].delay_info.capacity turn_ratio_0, turn_ratio_1, turn_ratio_2, turn_ratio_3 = 0, 0, 0, 0 - for delay_info in delay_infos: - inroad_sum_car_num += delay_info.car_num - inroad_delay_time += delay_info.delay_time * delay_info.car_num - inroad_stop_times += delay_info.stop_times * delay_info.car_num - inroad_queue_len += delay_info.queue_len * delay_info.car_num - inroad_speed += delay_info.speed * delay_info.car_num - inroad_jam_index += delay_info.jam_index * delay_info.car_num - inroad_park_time += delay_info.park_time * delay_info.car_num - inroad_high_park_percent += delay_info.high_park_percent * delay_info.car_num - inroad_truck_percent += delay_info.truck_percent * delay_info.car_num - inroad_park_percent += delay_info.park_percent * delay_info.car_num - inroad_move_speed += delay_info.move_speed * delay_info.car_num + for road_delay_info in road_delay_infos: + inroad_sum_car_num += road_delay_info.delay_info.car_num + inroad_delay_time += road_delay_info.delay_info.delay_time * road_delay_info.delay_info.car_num + inroad_stop_times += road_delay_info.delay_info.stop_times * road_delay_info.delay_info.car_num + inroad_queue_len += road_delay_info.delay_info.queue_len * road_delay_info.delay_info.car_num + inroad_speed += road_delay_info.delay_info.speed * road_delay_info.delay_info.car_num + inroad_jam_index += road_delay_info.delay_info.jam_index * road_delay_info.delay_info.car_num + inroad_park_time += road_delay_info.delay_info.park_time * road_delay_info.delay_info.car_num + inroad_high_park_percent += road_delay_info.delay_info.high_park_percent * road_delay_info.delay_info.car_num + inroad_truck_percent += road_delay_info.delay_info.truck_percent * road_delay_info.delay_info.car_num + inroad_park_percent += road_delay_info.delay_info.park_percent * road_delay_info.delay_info.car_num + inroad_move_speed += road_delay_info.delay_info.move_speed * road_delay_info.delay_info.car_num + inroad_travel_time += road_delay_info.delay_info.travel_time * road_delay_info.delay_info.car_num # inroad_imbalance_index += delay_info.imbalance_index * delay_info.car_num - inroad_std_flow += delay_info.std_flow - turn_ratio_0 += delay_info.turn_ratio_0 - turn_ratio_1 += delay_info.turn_ratio_1 - turn_ratio_2 += delay_info.turn_ratio_2 - turn_ratio_3 += delay_info.turn_ratio_3 + inroad_std_flow += road_delay_info.delay_info.std_flow + turn_ratio_0 += road_delay_info.delay_info.turn_ratio_0 + turn_ratio_1 += road_delay_info.delay_info.turn_ratio_1 + turn_ratio_2 += road_delay_info.delay_info.turn_ratio_2 + turn_ratio_3 += road_delay_info.delay_info.turn_ratio_3 # 流向级别数据指标聚合处理逻辑 - flow_delay_infos = delay_info.flow_delay_infos + flow_delay_infos = road_delay_info.flow_delay_infos flow_delay_list.extend(flow_delay_infos) inroad_delay_info = pb.xl_inroad_delayinfo_t() inroad_delay_info.inroadid = inroadid - inroad_delay_info.ffs = ffs - inroad_delay_info.capacity = capacity - inroad_delay_info.car_num = inroad_sum_car_num - inroad_delay_info.delay_time = inroad_delay_time / inroad_sum_car_num - inroad_delay_info.stop_times = inroad_stop_times / inroad_sum_car_num + inroad_delay_info.delay_info.ffs = ffs + inroad_delay_info.delay_info.capacity = capacity + inroad_delay_info.delay_info.car_num = inroad_sum_car_num + inroad_delay_info.delay_info.delay_time = int(inroad_delay_time / inroad_sum_car_num) + inroad_delay_info.delay_info.stop_times = inroad_stop_times / inroad_sum_car_num if stop_times > max_stop_times: max_stop_times = stop_times if stop_times < min_stop_times: min_stop_times = stop_times - inroad_delay_info.queue_len = inroad_queue_len / inroad_sum_car_num - inroad_delay_info.speed = inroad_speed / inroad_sum_car_num - inroad_delay_info.jam_index = inroad_jam_index / inroad_sum_car_num - inroad_delay_info.park_time = inroad_park_time / inroad_sum_car_num - inroad_delay_info.high_park_percent = inroad_high_park_percent / inroad_sum_car_num - inroad_delay_info.truck_percent = inroad_truck_percent / inroad_sum_car_num - inroad_delay_info.park_percent = inroad_park_percent / inroad_sum_car_num - inroad_delay_info.move_speed = inroad_move_speed / inroad_sum_car_num - # inroad_delay_info.imbalance_index = inroad_imbalance_index / inroad_sum_car_num - inroad_delay_info.std_flow = inroad_std_flow / len(delay_infos) - inroad_delay_info.turn_ratio_0 = turn_ratio_0 - inroad_delay_info.turn_ratio_1 = turn_ratio_1 - inroad_delay_info.turn_ratio_2 = turn_ratio_2 - inroad_delay_info.turn_ratio_3 = turn_ratio_3 + inroad_delay_info.delay_info.queue_len = int(inroad_queue_len / inroad_sum_car_num) + inroad_delay_info.delay_info.speed = int(inroad_speed / inroad_sum_car_num) + inroad_delay_info.delay_info.jam_index = inroad_jam_index / inroad_sum_car_num + inroad_delay_info.delay_info.park_time = int(inroad_park_time / inroad_sum_car_num) + inroad_delay_info.delay_info.high_park_percent = int(inroad_high_park_percent / inroad_sum_car_num) + inroad_delay_info.delay_info.truck_percent = int(inroad_truck_percent / inroad_sum_car_num) + inroad_delay_info.delay_info.park_percent = int(inroad_park_percent / inroad_sum_car_num) + inroad_delay_info.delay_info.move_speed = int(inroad_move_speed / inroad_sum_car_num) + inroad_delay_info.delay_info.travel_time = int(inroad_travel_time / inroad_sum_car_num) + # inroad_delay_info.delay_info.imbalance_index = inroad_imbalance_index / inroad_sum_car_num + inroad_delay_info.delay_info.std_flow = int(inroad_std_flow / len(road_delay_infos)) + inroad_delay_info.delay_info.turn_ratio_0 = turn_ratio_0 + inroad_delay_info.delay_info.turn_ratio_1 = turn_ratio_1 + inroad_delay_info.delay_info.turn_ratio_2 = turn_ratio_2 + inroad_delay_info.delay_info.turn_ratio_3 = turn_ratio_3 inroad_delay_pb_list.append(inroad_delay_info) cross_imbalance_index = round((max_stop_times - min_stop_times) / avg_cross_delay.delay_info.stop_times, 2) avg_cross_delay.delay_info.imbalance_index = cross_imbalance_index @@ -164,39 +180,41 @@ def gen_avg_cross_delay_pb(cross_delay_data_list): flow_delay_infos = flow_delay_info_dict[xlink_id] inroadid = flow_delay_infos[0].inroadid turn_type = flow_delay_infos[0].turn_type - flow_sum_car_num, flow_delay_time, flow_stop_times, flow_queue_len, flow_speed, flow_jam_index, flow_park_time, flow_high_park_percent, flow_truck_percent, flow_park_percent, flow_move_speed, flow_imbalance_index, flow_std_flow \ - = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + flow_sum_car_num, flow_delay_time, flow_stop_times, flow_queue_len, flow_speed, flow_jam_index, flow_park_time, flow_high_park_percent, flow_truck_percent, flow_park_percent, flow_move_speed, flow_imbalance_index, flow_std_flow, flow_travel_time \ + = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 for flow_delay_info in flow_delay_infos: - flow_sum_car_num += flow_delay_info.car_num - flow_delay_time += flow_delay_info.delay_time * flow_delay_info.car_num - flow_stop_times += flow_delay_info.stop_times * flow_delay_info.car_num - flow_queue_len += flow_delay_info.queue_len * flow_delay_info.car_num - flow_speed += flow_delay_info.speed * flow_delay_info.car_num - flow_jam_index += flow_delay_info.jam_index * flow_delay_info.car_num - flow_park_time += flow_delay_info.park_time * flow_delay_info.car_num - flow_high_park_percent += flow_delay_info.high_park_percent * flow_delay_info.car_num - flow_truck_percent += flow_delay_info.truck_percent * flow_delay_info.car_num - flow_park_percent += flow_delay_info.park_percent * flow_delay_info.car_num - flow_move_speed += flow_delay_info.move_speed * flow_delay_info.car_num - # flow_imbalance_index += flow_delay_info.imbalance_index * flow_delay_info.car_num - flow_std_flow += flow_delay_info.std_flow + flow_sum_car_num += flow_delay_info.delay_info.car_num + flow_delay_time += flow_delay_info.delay_info.delay_time * flow_delay_info.delay_info.car_num + flow_stop_times += flow_delay_info.delay_info.stop_times * flow_delay_info.delay_info.car_num + flow_queue_len += flow_delay_info.delay_info.queue_len * flow_delay_info.delay_info.car_num + flow_travel_time += flow_delay_info.delay_info.travel_time * flow_delay_info.delay_info.car_num + flow_speed += flow_delay_info.delay_info.speed * flow_delay_info.delay_info.car_num + flow_jam_index += flow_delay_info.delay_info.jam_index * flow_delay_info.delay_info.car_num + flow_park_time += flow_delay_info.delay_info.park_time * flow_delay_info.delay_info.car_num + flow_high_park_percent += flow_delay_info.delay_info.high_park_percent * flow_delay_info.delay_info.car_num + flow_truck_percent += flow_delay_info.delay_info.truck_percent * flow_delay_info.delay_info.car_num + flow_park_percent += flow_delay_info.delay_info.park_percent * flow_delay_info.delay_info.car_num + flow_move_speed += flow_delay_info.delay_info.move_speed * flow_delay_info.delay_info.car_num + # flow_imbalance_index += flow_delay_info.delay_info.imbalance_index * flow_delay_info.delay_info.car_num + flow_std_flow += flow_delay_info.delay_info.std_flow flow_info = pb.xl_flow_delayinfo_t() flow_info.xlink_id = xlink_id flow_info.inroadid = inroadid flow_info.turn_type = turn_type - flow_info.car_num = flow_sum_car_num - flow_info.delay_time = flow_delay_time / flow_sum_car_num - flow_info.stop_times = flow_stop_times / flow_sum_car_num - flow_info.queue_len = flow_queue_len / flow_sum_car_num - flow_info.speed = flow_speed / flow_sum_car_num - flow_info.jam_index = flow_jam_index / flow_sum_car_num - flow_info.park_time = flow_park_time / flow_sum_car_num - flow_info.high_park_percent = flow_high_park_percent / flow_sum_car_num - flow_info.truck_percent = flow_truck_percent / flow_sum_car_num - flow_info.park_percent = flow_park_percent / flow_sum_car_num - flow_info.move_speed = flow_move_speed / flow_sum_car_num - # flow_info.imbalance_index = flow_imbalance_index / flow_sum_car_num - flow_info.std_flow = flow_std_flow / len(flow_delay_infos) + flow_info.delay_info.car_num = flow_sum_car_num + flow_info.delay_info.delay_time = int(flow_delay_time / flow_sum_car_num) + flow_info.delay_info.stop_times = flow_stop_times / flow_sum_car_num + flow_info.delay_info.queue_len = int(flow_queue_len / flow_sum_car_num) + flow_info.delay_info.speed = int(flow_speed / flow_sum_car_num) + flow_info.delay_info.travel_time = int(flow_travel_time / flow_sum_car_num) + flow_info.delay_info.jam_index = flow_jam_index / flow_sum_car_num + flow_info.delay_info.park_time = int(flow_park_time / flow_sum_car_num) + flow_info.delay_info.high_park_percent = int(flow_high_park_percent / flow_sum_car_num) + flow_info.delay_info.truck_percent = int(flow_truck_percent / flow_sum_car_num) + flow_info.delay_info.park_percent = int(flow_park_percent / flow_sum_car_num) + flow_info.delay_info.move_speed = int(flow_move_speed / flow_sum_car_num) + # flow_info.delay_info.imbalance_index = flow_imbalance_index / flow_sum_car_num + flow_info.delay_info.std_flow = int(flow_std_flow / len(flow_delay_infos)) for inroad_info in inroad_delay_pb_list: if inroad_info.inroadid == inroadid: inroad_info.flow_delay_infos.append(flow_info) @@ -206,8 +224,8 @@ def gen_avg_cross_delay_pb(cross_delay_data_list): # 出口道流量数据聚合逻辑 outroad_delay_info_dict = {} - for item in cross_delay_data_list: - outroadid_infos = item.outroadInfos + for item in cross_delay_pb_list: + outroadid_infos = item.outroad_infos for outroadid_info in outroadid_infos: outroadid = outroadid_info.outroadid if outroadid not in outroad_delay_info_dict: @@ -239,21 +257,21 @@ def gen_avg_cross_delay_pb(cross_delay_data_list): # 生成路口诊断页面路口概览数据指标的函数 def gen_overview_index(avg_cross_delay_info, inroad_static_info_dict, nodeid, date_list, roads_dir_dict): - car_num = avg_cross_delay_info.car_num + car_num = avg_cross_delay_info.delay_info.car_num crossid = avg_cross_delay_info.crossid - jam_index = round(avg_cross_delay_info.jam_index, 2) - stop_times = round(avg_cross_delay_info.stop_times, 2) - high_park_percent = str(round(avg_cross_delay_info.high_park_percent, 2)) + '%' - imbanlance_index = round(avg_cross_delay_info.imbalance_index, 2) - speed = round(avg_cross_delay_info.speed, 2) * 100 - move_speed = round(avg_cross_delay_info.move_speed, 2) * 100 - park_time = round(avg_cross_delay_info.park_time, 2) - delay_time = round(avg_cross_delay_info.delay_time, 2) + jam_index = round(avg_cross_delay_info.delay_info.jam_index, 2) + stop_times = round(avg_cross_delay_info.delay_info.stop_times, 2) + high_park_percent = str(avg_cross_delay_info.delay_info.high_park_percent) + '%' + imbanlance_index = round(avg_cross_delay_info.delay_info.imbalance_index, 2) + speed = avg_cross_delay_info.delay_info.speed / 100 + move_speed = avg_cross_delay_info.delay_info.move_speed / 100 + park_time = avg_cross_delay_info.delay_info.park_time + delay_time = avg_cross_delay_info.delay_info.delay_time high_stop_turn_ratio_desc, main_flow_src_desc = gen_high_stop_turn_ratio_desc(avg_cross_delay_info.inroad_delay_infos, inroad_static_info_dict, car_num) tide_index_list = calc_tide_index(crossid, nodeid, date_list, roads_dir_dict) - usable_tide_list = [item for item in tide_index_list if item['tide_index'] != 0] - tide_index = round(sum(usable_tide_list) / len(usable_tide_list), 2) + usable_tide_list = [item for item in tide_index_list if item != 0] + tide_index = round(sum(usable_tide_list) / len(usable_tide_list), 2) if len(usable_tide_list) > 0 else 0 service_level = calc_service_level(delay_time) overview_res = { 'jam_index': jam_index, @@ -276,7 +294,9 @@ def gen_high_stop_turn_ratio_desc(inroad_delay_infos, inroad_static_info_dict, c src_dict, src_desc_list, main_flow_src_list = {}, [], [] for inroad_info in inroad_delay_infos: inroadid = inroad_info.inroadid - inroad_car_num = inroad_info.car_num + if inroadid not in inroad_static_info_dict.keys(): + continue + inroad_car_num = inroad_info.delay_info.car_num src_dir = dir_str_dict[inroad_static_info_dict[inroadid]['src_direct']] if inroad_car_num / car_num > 0.25: check_res = found_max_car_num_flow(inroad_car_num, inroad_info) @@ -333,9 +353,9 @@ def query_cross_ledger_info(crossid, nodeid, area_id, userid): straight_left_split = 1 if roads[dir]['canaliza']['reverse_turn'] == 1: reverse_turn = 1 - if roads[dir]['canaliza']['left_turn_waiting_area'] == 1: + if roads[dir]['canaliza']['hold_left'] == 1: left_turn_waiting_area = 1 - if roads[dir]['canaliza']['straight_turn_waiting_area'] == 1: + if roads[dir]['canaliza']['hold_straight'] == 1: straight_turn_waiting_area = 1 if len(roads[dir]['canaliza']['reversible_lanes_info']) > 0: reversible_lanes_info = 1 @@ -345,8 +365,8 @@ def query_cross_ledger_info(crossid, nodeid, area_id, userid): road_special_info[dir_str_dict[dir]] = { 'straight_left_split': straight_left_split, 'reverse_turn': reverse_turn, - 'left_turn_waiting_area': left_turn_waiting_area, - 'straight_turn_waiting_area': straight_turn_waiting_area, + 'hold_left': left_turn_waiting_area, + 'hold_straight': straight_turn_waiting_area, 'reversible_lanes_info': reversible_lanes_info, 'outside_left': outside_left } @@ -415,38 +435,38 @@ def gen_road_delay_index(avg_cross_delay_info, roads_dir_dict): road_delay_infos = [] if not avg_cross_delay_info: return road_delay_infos - road_delay_infos = avg_cross_delay_info.inroad_delay_infos() - road_dir = {item['in']: item for item in roads_dir_dict.keys()} + road_delay_infos = avg_cross_delay_info.inroad_delay_infos + road_dir = {v['in']: k for k, v in roads_dir_dict.items()} road_flow_index = {} for road_index in road_delay_infos: roadid = road_index.inroadid if roadid not in road_dir.keys(): continue - service_level = calc_service_level(road_delay_infos[road_index].delay_info.delay_time) + service_level = calc_service_level(road_index.delay_info.delay_time) road_flow_index[roadid] = { - 'stop_times': round(road_delay_infos[road_index].delay_info.stop_times, 2), - 'high_park_percent': str(round(road_delay_infos[road_index].delay_info.high_park_percent, 2)) + '%', - 'imbalance_index': round(road_delay_infos[road_index].delay_info.imbalance_index, 2), - 'park_time': round(road_delay_infos[road_index].delay_info.park_time, 2), - 'delay_time': round(road_delay_infos[road_index].delay_info.delay_time, 2), - 'speed': round(road_delay_infos[road_index].delay_info.speed, 2), - 'move_speed': round(road_delay_infos[road_index].delay_info.move_speed, 2), + 'stop_times': round(road_index.delay_info.stop_times, 2), + 'high_park_percent': str(road_index.delay_info.high_park_percent) + '%', + 'imbalance_index': round(road_index.delay_info.imbalance_index, 2), + 'park_time': road_index.delay_info.park_time, + 'delay_time': road_index.delay_info.delay_time, + 'speed': road_index.delay_info.speed / 100, + 'move_speed': road_index.delay_info.move_speed / 100, 'service_level': service_level, 'flow_delays': {} } - flow_delay_infos = road_delay_infos[road_index].flow_delay_infos + flow_delay_infos = road_index.flow_delay_infos for flow_delay_info in flow_delay_infos: if flow_delay_info.turn_type not in (0, 1): continue - flow_service_level = calc_service_level(flow_delay_info.delay_time) + flow_service_level = calc_service_level(flow_delay_info.delay_info.delay_time) road_flow_index[roadid]['flow_delays'][flow_delay_info.turn_type] = { 'stop_times': round(flow_delay_info.delay_info.stop_times, 2), - 'high_park_percent': str(round(flow_delay_info.delay_info.high_park_percent, 2)) + '%', - 'park_time': round(flow_delay_info.delay_info.park_time, 2), - 'delay_time': round(flow_delay_info.delay_info.delay_time, 2), - 'speed': round(flow_delay_info.delay_info.speed, 2), + 'high_park_percent': str(flow_delay_info.delay_info.high_park_percent) + '%', + 'park_time': flow_delay_info.delay_info.park_time, + 'delay_time': flow_delay_info.delay_info.delay_time, + 'speed': flow_delay_info.delay_info.speed / 100, 'service_level': flow_service_level, - 'move_speed': round(flow_delay_info.delay_info.move_speed, 2) + 'move_speed': flow_delay_info.delay_info.move_speed / 100 } return road_flow_index @@ -470,10 +490,10 @@ def calc_inroad_imbalance_index(inroad_delay_pb_list): max_stop_times, min_stop_times = 0, 99999 flow_delay_infos = item.flow_delay_infos for flow_delay_info in flow_delay_infos: - if flow_delay_info.stop_times > max_stop_times: - max_stop_times = flow_delay_info.stop_times - if flow_delay_info.stop_times < min_stop_times: - min_stop_times = flow_delay_info.stop_times + if flow_delay_info.delay_info.stop_times > max_stop_times: + max_stop_times = flow_delay_info.delay_info.stop_times + if flow_delay_info.delay_info.stop_times < min_stop_times: + min_stop_times = flow_delay_info.delay_info.stop_times imbalance_index = round((max_stop_times - min_stop_times) / avg_stop_times, 2) item.delay_info.imbalance_index = imbalance_index return inroad_delay_pb_list @@ -485,7 +505,7 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict): road_delay_dict = {item.inroadid: item for item in road_delay_infos} outroad_info_dict = {item.outroadid: item for item in outroad_infos} cross_sum_car_num = sum([item.delay_info.car_num for item in road_delay_infos]) - cross_out_sum_car_num = sum([item.turn_info.out_car_num for item in outroad_infos]) + cross_out_sum_car_num = sum([item.turn_info.car_num for item in outroad_infos]) road_flow_turn_rate = {} for dir in roads_dir_dict.keys(): roadid = roads_dir_dict[dir]['in'] @@ -618,9 +638,10 @@ def calc_tide_index(crossid, nodeid, date_list, roads_dir_dict): def gen_subtend_road_pair(roads_dir_dict): subtend_road_pair = {} - tmp_road_dir = roads_dir_dict.deepcopy() - for dir in tmp_road_dir.keys(): - if tmp_road_dir[dir]['in'] == '-': + tmp_road_dir = copy.deepcopy(roads_dir_dict) + keys_to_process = list(tmp_road_dir.keys()) + for dir in keys_to_process: + if dir in tmp_road_dir.keys() and tmp_road_dir[dir]['in'] == '-': continue subtend_dir = src_reverse[dir] if subtend_dir in tmp_road_dir.keys() and tmp_road_dir[subtend_dir]['in'] != '-':