""" """ # 圆心点坐标字典 todo 关于入弯和出弯 是否是固定的 d1 = { 'LM.head': {'center': (11, 22), 'center_12': (11, 21), 'center_9': (11, 21), 'center_6': (11, 21)}, 'JK.head': {'center': (11, 22), 'center_12': (11, 21), 'center_9': (11, 21), 'center_6': (11, 21)}, 'HI.head': {'center': (11, 22), 'center_12': (11, 21), 'center_9': (11, 21), 'center_6': (11, 21)}, 'FG.head': {'center': (11, 22), 'center_12': (11, 21), 'center_9': (11, 21), 'center_6': (11, 21)}, 'DE.head': {'center': (11, 22), 'center_12': (11, 21), 'center_9': (11, 21), 'center_6': (11, 21)}, 'BC.head': {'center': (11, 22), 'center_12': (11, 21), 'center_9': (11, 21), 'center_6': (11, 21)}, 'A.head': {'center': (11, 22), 'center_12': (11, 21), 'center_9': (11, 21), 'center_6': (11, 21)}, 'LM.tail': {'center': (11, 22), 'center_12': (11, 21), 'center_3': (11, 21), 'center_6': (11, 21)}, 'JK.tail': {'center': (11, 22), 'center_12': (11, 21), 'center_3': (11, 21), 'center_6': (11, 21)}, 'HI.tail': {'center': (11, 22), 'center_12': (11, 21), 'center_3': (11, 21), 'center_6': (11, 21)}, 'FG.tail': {'center': (11, 22), 'center_12': (11, 21), 'center_3': (11, 21), 'center_6': (11, 21)}, 'DE.tail': {'center': (11, 22), 'center_12': (11, 21), 'center_3': (11, 21), 'center_6': (11, 21)}, 'BC.tail': {'center': (11, 22), 'center_12': (11, 21), 'center_3': (11, 21), 'center_6': (11, 21)}, 'A.tail': {'center': (11, 22), 'center_12': (11, 21), 'center_3': (11, 21), 'center_6': (11, 21)}, } # 倒渣口坐标字典 d2 = { 'dump.MN': {'dump': (11, 205.75)}, # 1号倒渣口 'dump.KL': {'dump': (11, 177.75)}, # 2号倒渣口 'dump.IJ': {'dump': (11, 149.75)}, # 3号倒渣口 'dump.GH': {'dump': (11, 121.75)}, # 4号倒渣口 'dump.EF': {'dump': (11, 93.75)}, # 5号倒渣口 'dump.CD': {'dump': (11, 65.75)}, # 6号倒渣口 'dump.AB': {'dump': (11, 37.75)}, # 7号倒渣口 } # 接渣口坐标字典 d3 = { 'load.1': {'load': (11, 22)}, 'load.2': {'load': (11, 22)}, 'load.3': {'load': (11, 22)}, } # 停车区坐标字典 d5 = { 'pack.1': {'x': 77, 'y': 44}, 'pack.2': {'x': 77, 'y': 44}, } # 渣罐坐标字典 d4 = { 'M.31': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.30': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.29': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.28': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.27': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.26': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.25': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.24': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.23': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.22': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.21': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.20': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.19': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.18': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.17': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.16': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.15': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.14': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.13': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.12': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.11': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.10': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.9': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.8': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.7': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.6': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.5': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.4': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.3': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.2': {'pot': (22, 33), 'road_center': (44, 55)}, 'M.1': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.31': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.30': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.29': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.28': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.27': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.26': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.25': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.24': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.23': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.22': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.21': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.20': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.19': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.18': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.17': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.16': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.15': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.14': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.13': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.12': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.11': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.10': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.9': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.8': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.7': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.6': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.5': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.4': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.3': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.2': {'pot': (22, 33), 'road_center': (44, 55)}, 'F.1': {'pot': (22, 33), 'road_center': (44, 55)}, } def get_nearest_point_from_road_center_point(x, y): """ 获取当前所在位置最接近的坐标位置 todo 判断是否是合理的范围,逻辑上移 offset = 11 # 允许范围(单位:米) """ x = float(x) y = float(y) min_distance = float('inf') # 初始值无穷大 for k, v in d4.items(): center_x = float(v.get('road_center')[0]) center_y = float(v.get('road_center')[1]) distance = ((center_x - x) ** 2 + (center_y - y) ** 2) ** (1 / 2) if distance < min_distance: min_distance = distance nearest_point = center_x, center_y return nearest_point def get_center_point_by_keyword(w1='N', w2='head'): """ 获取圆心点坐标 w1: 关键字 w2: 关键字 """ # d1 = todo 从json文件中获取 for k, v in d1.items(): k_s1, k_s2 = k.split('.') if w1 not in k_s1: continue if w2 not in k_s2: continue return dict(**v, **{'name': k}) def get_path_name_by_pot_name(pot_name='M.25'): """根据渣罐名获取道路名""" s1, s2 = pot_name.split('.') path_name_list = [ 'MN', 'KL', 'IJ', 'GH', 'EF', 'CD', 'AB', ] for s in path_name_list: if s1 in s: return s import json def test(s_direction='head', s_name='M.10', e_name='M.1'): """ s_direction: 起始方向 head 渣场方向 tail 围栏方向 s_name: 起始位置 e_name: 目标位置 """ # --- update d4 --- data = json.load(open('../data/渣罐坐标数据.json', 'r')) for item in data.get('pot_name|pot_x|pot_y|road_center_x|road_center_y'): pot_name, pot_x, pot_y, road_center_x, road_center_y = item.split('|') d4[pot_name] = { 'pot': (pot_x, pot_y), 'road_center': (road_center_x, road_center_y), } # --- test # x, y = get_nearest_point_from_road_center_point(x=112.5, y=27.25) # return x, y # --- check --- if s_direction not in ['head', 'tail']: return {'code': 1, 'data': []} # --- check --- if not s_name or not e_name: return {'code': 2, 'data': []} # --- prepare --- if 'dump' in s_name: s_point_item = dict(**d2.get(s_name), **{'name': s_name}) else: s_point_item = dict(**d4.get(s_name), **{'name': s_name}) # --- prepare --- if 'dump' in e_name: e_point_item = dict(**d2.get(e_name), **{'name': e_name}) else: e_point_item = dict(**d4.get(e_name), **{'name': e_name}) # --- check --- 判断是否是在正前方的情况1 if s_direction == 'head' and 'dump' not in s_name and 'dump' not in e_name: s_s1, s_s2 = s_name.split('.') e_s1, e_s2 = e_name.split('.') if s_s1 == e_s1 and int(e_s2) < int(s_s2): return {'code': 0, 'data': [s_point_item, e_point_item]} # --- check --- 判断是否是在正前方的情况2 if s_direction == 'tail' and 'dump' not in s_name and 'dump' not in e_name: s_s1, s_s2 = s_name.split('.') e_s1, e_s2 = e_name.split('.') if s_s1 == e_s1 and int(s_s2) < int(e_s2): return {'code': 0, 'data': [s_point_item, e_point_item]} # --- check --- head方向,向下行驶,并拐弯情况(共2个弯,1个出弯,1个入弯) if s_direction == 'head' and 'dump' not in s_name and 'dump' not in e_name: s_s1, s_s2 = s_name.split('.') e_s1, e_s2 = e_name.split('.') if s_s1 != e_s1: w1 = get_path_name_by_pot_name(s_name)[:1] # 第一位 center_point_item_1 = get_center_point_by_keyword(w1=w1, w2='head') w1 = get_path_name_by_pot_name(e_name)[-1:] # 最后位 center_point_item_2 = get_center_point_by_keyword(w1=w1, w2='head') return {'code': 0, 'data': [s_point_item, center_point_item_1, center_point_item_2, e_point_item]} # --- check --- head方向,向下行驶,从包位到倒渣口(共1个弯,1个出弯) if s_direction == 'head' and 'dump' not in s_name and 'dump' in e_name: pass # --- check --- head方向,向下行驶,从倒渣口到包位(共1个弯,1个入弯) if s_direction == 'head' and 'dump' in s_name and 'dump' not in e_name: pass # --- check --- tail方向,向上行驶,从倒渣口到包位(共1个弯,1个入弯) if s_direction == 'tail' and 'dump' in s_name and 'dump' not in e_name: pass # --- check --- tail方向,向上行驶,从倒渣口到包位(共1个弯,1个入弯) if s_direction == 'tail' and 'dump' in s_name and 'dump' not in e_name: pass if __name__ == '__main__': # --- test --- # 判断是否是在正前方的情况1 # out = test(s_direction='head', s_name='M.10', e_name='M.1') # 判断是否是在正前方的情况2 # out = test(s_direction='tail', s_name='M.12', e_name='M.20') # head方向,向下行驶,并拐弯情况(共2个弯,1个是出弯,1个是入弯) out = test(s_direction='head', s_name='M.12', e_name='F.20') print(out)