提交路口诊断页面可运行代码
This commit is contained in:
parent
083387a939
commit
728ec65bf3
|
|
@ -32,9 +32,9 @@ def query_cross_usable_date_api():
|
||||||
return query_cross_usable_date(dict(request.args))
|
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():
|
def query_cross_delay_info_api():
|
||||||
return query_cross_delay_info(dict(request.args))
|
return query_cross_delay_info(request.json)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,6 @@ def query_cross_delay_info(params):
|
||||||
tp_start = 't' + str(tp_start)
|
tp_start = 't' + str(tp_start)
|
||||||
elif query_type == 2:
|
elif query_type == 2:
|
||||||
tp_start = 'h' + str(tp_start)
|
tp_start = 'h' + str(tp_start)
|
||||||
|
|
||||||
cross_delay_data_list = db_cross.query_cross_delay_info(crossid, nodeid, date_list, tp_start, tp_end)
|
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)
|
avg_cross_delay_info = gen_avg_cross_delay_pb(cross_delay_data_list)
|
||||||
if not avg_cross_delay_info:
|
if not avg_cross_delay_info:
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ class CrossDbHelper(TableDbHelperBase):
|
||||||
return self.do_select(sql)
|
return self.do_select(sql)
|
||||||
|
|
||||||
def query_cross_delay_info(self, crossid, nodeid, date_list, tp_start, tp_end):
|
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"""
|
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}'
|
select * from traffic_{nodeid}.cross_delay where crossid = '{crossid}' and day in ({date_list}) and tp_start = '{tp_start}' and tp_end = '{tp_end}'
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,12 @@
|
||||||
# @Author: Owl
|
# @Author: Owl
|
||||||
# @Date: 2025/10/10 19:51
|
# @Date: 2025/10/10 19:51
|
||||||
# @Description: 路口评价相关的公共函数
|
# @Description: 路口评价相关的公共函数
|
||||||
|
import copy
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from copy import copy
|
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
from google.protobuf.json_format import MessageToJson
|
||||||
|
|
||||||
import proto.xlcomm_pb2 as pb
|
import proto.xlcomm_pb2 as pb
|
||||||
from app.global_source import db_tmnet, db_cross
|
from app.global_source import db_tmnet, db_cross
|
||||||
|
|
@ -32,29 +33,42 @@ int_internet_code2str = {
|
||||||
}
|
}
|
||||||
|
|
||||||
int_cross_model2str = {
|
int_cross_model2str = {
|
||||||
1: '快',
|
'1': '快',
|
||||||
2: '主',
|
'2': '主',
|
||||||
3: '次',
|
'3': '次',
|
||||||
4: '支'
|
'4': '支'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def gen_avg_cross_delay_pb(cross_delay_data_list):
|
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
|
avg_cross_delay = None
|
||||||
if len(cross_delay_data_list) == 0:
|
if len(cross_delay_pb_list) == 0:
|
||||||
return avg_cross_delay
|
return avg_cross_delay
|
||||||
elif len(cross_delay_data_list) == 1:
|
elif len(cross_delay_pb_list) == 1:
|
||||||
avg_cross_delay = cross_delay_data_list[0]
|
avg_cross_delay = cross_delay_pb_list[0]
|
||||||
return avg_cross_delay
|
return avg_cross_delay
|
||||||
avg_cross_delay = pb.xl_cross_delayinfo_t()
|
avg_cross_delay = pb.xl_cross_delayinfo_t()
|
||||||
avg_cross_delay.crossid = cross_delay_data_list[0].crossid
|
avg_cross_delay.crossid = cross_delay_pb_list[0].crossid
|
||||||
avg_cross_delay.tp = cross_delay_data_list[0].tp
|
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
|
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\
|
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
|
= 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
# 路口延误数据指标聚合逻辑
|
# 路口延误数据指标聚合逻辑
|
||||||
for item in cross_delay_data_list:
|
for item in cross_delay_pb_list:
|
||||||
item_delay_info = item.delay_info()
|
item_delay_info = item.delay_info
|
||||||
item_car_num = item_delay_info.car_num
|
item_car_num = item_delay_info.car_num
|
||||||
if item_car_num != 0:
|
if item_car_num != 0:
|
||||||
sum_car_num += item_car_num
|
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
|
std_flow += item_delay_info.std_flow
|
||||||
|
|
||||||
avg_cross_delay.delay_info.car_num = sum_car_num
|
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.stop_times = stop_times / sum_car_num
|
||||||
avg_cross_delay.delay_info.queue_len = queue_len / sum_car_num
|
avg_cross_delay.delay_info.queue_len = int(queue_len / sum_car_num)
|
||||||
avg_cross_delay.delay_info.speed = speed / 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.jam_index = jam_index / sum_car_num
|
||||||
avg_cross_delay.delay_info.park_time = park_time / sum_car_num
|
avg_cross_delay.delay_info.park_time = int(park_time / sum_car_num)
|
||||||
avg_cross_delay.delay_info.high_park_percent = high_park_percent / 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 = truck_percent / sum_car_num
|
avg_cross_delay.delay_info.truck_percent = int(truck_percent / sum_car_num)
|
||||||
avg_cross_delay.delay_info.park_percent = park_percent / sum_car_num
|
avg_cross_delay.delay_info.park_percent = int(park_percent / sum_car_num)
|
||||||
avg_cross_delay.delay_info.move_speed = move_speed / 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.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 = {}
|
inroad_delay_info_dict = {}
|
||||||
for item in cross_delay_data_list:
|
for item in cross_delay_pb_list:
|
||||||
inroad_delay_infos = item.inroad_delay_infos()
|
inroad_delay_infos = item.inroad_delay_infos
|
||||||
for inroad_item in inroad_delay_infos:
|
for inroad_item in inroad_delay_infos:
|
||||||
inroadid = inroad_item.inroadid
|
inroadid = inroad_item.inroadid
|
||||||
if inroadid not in inroad_delay_info_dict:
|
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 = {}
|
flow_delay_info_dict = {}
|
||||||
max_stop_times, min_stop_times = 0, 99999
|
max_stop_times, min_stop_times = 0, 99999
|
||||||
for inroadid in inroad_delay_info_dict.keys():
|
for inroadid in inroad_delay_info_dict.keys():
|
||||||
delay_infos = inroad_delay_info_dict[inroadid]
|
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_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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
ffs, capacity = delay_infos[0].ffs, delay_infos[0].capacity
|
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
|
turn_ratio_0, turn_ratio_1, turn_ratio_2, turn_ratio_3 = 0, 0, 0, 0
|
||||||
for delay_info in delay_infos:
|
for road_delay_info in road_delay_infos:
|
||||||
inroad_sum_car_num += delay_info.car_num
|
inroad_sum_car_num += road_delay_info.delay_info.car_num
|
||||||
inroad_delay_time += delay_info.delay_time * delay_info.car_num
|
inroad_delay_time += road_delay_info.delay_info.delay_time * road_delay_info.delay_info.car_num
|
||||||
inroad_stop_times += delay_info.stop_times * delay_info.car_num
|
inroad_stop_times += road_delay_info.delay_info.stop_times * road_delay_info.delay_info.car_num
|
||||||
inroad_queue_len += delay_info.queue_len * delay_info.car_num
|
inroad_queue_len += road_delay_info.delay_info.queue_len * road_delay_info.delay_info.car_num
|
||||||
inroad_speed += delay_info.speed * delay_info.car_num
|
inroad_speed += road_delay_info.delay_info.speed * road_delay_info.delay_info.car_num
|
||||||
inroad_jam_index += delay_info.jam_index * delay_info.car_num
|
inroad_jam_index += road_delay_info.delay_info.jam_index * road_delay_info.delay_info.car_num
|
||||||
inroad_park_time += delay_info.park_time * 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 += delay_info.high_park_percent * 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 += delay_info.truck_percent * delay_info.car_num
|
inroad_truck_percent += road_delay_info.delay_info.truck_percent * road_delay_info.delay_info.car_num
|
||||||
inroad_park_percent += delay_info.park_percent * delay_info.car_num
|
inroad_park_percent += road_delay_info.delay_info.park_percent * road_delay_info.delay_info.car_num
|
||||||
inroad_move_speed += delay_info.move_speed * 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_imbalance_index += delay_info.imbalance_index * delay_info.car_num
|
||||||
inroad_std_flow += delay_info.std_flow
|
inroad_std_flow += road_delay_info.delay_info.std_flow
|
||||||
turn_ratio_0 += delay_info.turn_ratio_0
|
turn_ratio_0 += road_delay_info.delay_info.turn_ratio_0
|
||||||
turn_ratio_1 += delay_info.turn_ratio_1
|
turn_ratio_1 += road_delay_info.delay_info.turn_ratio_1
|
||||||
turn_ratio_2 += delay_info.turn_ratio_2
|
turn_ratio_2 += road_delay_info.delay_info.turn_ratio_2
|
||||||
turn_ratio_3 += delay_info.turn_ratio_3
|
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)
|
flow_delay_list.extend(flow_delay_infos)
|
||||||
inroad_delay_info = pb.xl_inroad_delayinfo_t()
|
inroad_delay_info = pb.xl_inroad_delayinfo_t()
|
||||||
inroad_delay_info.inroadid = inroadid
|
inroad_delay_info.inroadid = inroadid
|
||||||
inroad_delay_info.ffs = ffs
|
inroad_delay_info.delay_info.ffs = ffs
|
||||||
inroad_delay_info.capacity = capacity
|
inroad_delay_info.delay_info.capacity = capacity
|
||||||
inroad_delay_info.car_num = inroad_sum_car_num
|
inroad_delay_info.delay_info.car_num = inroad_sum_car_num
|
||||||
inroad_delay_info.delay_time = inroad_delay_time / inroad_sum_car_num
|
inroad_delay_info.delay_info.delay_time = int(inroad_delay_time / inroad_sum_car_num)
|
||||||
inroad_delay_info.stop_times = inroad_stop_times / inroad_sum_car_num
|
inroad_delay_info.delay_info.stop_times = inroad_stop_times / inroad_sum_car_num
|
||||||
if stop_times > max_stop_times:
|
if stop_times > max_stop_times:
|
||||||
max_stop_times = stop_times
|
max_stop_times = stop_times
|
||||||
if stop_times < min_stop_times:
|
if stop_times < min_stop_times:
|
||||||
min_stop_times = stop_times
|
min_stop_times = stop_times
|
||||||
inroad_delay_info.queue_len = inroad_queue_len / inroad_sum_car_num
|
inroad_delay_info.delay_info.queue_len = int(inroad_queue_len / inroad_sum_car_num)
|
||||||
inroad_delay_info.speed = inroad_speed / inroad_sum_car_num
|
inroad_delay_info.delay_info.speed = int(inroad_speed / inroad_sum_car_num)
|
||||||
inroad_delay_info.jam_index = inroad_jam_index / inroad_sum_car_num
|
inroad_delay_info.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.delay_info.park_time = int(inroad_park_time / inroad_sum_car_num)
|
||||||
inroad_delay_info.high_park_percent = inroad_high_park_percent / inroad_sum_car_num
|
inroad_delay_info.delay_info.high_park_percent = int(inroad_high_park_percent / inroad_sum_car_num)
|
||||||
inroad_delay_info.truck_percent = inroad_truck_percent / inroad_sum_car_num
|
inroad_delay_info.delay_info.truck_percent = int(inroad_truck_percent / inroad_sum_car_num)
|
||||||
inroad_delay_info.park_percent = inroad_park_percent / inroad_sum_car_num
|
inroad_delay_info.delay_info.park_percent = int(inroad_park_percent / inroad_sum_car_num)
|
||||||
inroad_delay_info.move_speed = inroad_move_speed / inroad_sum_car_num
|
inroad_delay_info.delay_info.move_speed = int(inroad_move_speed / inroad_sum_car_num)
|
||||||
# inroad_delay_info.imbalance_index = inroad_imbalance_index / inroad_sum_car_num
|
inroad_delay_info.delay_info.travel_time = int(inroad_travel_time / inroad_sum_car_num)
|
||||||
inroad_delay_info.std_flow = inroad_std_flow / len(delay_infos)
|
# inroad_delay_info.delay_info.imbalance_index = inroad_imbalance_index / inroad_sum_car_num
|
||||||
inroad_delay_info.turn_ratio_0 = turn_ratio_0
|
inroad_delay_info.delay_info.std_flow = int(inroad_std_flow / len(road_delay_infos))
|
||||||
inroad_delay_info.turn_ratio_1 = turn_ratio_1
|
inroad_delay_info.delay_info.turn_ratio_0 = turn_ratio_0
|
||||||
inroad_delay_info.turn_ratio_2 = turn_ratio_2
|
inroad_delay_info.delay_info.turn_ratio_1 = turn_ratio_1
|
||||||
inroad_delay_info.turn_ratio_3 = turn_ratio_3
|
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)
|
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)
|
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
|
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]
|
flow_delay_infos = flow_delay_info_dict[xlink_id]
|
||||||
inroadid = flow_delay_infos[0].inroadid
|
inroadid = flow_delay_infos[0].inroadid
|
||||||
turn_type = flow_delay_infos[0].turn_type
|
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 \
|
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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
for flow_delay_info in flow_delay_infos:
|
for flow_delay_info in flow_delay_infos:
|
||||||
flow_sum_car_num += flow_delay_info.car_num
|
flow_sum_car_num += flow_delay_info.delay_info.car_num
|
||||||
flow_delay_time += flow_delay_info.delay_time * flow_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.stop_times * flow_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.queue_len * flow_delay_info.car_num
|
flow_queue_len += flow_delay_info.delay_info.queue_len * flow_delay_info.delay_info.car_num
|
||||||
flow_speed += flow_delay_info.speed * flow_delay_info.car_num
|
flow_travel_time += flow_delay_info.delay_info.travel_time * flow_delay_info.delay_info.car_num
|
||||||
flow_jam_index += flow_delay_info.jam_index * flow_delay_info.car_num
|
flow_speed += flow_delay_info.delay_info.speed * flow_delay_info.delay_info.car_num
|
||||||
flow_park_time += flow_delay_info.park_time * flow_delay_info.car_num
|
flow_jam_index += flow_delay_info.delay_info.jam_index * flow_delay_info.delay_info.car_num
|
||||||
flow_high_park_percent += flow_delay_info.high_park_percent * flow_delay_info.car_num
|
flow_park_time += flow_delay_info.delay_info.park_time * flow_delay_info.delay_info.car_num
|
||||||
flow_truck_percent += flow_delay_info.truck_percent * flow_delay_info.car_num
|
flow_high_park_percent += flow_delay_info.delay_info.high_park_percent * flow_delay_info.delay_info.car_num
|
||||||
flow_park_percent += flow_delay_info.park_percent * flow_delay_info.car_num
|
flow_truck_percent += flow_delay_info.delay_info.truck_percent * flow_delay_info.delay_info.car_num
|
||||||
flow_move_speed += flow_delay_info.move_speed * flow_delay_info.car_num
|
flow_park_percent += flow_delay_info.delay_info.park_percent * flow_delay_info.delay_info.car_num
|
||||||
# flow_imbalance_index += flow_delay_info.imbalance_index * flow_delay_info.car_num
|
flow_move_speed += flow_delay_info.delay_info.move_speed * flow_delay_info.delay_info.car_num
|
||||||
flow_std_flow += flow_delay_info.std_flow
|
# 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 = pb.xl_flow_delayinfo_t()
|
||||||
flow_info.xlink_id = xlink_id
|
flow_info.xlink_id = xlink_id
|
||||||
flow_info.inroadid = inroadid
|
flow_info.inroadid = inroadid
|
||||||
flow_info.turn_type = turn_type
|
flow_info.turn_type = turn_type
|
||||||
flow_info.car_num = flow_sum_car_num
|
flow_info.delay_info.car_num = flow_sum_car_num
|
||||||
flow_info.delay_time = flow_delay_time / flow_sum_car_num
|
flow_info.delay_info.delay_time = int(flow_delay_time / flow_sum_car_num)
|
||||||
flow_info.stop_times = flow_stop_times / flow_sum_car_num
|
flow_info.delay_info.stop_times = flow_stop_times / flow_sum_car_num
|
||||||
flow_info.queue_len = flow_queue_len / flow_sum_car_num
|
flow_info.delay_info.queue_len = int(flow_queue_len / flow_sum_car_num)
|
||||||
flow_info.speed = flow_speed / flow_sum_car_num
|
flow_info.delay_info.speed = int(flow_speed / flow_sum_car_num)
|
||||||
flow_info.jam_index = flow_jam_index / flow_sum_car_num
|
flow_info.delay_info.travel_time = int(flow_travel_time / flow_sum_car_num)
|
||||||
flow_info.park_time = flow_park_time / flow_sum_car_num
|
flow_info.delay_info.jam_index = flow_jam_index / flow_sum_car_num
|
||||||
flow_info.high_park_percent = flow_high_park_percent / flow_sum_car_num
|
flow_info.delay_info.park_time = int(flow_park_time / flow_sum_car_num)
|
||||||
flow_info.truck_percent = flow_truck_percent / flow_sum_car_num
|
flow_info.delay_info.high_park_percent = int(flow_high_park_percent / flow_sum_car_num)
|
||||||
flow_info.park_percent = flow_park_percent / flow_sum_car_num
|
flow_info.delay_info.truck_percent = int(flow_truck_percent / flow_sum_car_num)
|
||||||
flow_info.move_speed = flow_move_speed / flow_sum_car_num
|
flow_info.delay_info.park_percent = int(flow_park_percent / flow_sum_car_num)
|
||||||
# flow_info.imbalance_index = flow_imbalance_index / flow_sum_car_num
|
flow_info.delay_info.move_speed = int(flow_move_speed / flow_sum_car_num)
|
||||||
flow_info.std_flow = flow_std_flow / len(flow_delay_infos)
|
# 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:
|
for inroad_info in inroad_delay_pb_list:
|
||||||
if inroad_info.inroadid == inroadid:
|
if inroad_info.inroadid == inroadid:
|
||||||
inroad_info.flow_delay_infos.append(flow_info)
|
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 = {}
|
outroad_delay_info_dict = {}
|
||||||
|
|
||||||
for item in cross_delay_data_list:
|
for item in cross_delay_pb_list:
|
||||||
outroadid_infos = item.outroadInfos
|
outroadid_infos = item.outroad_infos
|
||||||
for outroadid_info in outroadid_infos:
|
for outroadid_info in outroadid_infos:
|
||||||
outroadid = outroadid_info.outroadid
|
outroadid = outroadid_info.outroadid
|
||||||
if outroadid not in outroad_delay_info_dict:
|
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):
|
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
|
crossid = avg_cross_delay_info.crossid
|
||||||
jam_index = round(avg_cross_delay_info.jam_index, 2)
|
jam_index = round(avg_cross_delay_info.delay_info.jam_index, 2)
|
||||||
stop_times = round(avg_cross_delay_info.stop_times, 2)
|
stop_times = round(avg_cross_delay_info.delay_info.stop_times, 2)
|
||||||
high_park_percent = str(round(avg_cross_delay_info.high_park_percent, 2)) + '%'
|
high_park_percent = str(avg_cross_delay_info.delay_info.high_park_percent) + '%'
|
||||||
imbanlance_index = round(avg_cross_delay_info.imbalance_index, 2)
|
imbanlance_index = round(avg_cross_delay_info.delay_info.imbalance_index, 2)
|
||||||
speed = round(avg_cross_delay_info.speed, 2) * 100
|
speed = avg_cross_delay_info.delay_info.speed / 100
|
||||||
move_speed = round(avg_cross_delay_info.move_speed, 2) * 100
|
move_speed = avg_cross_delay_info.delay_info.move_speed / 100
|
||||||
park_time = round(avg_cross_delay_info.park_time, 2)
|
park_time = avg_cross_delay_info.delay_info.park_time
|
||||||
delay_time = round(avg_cross_delay_info.delay_time, 2)
|
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)
|
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)
|
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]
|
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)
|
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)
|
service_level = calc_service_level(delay_time)
|
||||||
overview_res = {
|
overview_res = {
|
||||||
'jam_index': jam_index,
|
'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 = {}, [], []
|
src_dict, src_desc_list, main_flow_src_list = {}, [], []
|
||||||
for inroad_info in inroad_delay_infos:
|
for inroad_info in inroad_delay_infos:
|
||||||
inroadid = inroad_info.inroadid
|
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']]
|
src_dir = dir_str_dict[inroad_static_info_dict[inroadid]['src_direct']]
|
||||||
if inroad_car_num / car_num > 0.25:
|
if inroad_car_num / car_num > 0.25:
|
||||||
check_res = found_max_car_num_flow(inroad_car_num, inroad_info)
|
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
|
straight_left_split = 1
|
||||||
if roads[dir]['canaliza']['reverse_turn'] == 1:
|
if roads[dir]['canaliza']['reverse_turn'] == 1:
|
||||||
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
|
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
|
straight_turn_waiting_area = 1
|
||||||
if len(roads[dir]['canaliza']['reversible_lanes_info']) > 0:
|
if len(roads[dir]['canaliza']['reversible_lanes_info']) > 0:
|
||||||
reversible_lanes_info = 1
|
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]] = {
|
road_special_info[dir_str_dict[dir]] = {
|
||||||
'straight_left_split': straight_left_split,
|
'straight_left_split': straight_left_split,
|
||||||
'reverse_turn': reverse_turn,
|
'reverse_turn': reverse_turn,
|
||||||
'left_turn_waiting_area': left_turn_waiting_area,
|
'hold_left': left_turn_waiting_area,
|
||||||
'straight_turn_waiting_area': straight_turn_waiting_area,
|
'hold_straight': straight_turn_waiting_area,
|
||||||
'reversible_lanes_info': reversible_lanes_info,
|
'reversible_lanes_info': reversible_lanes_info,
|
||||||
'outside_left': outside_left
|
'outside_left': outside_left
|
||||||
}
|
}
|
||||||
|
|
@ -415,38 +435,38 @@ def gen_road_delay_index(avg_cross_delay_info, roads_dir_dict):
|
||||||
road_delay_infos = []
|
road_delay_infos = []
|
||||||
if not avg_cross_delay_info:
|
if not avg_cross_delay_info:
|
||||||
return road_delay_infos
|
return road_delay_infos
|
||||||
road_delay_infos = avg_cross_delay_info.inroad_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_dir = {v['in']: k for k, v in roads_dir_dict.items()}
|
||||||
road_flow_index = {}
|
road_flow_index = {}
|
||||||
for road_index in road_delay_infos:
|
for road_index in road_delay_infos:
|
||||||
roadid = road_index.inroadid
|
roadid = road_index.inroadid
|
||||||
if roadid not in road_dir.keys():
|
if roadid not in road_dir.keys():
|
||||||
continue
|
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] = {
|
road_flow_index[roadid] = {
|
||||||
'stop_times': round(road_delay_infos[road_index].delay_info.stop_times, 2),
|
'stop_times': round(road_index.delay_info.stop_times, 2),
|
||||||
'high_park_percent': str(round(road_delay_infos[road_index].delay_info.high_park_percent, 2)) + '%',
|
'high_park_percent': str(road_index.delay_info.high_park_percent) + '%',
|
||||||
'imbalance_index': round(road_delay_infos[road_index].delay_info.imbalance_index, 2),
|
'imbalance_index': round(road_index.delay_info.imbalance_index, 2),
|
||||||
'park_time': round(road_delay_infos[road_index].delay_info.park_time, 2),
|
'park_time': road_index.delay_info.park_time,
|
||||||
'delay_time': round(road_delay_infos[road_index].delay_info.delay_time, 2),
|
'delay_time': road_index.delay_info.delay_time,
|
||||||
'speed': round(road_delay_infos[road_index].delay_info.speed, 2),
|
'speed': road_index.delay_info.speed / 100,
|
||||||
'move_speed': round(road_delay_infos[road_index].delay_info.move_speed, 2),
|
'move_speed': road_index.delay_info.move_speed / 100,
|
||||||
'service_level': service_level,
|
'service_level': service_level,
|
||||||
'flow_delays': {}
|
'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:
|
for flow_delay_info in flow_delay_infos:
|
||||||
if flow_delay_info.turn_type not in (0, 1):
|
if flow_delay_info.turn_type not in (0, 1):
|
||||||
continue
|
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] = {
|
road_flow_index[roadid]['flow_delays'][flow_delay_info.turn_type] = {
|
||||||
'stop_times': round(flow_delay_info.delay_info.stop_times, 2),
|
'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)) + '%',
|
'high_park_percent': str(flow_delay_info.delay_info.high_park_percent) + '%',
|
||||||
'park_time': round(flow_delay_info.delay_info.park_time, 2),
|
'park_time': flow_delay_info.delay_info.park_time,
|
||||||
'delay_time': round(flow_delay_info.delay_info.delay_time, 2),
|
'delay_time': flow_delay_info.delay_info.delay_time,
|
||||||
'speed': round(flow_delay_info.delay_info.speed, 2),
|
'speed': flow_delay_info.delay_info.speed / 100,
|
||||||
'service_level': flow_service_level,
|
'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
|
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
|
max_stop_times, min_stop_times = 0, 99999
|
||||||
flow_delay_infos = item.flow_delay_infos
|
flow_delay_infos = item.flow_delay_infos
|
||||||
for flow_delay_info in flow_delay_infos:
|
for flow_delay_info in flow_delay_infos:
|
||||||
if flow_delay_info.stop_times > max_stop_times:
|
if flow_delay_info.delay_info.stop_times > max_stop_times:
|
||||||
max_stop_times = flow_delay_info.stop_times
|
max_stop_times = flow_delay_info.delay_info.stop_times
|
||||||
if flow_delay_info.stop_times < min_stop_times:
|
if flow_delay_info.delay_info.stop_times < min_stop_times:
|
||||||
min_stop_times = flow_delay_info.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)
|
imbalance_index = round((max_stop_times - min_stop_times) / avg_stop_times, 2)
|
||||||
item.delay_info.imbalance_index = imbalance_index
|
item.delay_info.imbalance_index = imbalance_index
|
||||||
return inroad_delay_pb_list
|
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}
|
road_delay_dict = {item.inroadid: item for item in road_delay_infos}
|
||||||
outroad_info_dict = {item.outroadid: item for item in outroad_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_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 = {}
|
road_flow_turn_rate = {}
|
||||||
for dir in roads_dir_dict.keys():
|
for dir in roads_dir_dict.keys():
|
||||||
roadid = roads_dir_dict[dir]['in']
|
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):
|
def gen_subtend_road_pair(roads_dir_dict):
|
||||||
subtend_road_pair = {}
|
subtend_road_pair = {}
|
||||||
tmp_road_dir = roads_dir_dict.deepcopy()
|
tmp_road_dir = copy.deepcopy(roads_dir_dict)
|
||||||
for dir in tmp_road_dir.keys():
|
keys_to_process = list(tmp_road_dir.keys())
|
||||||
if tmp_road_dir[dir]['in'] == '-':
|
for dir in keys_to_process:
|
||||||
|
if dir in tmp_road_dir.keys() and tmp_road_dir[dir]['in'] == '-':
|
||||||
continue
|
continue
|
||||||
subtend_dir = src_reverse[dir]
|
subtend_dir = src_reverse[dir]
|
||||||
if subtend_dir in tmp_road_dir.keys() and tmp_road_dir[subtend_dir]['in'] != '-':
|
if subtend_dir in tmp_road_dir.keys() and tmp_road_dir[subtend_dir]['in'] != '-':
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue