‘liusuyi’
2024-03-11 7dfd5f52332212d2f2c111cc11147469a68b7bdb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.ruoyi.alarm.radar.service.impl;
 
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.alarm.global.domain.GuidePoint;
import com.ruoyi.alarm.radar.domain.ArdAlarmRadar;
import com.ruoyi.alarm.radar.domain.RadarAlarmData;
import com.ruoyi.alarm.radar.service.ArdRadarService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.device.radar.mapper.ArdEquipRadarMapper;
import com.ruoyi.storage.minio.domain.jsonbean.JsonsRootBean;
import com.ruoyi.utils.gis.GisUtil;
import lombok.extern.slf4j.Slf4j;
import org.gavaghan.geodesy.GlobalCoordinates;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * @Description: 雷达业务
 * @ClassName: ArdRadarServiceImpl
 * @Author: 刘苏义
 * @Date: 2023年11月02日9:00:08
 **/
@Slf4j(topic = "guideQueue")
@Service
public class ArdRadarServiceImpl implements ArdRadarService {
    @Resource
    ICameraSdkService iCameraSdkService;
    @Resource
    ArdEquipRadarMapper ardEquipRadarMapper;
 
    /**
     * 异步执行强制引导
     * 刘苏义
     * 2023/11/2 9:00:55
     */
    @Override
    @Async
    public void forceGuide(String msg) {
        try {
            Map<String, Object> msgMap = JSONObject.parseObject(msg, Map.class);
            if (msgMap != null) {
                Double p = Double.parseDouble(msgMap.get("p").toString());
                Double t = Double.parseDouble(msgMap.get("t").toString());
                Long distance = Long.parseLong(msgMap.get("distance").toString());
                String radarId = msgMap.get("radarId").toString();
                //获取雷达所在塔上的大光电
                ArdCameras camera = ardEquipRadarMapper.getCameraByRadar(radarId);
                if (StringUtils.isNotNull(camera)) {
                    log.debug("获取到雷达塔上的光电:" + camera.getId());
                    //计算目标点坐标
                    GlobalCoordinates cameraCoordinates = new GlobalCoordinates(camera.getLatitude(), camera.getLongitude());
                    GlobalCoordinates targetCoordinates = GisUtil.getGlobalCoordinates(cameraCoordinates, p, distance);
                    //获取ptz
                    double[] cameraPoint = new double[]{ camera.getLongitude(), camera.getLatitude(),camera.getAltitude()};
                    double[] targetPoint = new double[]{targetCoordinates.getLongitude(), targetCoordinates.getLatitude()};
                    double[] cameraPTZ = GisUtil.getCameraPTZ(cameraPoint, targetPoint, 20, 150);
                    //如果雷达塔上有光电
                    CameraCmd cmd = new CameraCmd(camera.getId(), 1);
                    cmd.setOperator("sys_radar_force");
                    Map<String, Double> ptzMap = new HashMap<>();
                    ptzMap.put("p", p);
                    ptzMap.put("t", t);
                    ptzMap.put("z", cameraPTZ[2]);
                    cmd.setPtzMap(ptzMap);
                    iCameraSdkService.setPtz(cmd);
                } else {
                    log.debug("未获取到雷达塔上的光电");
                }
            }
        } catch (Exception ex) {
            log.error("强制引导异常:" + ex.getMessage());
        }
    }
    /**
     * 异步雷达追踪引导
     * 刘苏义
     * 2023/11/2 9:00:55
     */
    @Override
    @Async
    public void followGuide(String msg) {
        try {
            RadarAlarmData radarFollowData = JSONObject.parseObject(msg, RadarAlarmData.class);
            if (radarFollowData != null) {
                List<ArdAlarmRadar> ardFollowRadars = radarFollowData.getArdFollowRadars();
                if (ardFollowRadars.size()>0) {
                    //当每次上报只上报一个追踪信息,认为不太可能雷达扫描一次会跟踪多个目标
                    ArdAlarmRadar ardFollowRadar = ardFollowRadars.get(0);
                    String radarId = radarFollowData.getRadarId();//雷达id
                    //这里追踪的坐标为雷达经过计算上传的经纬度
                    Double longitude = ardFollowRadar.getLongitude();
                    Double latitude = ardFollowRadar.getLatitude();
                    GuidePoint guidePoint=new GuidePoint().setLongitude(longitude).setLatitude(latitude);
                    //获取雷达所在塔上的大光电
                    ArdCameras camera = ardEquipRadarMapper.getCameraByRadar(radarId);
                    if (StringUtils.isNotNull(camera)) {
                        log.debug("获取到雷达塔上的大光电:" + camera.getId());
                        //如果雷达塔上有光电,引导光电的1通道到追踪的坐标
                        CameraCmd cmd = new CameraCmd(camera.getId(), 1);
                        cmd.setOperator("sys_radar_follow");
                        cmd.setCameraId(camera.getId());
                        cmd.setChanNo(1);
                        cmd.setTargetPosition(new double[]{guidePoint.getLongitude(), guidePoint.getLatitude()});
                        boolean res = iCameraSdkService.guideTargetPosition(cmd);
                        if (res) {
                            log.debug("雷达追踪引导成功");
                        } else {
                            log.debug("雷达追踪引导失败");
                        }
                    } else {
                        log.debug("未获取到雷达塔上的大光电");
                    }
                }
            }
        } catch (Exception ex) {
            log.error("雷达追踪引导异常:" + ex.getMessage());
        }
    }
}