123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- """
- """
- # 圆心点坐标字典 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)
|