From bf084b353f0c8554d8f677e5a9a0ae47c9eeec14 Mon Sep 17 00:00:00 2001 From: wangxu <1318272526@qq.com> Date: Mon, 20 Apr 2026 11:25:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=87=8D=E6=96=B0=E6=89=93?= =?UTF-8?q?=E5=BC=80=E4=BC=98=E5=8C=96=E8=BD=AC=E5=90=91=E6=AF=94=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E4=B8=BA0=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BD=AC=E5=90=91=E6=AF=94=E7=BC=BA=E5=B0=91?= =?UTF-8?q?=E6=9F=90=E4=B8=AA=E7=AE=AD=E5=A4=B4=E7=9A=84=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/eva_common.py | 26 +++++++++++++------------- app/models.py | 22 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/app/eva_common.py b/app/eva_common.py index d6ee34b..8e19166 100644 --- a/app/eva_common.py +++ b/app/eva_common.py @@ -763,7 +763,7 @@ def gen_flow_turn_rate_index(avg_cross_delay_info, roads_dir_dict): outroad = g_roadnet.query_road(outroadid) if not outroad: 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: split_turns_set.add(0) 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) 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 - 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 # 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 = 100 - l_rate - s_rate + r_rate = max(1, 100 - l_rate - s_rate) if 0 not in split_turns_set: s_rate = '-' 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 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]) + 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 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'] if out_road_id != '-' and out_road_id in outroad_info_dict.keys(): 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) if not inroad: 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: merge_turns_set.add(0) 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_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 = 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 = 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 = 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: out_s_rate = '-' 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: 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 - # 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]) + 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 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] = { 'src_dir': dir, 'in_flow_rate': in_flow_rate, @@ -2277,7 +2277,7 @@ def _to_int_list(float_nums, mask): total = 0 for i in valid_indices: val = float_nums[i] - r = int(round(val)) + r = round(val) # 保证正数至少为1 if r == 0 and val > 0: r = 1 diff --git a/app/models.py b/app/models.py index 21b3254..c038de3 100644 --- a/app/models.py +++ b/app/models.py @@ -1504,7 +1504,7 @@ class RoadNet: turn_angle = abs(GeoFunc.radian2angle(GeoFunc.calc_turn_radian(pA, pB, pC, pD))) 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 = 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)) 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): """ 查询指定路口的属于直行关系的in-out路段ID pair