提交重新打开优化转向比展示为0的情况,优化转向比缺少某个箭头的算法

This commit is contained in:
wangxu 2026-04-20 11:25:13 +08:00
parent 3d7ce9b532
commit bf084b353f
2 changed files with 34 additions and 14 deletions

View File

@ -763,7 +763,7 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
outroad = g_roadnet.query_road(outroadid) outroad = g_roadnet.query_road(outroadid)
if not outroad: if not outroad:
continue continue
angle = g_roadnet.calc_road_turn_angle_without_abs(inroad_info, outroad) angle = g_roadnet.calc_road_turn_angle_without_abs_split(inroad_info, outroad)
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:
@ -774,12 +774,12 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
split_turns_set.add(1) split_turns_set.add(1)
car_num = road_delay_dict[roadid].delay_info.car_num car_num = road_delay_dict[roadid].delay_info.car_num
in_flow_rate = round(car_num / cross_sum_car_num * 100, 1) if cross_sum_car_num != 0 else 0 in_flow_rate = round(car_num / cross_sum_car_num * 100, 1) if cross_sum_car_num != 0 else 0
l_rate = round((road_delay_dict[roadid].delay_info.turn_ratio_1 + road_delay_dict[roadid].delay_info.turn_ratio_3) / car_num * 100) if car_num != 0 else 0 l_rate = max(1, round((road_delay_dict[roadid].delay_info.turn_ratio_1 + road_delay_dict[roadid].delay_info.turn_ratio_3)) / car_num * 100) if car_num != 0 else 0
# l_rate = max(1, round((road_delay_dict[roadid].delay_info.turn_ratio_1 + road_delay_dict[roadid].delay_info.turn_ratio_3) / car_num * 100)) if car_num != 0 else 0 # l_rate = max(1, round((road_delay_dict[roadid].delay_info.turn_ratio_1 + road_delay_dict[roadid].delay_info.turn_ratio_3) / 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(road_delay_dict[roadid].delay_info.turn_ratio_0 / car_num * 100)) if car_num != 0 else 0
s_rate = round(road_delay_dict[roadid].delay_info.turn_ratio_0 / 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 # 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 = 100 - l_rate - s_rate r_rate = max(1, 100 - l_rate - s_rate)
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:
@ -789,8 +789,8 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
l_num = road_delay_dict[roadid].delay_info.turn_ratio_1 l_num = road_delay_dict[roadid].delay_info.turn_ratio_1
s_num = road_delay_dict[roadid].delay_info.turn_ratio_0 s_num = road_delay_dict[roadid].delay_info.turn_ratio_0
r_num = road_delay_dict[roadid].delay_info.turn_ratio_2 r_num = road_delay_dict[roadid].delay_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 rate_list[0], rate_list[1] if rate_list[1] == '-' else rate_list[1], rate_list[2] if rate_list[2] == '-' else rate_list[2]
out_road_id = roads_dir_dict[dir]['out'] out_road_id = roads_dir_dict[dir]['out']
if out_road_id != '-' and out_road_id in outroad_info_dict.keys(): if out_road_id != '-' and out_road_id in outroad_info_dict.keys():
out_road_info = g_roadnet.query_road(out_road_id) out_road_info = g_roadnet.query_road(out_road_id)
@ -799,7 +799,7 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
inroad = g_roadnet.query_road(inroadid) inroad = g_roadnet.query_road(inroadid)
if not inroad: if not inroad:
continue continue
angle = g_roadnet.calc_road_turn_angle_without_abs(out_road_info, inroad) angle = g_roadnet.calc_road_turn_angle_without_abs_merge(out_road_info, inroad)
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:
@ -811,11 +811,11 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
out_car_num = outroad_info_dict[out_road_id].turn_info.car_num out_car_num = outroad_info_dict[out_road_id].turn_info.car_num
out_flow_rate = round(out_car_num / cross_out_sum_car_num * 100, 1) if cross_out_sum_car_num != 0 else 0 out_flow_rate = round(out_car_num / cross_out_sum_car_num * 100, 1) 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(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 = 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(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_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 = 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(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 # 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 = 100 - out_l_rate - out_s_rate out_r_rate = max(1, 100 - out_l_rate - out_s_rate)
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:
@ -823,8 +823,8 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict):
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 = 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) 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 rate_list[0], rate_list[1] if rate_list[1] == '-' else rate_list[1], rate_list[2] if rate_list[2] == '-' else rate_list[2]
road_flow_turn_rate[roadid] = { road_flow_turn_rate[roadid] = {
'src_dir': dir, 'src_dir': dir,
'in_flow_rate': in_flow_rate, 'in_flow_rate': in_flow_rate,
@ -2277,7 +2277,7 @@ def _to_int_list(float_nums, mask):
total = 0 total = 0
for i in valid_indices: for i in valid_indices:
val = float_nums[i] val = float_nums[i]
r = int(round(val)) r = round(val)
# 保证正数至少为1 # 保证正数至少为1
if r == 0 and val > 0: if r == 0 and val > 0:
r = 1 r = 1

View File

@ -1504,7 +1504,7 @@ class RoadNet:
turn_angle = abs(GeoFunc.radian2angle(GeoFunc.calc_turn_radian(pA, pB, pC, pD))) turn_angle = abs(GeoFunc.radian2angle(GeoFunc.calc_turn_radian(pA, pB, pC, pD)))
return turn_angle return turn_angle
def calc_road_turn_angle_without_abs(self, road_from: Road, road_to: Road): def calc_road_turn_angle_without_abs_split(self, road_from: Road, road_to: Road):
# pt0 = self.query_cross(road_from.crossid_from).location # pt0 = self.query_cross(road_from.crossid_from).location
# 第一个点,取一定距离的上游几何点 # 第一个点,取一定距离的上游几何点
pt0 = road_from.get_tail_up_pt() pt0 = road_from.get_tail_up_pt()
@ -1524,6 +1524,26 @@ class RoadNet:
# print('%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f => %.2f' % (pA.X,pA.Y, pB.X,pB.Y, pC.X,pC.Y, pD.X,pD.Y, turn_angle)) # print('%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f => %.2f' % (pA.X,pA.Y, pB.X,pB.Y, pC.X,pC.Y, pD.X,pD.Y, turn_angle))
return turn_angle return turn_angle
def calc_road_turn_angle_without_abs_merge(self, road_from: Road, road_to: Road):
# pt0 = self.query_cross(road_from.crossid_from).location
# 第一个点,取一定距离的上游几何点
pt0 = road_from.path[0]
# pt1 = self.query_cross(road_from.crossid_to).location
pt1 = road_from.path[-1]
# pt2 = self.query_cross(road_to.crossid_from).location
pt2 = road_to.path[-1]
# 最后一个点,取一定距离的下游几何点
pt3 = road_to.get_tail_up_pt()
# pt3 = self.query_cross(road_to.crossid_to).location
pA = MyPoint.makeOne(pt0)
pB = MyPoint.makeOne(pt1)
pC = MyPoint.makeOne(pt2)
pD = MyPoint.makeOne(pt3)
turn_angle = GeoFunc.radian2angle(GeoFunc.calc_turn_radian(pA, pB, pC, pD))
# print('%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f => %.2f' % (pA.X,pA.Y, pB.X,pB.Y, pC.X,pC.Y, pD.X,pD.Y, turn_angle))
return turn_angle
def get_straight_road_pairs(self, crossid: str = None, consider_sideway = False): def get_straight_road_pairs(self, crossid: str = None, consider_sideway = False):
""" """
查询指定路口的属于直行关系的in-out路段ID pair 查询指定路口的属于直行关系的in-out路段ID pair