提交重新打开优化转向比展示为0的情况,优化转向比缺少某个箭头的算法
This commit is contained in:
parent
3d7ce9b532
commit
bf084b353f
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue