‘liusuyi’
2024-03-07 38eaaa87743252da53851047bd15b089ccf9697b
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
@@ -1,25 +1,34 @@
package com.ruoyi.device.camera.service.impl;
import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell;
import com.ruoyi.alarmpoints.well.domain.ArdWellGuideCamera;
import com.ruoyi.alarmpoints.well.service.IArdAlarmpointsWellService;
import com.ruoyi.common.annotation.SdkOperate;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.Threads;
import com.ruoyi.common.utils.SecurityUtils;
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.IArdCamerasService;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.device.camera.factory.CameraSDK;
import com.ruoyi.device.camera.factory.CameraSDKFactory;
import com.ruoyi.device.noguidezone.domain.ArdCameraNoGuideZone;
import com.ruoyi.device.noguidezone.service.IArdCameraNoGuideZoneService;
import com.ruoyi.utils.gis.GisUtil;
import com.ruoyi.utils.gis.Point;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.utils.tools.ArdTool;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
@@ -30,37 +39,38 @@
 **/
@Service
@Slf4j(topic = "SDK")
public class CameraSdkServiceImpl implements ICameraSdkService {
public class CameraSdkServiceImpl implements ICameraSdkService, ApplicationRunner {
    @Resource
    private IArdCamerasService ardCamerasService;
    @Resource
    IHikClientService hikClientService;
    private RedisCache redisCache;
    @Resource
    IDhClientService dhClientService;
    private CameraSDKFactory cameraSDKFactory;
    @Resource
    RedisCache redisCache;
    private IArdAlarmpointsWellService ardAlarmpointsWellService;
    @Resource
    AsyncLogin asyncLogin;
    private IArdCameraNoGuideZoneService ardCameraNoGuideZoneService;
    //初始化SDK
    @PostConstruct
    /**
     * 启动线程方法,用于执行初始化登录相机的逻辑
     *
     * @param args 命令行参数
     */
    @Override
    public void loginAll() {
    public void run(ApplicationArguments args) {
        try {
            // 从ardCamerasService中获取ArdCameras列表
            List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(new ArdCameras());
            for (ArdCameras camera : ardCameras) {
                if ("1".equals(camera.getFactory())) {
                    asyncLogin.hikLogin(camera);
                } else if ("2".equals(camera.getFactory())) {
                    asyncLogin.dhLogin(camera);
                }
                login(camera);
            }
        } catch (Exception ex) {
            // 初始化登录相机异常,记录错误日志
            log.error("初始化登录相机异常:" + ex.getMessage());
        }
    }
    //登录
    @Override
@@ -69,13 +79,10 @@
        try {
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    asyncLogin.hikLogin(ardCamera);
                    result = true;
                } else if (factory.equals("2")) {
                    asyncLogin.dhLogin(ardCamera);
                    result = true;
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                //sdkStrategy.login(ardCamera);//同步登录
                cameraSDK.asyncLogin(ardCamera);//异步登录
                result = true;
            }
        } catch (Exception ex) {
            log.error("登录异常:" + ex.getMessage());
@@ -92,11 +99,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.logout(cameraId);
                } else if (factory.equals("2")) {
                    result = dhClientService.logout(cameraId);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.logout(cameraId);
            }
        } catch (Exception ex) {
            log.error("注销异常:" + ex.getMessage());
@@ -114,11 +118,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    onLine = hikClientService.isOnLine(cmd);
                } else if (factory.equals("2")) {
                    onLine = dhClientService.isOnLine(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                onLine = cameraSDK.isOnLine(cmd);
            }
            return onLine;
        } catch (Exception ex) {
@@ -128,25 +129,16 @@
    }
    //云台控制
    @SdkOperate
    @Override
    public boolean pTZControl(CameraCmd cmd) {
        try {
            boolean result = false;
            String cameraId = cmd.getCameraId();
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.pTZControlWithSpeed(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.pTZControl(cmd);
                }
            }
            return result;
        } catch (Exception ex) {
            log.error("ptz控制异常:" + ex.getMessage());
            return false;
    public AjaxResult pTZControl(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
        if (ardCamera != null) {
            String factory = ardCamera.getFactory();
            CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
            return cameraSDK.pTZControl(cmd);
        } else {
            return AjaxResult.error("摄像头不存在");
        }
    }
@@ -159,11 +151,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.setFocusPos(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setFocusPos(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.setFocusPos(cmd);
            }
        } catch (Exception ex) {
            log.error("设置聚焦值异常:" + ex.getMessage());
@@ -181,11 +170,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.getFocusPos(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.getFocusPos(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.getFocusPos(cmd);
            }
        } catch (Exception ex) {
            log.error("获取聚焦值异常:" + ex.getMessage());
@@ -202,11 +188,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.setPreset(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setPreset(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.setPreset(cmd);
            }
        } catch (Exception ex) {
            log.error("设置预置位异常:" + ex.getMessage());
@@ -223,11 +206,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.gotoPreset(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.gotoPreset(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.gotoPreset(cmd);
            }
        } catch (Exception ex) {
            log.error("调用预置位异常:" + ex.getMessage());
@@ -244,11 +224,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getVideoCompressionCfg(cmd);
                } else if (factory.equals("2")) {
                    map = dhClientService.getVideoCompressionCfg(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                map = cameraSDK.getVideoCompressionCfg(cmd);
            }
        } catch (Exception ex) {
            log.error("获取码流压缩参数异常:" + ex.getMessage());
@@ -265,11 +242,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlDefogcfg(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.controlDefogcfg(cmd);
            }
        } catch (Exception ex) {
            log.error("操控透雾异常:" + ex.getMessage());
@@ -286,11 +260,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlInfrarecfg(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.controlInfrarecfg(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.controlInfrarecfg(cmd);
            }
        } catch (Exception ex) {
            log.error("操控红外异常:" + ex.getMessage());
@@ -307,11 +278,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlFocusMode(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.controlFocusMode(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.controlFocusMode(cmd);
            }
        } catch (Exception ex) {
            log.error("操控聚焦模式异常:" + ex.getMessage());
@@ -328,11 +296,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.getFocusMode(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.getFocusMode(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.getFocusMode(cmd);
            }
        } catch (Exception ex) {
            log.error("获取聚焦模式异常:" + ex.getMessage());
@@ -349,11 +314,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlPTHeateRpwron(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.controlPTHeateRpwron(cmd);
            }
        } catch (Exception ex) {
            log.error("操控云台加热异常:" + ex.getMessage());
@@ -370,11 +332,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlCameraDeicing(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.controlCameraDeicing(cmd);
            }
        } catch (Exception ex) {
            log.error("操控云台加热异常:" + ex.getMessage());
@@ -391,11 +350,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.getPTZLockInfo(cmd);
                } else if (factory.equals("2")) {
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.getPTZLockInfo(cmd);
            }
        } catch (Exception ex) {
            log.error("获取云台锁定信息异常:" + ex.getMessage());
@@ -409,7 +365,6 @@
    }
    //抓图
    @SdkOperate
    @Override
    public String picCutCate(CameraCmd cmd) {
        String url = "";
@@ -421,13 +376,8 @@
            if (ardCamera != null) {
                //获取摄像头工厂
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    //调用hikClientService的picCutCate方法
                    url = hikClientService.picCutCate(cmd);
                } else if (factory.equals("2")) {
                    //调用dhClientService的picCutCate方法
                    url = dhClientService.picCutCate(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                url = cameraSDK.picCutCate(cmd);
            }
        } catch (Exception ex) {
            log.error("抓图异常:" + ex.getMessage());
@@ -444,10 +394,12 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getPtz(cmd);
                } else if (factory.equals("2")) {
                    map = dhClientService.getPtz(cmd);
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                String gdtype = ardCamera.getGdtype();
                if (gdtype.equals("1")) {
                    map = cameraSDK.getPtz(cmd);
                } else {
                    map = cameraSDK.getPtz1(cmd);
                }
            }
        } catch (Exception ex) {
@@ -465,11 +417,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getPtzScope(cmd);
                } else if (factory.equals("2")) {
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                map = cameraSDK.getPtzScope(cmd);
            }
        } catch (Exception ex) {
            log.error("获取ptz范围异常:" + ex.getMessage());
@@ -478,29 +427,31 @@
    }
    //设置ptz
    @SdkOperate
    @Override
    public boolean setPtz(CameraCmd cmd) {
        boolean result = false;
    public AjaxResult setPtz(CameraCmd cmd) {
        try {
            String cameraId = cmd.getCameraId();
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.setPtz(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setPtz(cmd);
                }
            if (ardCamera == null) {
                return AjaxResult.error("摄像头不存在");
            }
            CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(ardCamera.getFactory());
            String gdtype = ardCamera.getGdtype();
            if (gdtype.equals("1")) {
                //大光电使用高精度ptz设置
                return cameraSDK.setPtz(cmd);
            } else {
                return cameraSDK.setPtz1(cmd);
            }
        } catch (Exception ex) {
            log.error("设置ptz异常:" + ex.getMessage());
            AjaxResult.error("设置ptz异常:" + ex.getMessage());
        }
        return result;
        return AjaxResult.success();
    }
    //设置零方位角
    @SdkOperate
    @Override
    public boolean setZeroPtz(CameraCmd cmd) {
        boolean result = false;
@@ -509,11 +460,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.setZeroPtz(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setZeroPtz(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.setZeroPtz(cmd);
            }
        } catch (Exception ex) {
            log.error("设置零方位角异常:" + ex.getMessage());
@@ -522,7 +470,6 @@
    }
    //引导指向目标
    @SdkOperate
    @Override
    public boolean guideTargetPosition(CameraCmd cmd) {
        boolean result = false;
@@ -531,14 +478,181 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.guideTargetPosition(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.guideTargetPosition(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.guideTargetPosition(cmd);
            }
        } catch (Exception ex) {
            log.error("引导指向目标异常:" + ex.getMessage());
        }
        return result;
    }
    //引导指向井
    @Override
    public AjaxResult guideTargetWell(CameraCmd cmd) {
        //按日夜切换配置获取相机通道
        Integer chanNo = ArdTool.getChannelBydayNightTime(redisCache.getCacheObject("sys_config:dayNightTime"));
        cmd.setChanNo(chanNo);
        //获取井
        ArdAlarmpointsWell well = ardAlarmpointsWellService.selectArdAlarmpointsWellById(cmd.getWellId());
        if (well == null) {
            return AjaxResult.error("井不存在");
        }
        cmd.setTargetPosition(new double[]{well.getLongitude(), well.getLatitude()});
        //获取井配置的引导相机列表
        List<ArdWellGuideCamera> ardWellGuideCameraList = well.getArdWellGuideCameraList();
        if (ardWellGuideCameraList != null && ardWellGuideCameraList.size() > 0) {
            //获取相机和井的距离进行排序,取出最近的一个相机
            Map<String, Double> distanceMap = new HashMap<>();
            for (ArdWellGuideCamera ardWellGuideCamera : ardWellGuideCameraList) {
                ArdCameras cameras = ardCamerasService.selectArdCamerasById(ardWellGuideCamera.getCameraId());
                if (cameras == null) {
                    continue;
                }
                double[] targetPosition = new double[]{well.getLongitude(), well.getLatitude()};
                double[] camPosition = new double[]{cameras.getLongitude(), cameras.getLatitude()};
                double distance = GisUtil.getDistance(targetPosition, camPosition);
                distanceMap.put(ardWellGuideCamera.getCameraId(), distance);//存入缓存map
            }
            //从缓存里取出距离最近相机ID
            String cameraId = ArdTool.getKeyByMinValue(distanceMap);
            cmd.setCameraId(cameraId);
            //获取最近相机的对象
            Optional<ArdWellGuideCamera> first = ardWellGuideCameraList.stream().filter(s -> s.getCameraId().equals(cameraId)).findFirst();
            if (first.isPresent()) {
                ArdWellGuideCamera ardWellGuideCamera = first.get();
                Map<String, Double> ptzMap = null;
                //通过通道获取预置位
                switch (chanNo) {
                    case 1:
                        if (ardWellGuideCamera.getP1() != null) {
                            ptzMap = new HashMap<>();
                            ptzMap.put("p", ardWellGuideCamera.getP1());
                            ptzMap.put("t", ardWellGuideCamera.getT1());
                            ptzMap.put("z", ardWellGuideCamera.getZ1());
                        }
                        break;
                    case 2:
                        if (ardWellGuideCamera.getP2() != null) {
                            ptzMap = new HashMap<>();
                            ptzMap.put("p", ardWellGuideCamera.getP2());
                            ptzMap.put("t", ardWellGuideCamera.getT2());
                            ptzMap.put("z", ardWellGuideCamera.getZ2());
                        }
                        break;
                }
                //引导
                if (ptzMap != null) {
                    //使用ptz引导
                    cmd.setPtzMap(ptzMap);
                    return setPtz(cmd);
                }
            }
        }
        log.debug("未找到ptz引导相机,查找最近相机");
        //从附近相机找最近的一个相机
        String cameraId = getCameraByNear(new double[]{well.getLongitude(), well.getLatitude()});
        cmd.setCameraId(cameraId);
        if ("".equals(cameraId)) {
            return AjaxResult.error("未找到引导相机");
        }
        //判断禁引区
        if (isInPolygon(cameraId, new Double[]{well.getLongitude(), well.getLatitude()})) {
            return AjaxResult.error("井位置属于相机禁止引导区域");
        }
        //按井坐标开始引导
        if (!guideTargetPosition(cmd)) {
            return AjaxResult.error("井坐标引导失败", "cameraId:" + cameraId);
        }
        return AjaxResult.success("井坐标引导成功", "cameraId:" + cameraId);
    }
    /**
     * 获取最近距离的光电
     * 1-相机在线
     * 2-开启报警引导功能
     * 3-配置了最大可视距离
     */
    private String getCameraByNear(double[] targetPosition) {
        String minDistanceCameraId = "";
        try {
            //获取所有大光电
            List<Object> Objects = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY);
            //统计所有大光电可视范围内与报警点的距离
            Map<String, Double> distanceMap = new HashMap<>();
            for (Object obj : Objects) {
                ArdCameras camera = (ArdCameras) obj;
                if (!GlobalVariable.loginMap.containsKey(camera.getId())) {
                    log.debug("该光电未登录");
                    continue;
                }
                if (camera.getCamMaxVisibleDistance() == null) {
                    log.debug("该光电未配置最大可视距离");
                    continue;
                }
                if (camera.getCamAlarmGuideEnable().equals(0)) {
                    log.debug("该光电未开启报警引导");
                    continue;
                }
                double[] camPosition = new double[]{camera.getLongitude(), camera.getLatitude()};
                double distance = GisUtil.getDistance(targetPosition, camPosition);
                if (distance != 0.0 && distance <= camera.getCamMaxVisibleDistance()) {
                    distanceMap.put(camera.getId(), distance);
                    if (StringUtils.isNull(camera.getCamAlarmGuideEnable())) {
                        camera.setCamAlarmGuideEnable(0);
                    }
                }
            }
            if (distanceMap.size() > 0) {
                log.debug("尝试查找最近光电");
                //获取距离字典中最近的一个相机ID
                minDistanceCameraId = ArdTool.getKeyByMinValue(distanceMap);
                log.debug("查找到最近光电:" + minDistanceCameraId);
            }
        } catch (Exception ex) {
            log.error("获取附近开启报警引导功能光电异常:" + ex.getMessage());
        }
        return minDistanceCameraId;
    }
    //判断相机和引导位置是否在禁止引导区域
    public boolean isInPolygon(String cameraId, Double[] targetPosition) {
        boolean result = false;
        //拦截手动引导
        ArdCameraNoGuideZone ardCameraNoGuideZone = new ArdCameraNoGuideZone();
        ardCameraNoGuideZone.setCameraId(cameraId);
        ardCameraNoGuideZone.setEnabled("1");
        //获取当前相机的禁引可视域列表
        List<ArdCameraNoGuideZone> ardCameraNoGuideZones = ardCameraNoGuideZoneService.selectArdCameraNoGuideZoneList(ardCameraNoGuideZone);
        if (ardCameraNoGuideZones.size() > 0) {
            //获取到当前相机的坐标集合
            for (ArdCameraNoGuideZone zone : ardCameraNoGuideZones) {
                String[] parts = zone.getPoi().split(",");
                List<Point> pointList = new ArrayList<>();
                for (int i = 0; i < parts.length; i += 3) {
                    Point point = new Point();
                    point.setLongitude(Double.valueOf(parts[i]));
                    point.setLatitude(Double.valueOf(parts[i + 1]));
                    pointList.add(point);
                }
                double lon = targetPosition[0];
                double lat = targetPosition[1];
                Point targetPoint = new Point(lon, lat);
                //判断引导目标是否在坐标集合组成的多边形内
                boolean inPolygon = GisUtil.isInPolygon(targetPoint, pointList);
                if (inPolygon) {
                    result = inPolygon;
                }
            }
        }
        return result;
    }
@@ -587,7 +701,6 @@
        return true;
    }
    //录像
    @SdkOperate
    @Override
@@ -598,11 +711,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    url = hikClientService.record(cmd);
                } else if (factory.equals("2")) {
                    url = dhClientService.record(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                url = cameraSDK.record(cmd);
            }
        } catch (Exception ex) {
            log.error("录像异常:" + ex.getMessage());
@@ -619,11 +729,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.recordStart(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.recordStart(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.recordStart(cmd);
            }
        } catch (Exception ex) {
            log.error("开始录像异常:" + ex.getMessage());
@@ -640,11 +747,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    url = hikClientService.recordStopToMinio(cmd);
                } else if (factory.equals("2")) {
                    url = dhClientService.recordStopToMinio(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                url = cameraSDK.recordStopToMinio(cmd);
            }
        } catch (Exception ex) {
            log.error("停止录像异常:" + ex.getMessage());
@@ -661,11 +765,8 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.recordStopNotToMinio(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.recordStopNotToMinio(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                result = cameraSDK.recordStopNotToMinio(cmd);
            }
        } catch (Exception ex) {
            log.error("停止录像异常:" + ex.getMessage());
@@ -682,17 +783,13 @@
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getGisInfo(cmd);
                } else if (factory.equals("2")) {
                    map = dhClientService.getGisInfo(cmd);
                }
                CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(factory);
                map = cameraSDK.getGisInfo(cmd);
            }
        } catch (Exception ex) {
            log.error("获取相机架设参数异常:" + ex.getMessage());
        }
        return map;
    }
}