|  |  | 
 |  |  | package com.ruoyi.alarmpoints.well.service.impl; | 
 |  |  |  | 
 |  |  | import java.awt.geom.Point2D; | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.sql.*; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | 
 |  |  | import com.ruoyi.common.utils.bean.BeanValidators; | 
 |  |  | import com.ruoyi.common.utils.spring.SpringUtils; | 
 |  |  | import com.ruoyi.common.utils.uuid.IdUtils; | 
 |  |  | import com.ruoyi.device.camera.domain.ArdCameras; | 
 |  |  | import com.ruoyi.device.camera.mapper.ArdCamerasMapper; | 
 |  |  | import com.ruoyi.system.mapper.SysDeptMapper; | 
 |  |  | import com.ruoyi.utils.data.Query; | 
 |  |  | import com.ruoyi.utils.gis.GisUtil; | 
 |  |  | import com.ruoyi.utils.gps.GeoTools; | 
 |  |  | import lombok.ToString; | 
 |  |  | import org.slf4j.Logger; | 
 |  |  | import org.slf4j.LoggerFactory; | 
 |  |  | 
 |  |  |     private ArdAlarmpointsWellMapper ardAlarmpointsWellMapper; | 
 |  |  |     @Resource | 
 |  |  |     private ArdWellGuideCameraMapper ardWellGuideCameraMapper; | 
 |  |  |     @Resource | 
 |  |  |     private ArdCamerasMapper ardCamerasMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     protected Validator validator; | 
 |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<Map<String, Object>> getCameraVideoLable(Long deptId, String cameraId, Double p, Double t, Double fHorFieldAngle, Double fVerFieldAngle) { | 
 |  |  |         ArdCameras ardCameras = ardCamerasMapper.selectArdCamerasById(cameraId); | 
 |  |  |         //小三角形腰 | 
 |  |  |         Double xy = Math.tan(Math.PI/2 - (Math.PI * 2 - Math.PI * t/180) - Math.PI * fVerFieldAngle/180/2)*ardCameras.getAltitude()/Math.cos(Math.PI * fHorFieldAngle/180/2); | 
 |  |  |         //大三角形腰 | 
 |  |  |         Double dy = Math.tan(Math.PI/2 - (Math.PI * 2 - Math.PI * t/180) + Math.PI * fVerFieldAngle/180/2)*ardCameras.getAltitude()/Math.cos(Math.PI * fHorFieldAngle/180/2); | 
 |  |  |  | 
 |  |  |         if(dy < 0){ | 
 |  |  |             dy = -1 * dy; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if(xy < 0){ | 
 |  |  |             xy = -1 * xy; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Double lonA = ardCameras.getLongitude() + xy * Math.sin((p + fHorFieldAngle/2)* Math.PI / 180) * 180 / ( Math.PI * 6371229 * Math.cos(ardCameras.getLatitude() * Math.PI / 180)); | 
 |  |  |         Double latA = ardCameras.getLatitude() + xy * Math.cos((p + fHorFieldAngle/2)* Math.PI / 180) / ( Math.PI * 6371229 / 180); | 
 |  |  |  | 
 |  |  |         System.out.println("A点经度:" + lonA); | 
 |  |  |         System.out.println("A点纬度:" + latA); | 
 |  |  |  | 
 |  |  |         Double lonB = ardCameras.getLongitude() + xy * Math.sin((p - fHorFieldAngle/2)* Math.PI / 180) * 180 / ( Math.PI * 6371229 * Math.cos(ardCameras.getLatitude() * Math.PI / 180)); | 
 |  |  |         Double latB = ardCameras.getLatitude() + xy * Math.cos((p - fHorFieldAngle/2)* Math.PI / 180) / ( Math.PI * 6371229 / 180); | 
 |  |  |  | 
 |  |  |         System.out.println("B点经度:" + lonB); | 
 |  |  |         System.out.println("B点纬度:" + latB); | 
 |  |  |  | 
 |  |  |         Double lonC = ardCameras.getLongitude() + dy * Math.sin((p + fHorFieldAngle/2)* Math.PI / 180) * 180 / ( Math.PI * 6371229 * Math.cos(ardCameras.getLatitude() * Math.PI / 180)); | 
 |  |  |         Double latC = ardCameras.getLatitude() + dy * Math.cos((p + fHorFieldAngle/2)* Math.PI / 180) / ( Math.PI * 6371229 / 180); | 
 |  |  |  | 
 |  |  |         System.out.println("C点经度:" + lonC); | 
 |  |  |         System.out.println("C点纬度:" + latC); | 
 |  |  |  | 
 |  |  |         Double lonD = ardCameras.getLongitude() + dy * Math.sin((p - fHorFieldAngle/2)* Math.PI / 180) * 180 / ( Math.PI * 6371229 * Math.cos(ardCameras.getLatitude() * Math.PI / 180)); | 
 |  |  |         Double latD = ardCameras.getLatitude() + dy * Math.cos((p - fHorFieldAngle/2)* Math.PI / 180) / ( Math.PI * 6371229 / 180); | 
 |  |  |  | 
 |  |  |         System.out.println("D点经度:" + lonD); | 
 |  |  |         System.out.println("D点纬度:" + latD); | 
 |  |  |  | 
 |  |  |         Double dg = Math.tan(Math.PI/2 - (Math.PI * 2 - Math.PI * t/180) - Math.PI * fVerFieldAngle/180/2)*ardCameras.getAltitude();//大三角形高 | 
 |  |  |         Double xg = Math.tan(Math.PI/2 - (Math.PI * 2 - Math.PI * t/180) + Math.PI * fVerFieldAngle/180/2)*ardCameras.getAltitude();//小三角形高 | 
 |  |  |  | 
 |  |  |         if(dg < 0){ | 
 |  |  |             dg = -1 * dg; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if(xg < 0){ | 
 |  |  |             xg = -1 * xg; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Double mg = xg + 0.5 * (dg - xg); | 
 |  |  |  | 
 |  |  |         Double lonM = ardCameras.getLongitude() + mg * Math.sin(p * Math.PI / 180) * 180 / ( Math.PI * 6371229 * Math.cos(ardCameras.getLatitude() * Math.PI / 180)); | 
 |  |  |         Double latM = ardCameras.getLatitude() + mg * Math.cos(p * Math.PI / 180) / ( Math.PI * 6371229 / 180); | 
 |  |  |         System.out.println("中点经度:" + lonM); | 
 |  |  |         System.out.println("中点纬度:" + latM); | 
 |  |  |         //根据部门及光轴地面投影等腰梯形中点获取兴趣点 | 
 |  |  |         List<ArdAlarmpointsWell> ardAlarmpointsWellResult = ardAlarmpointsWellMapper.getArdAlarmpointsWellByDeptIdAndDistance(deptId, lonM, latM, lonA, latA, lonB, latB, lonC, latC, lonD, latD); | 
 |  |  |  | 
 |  |  |         //设置多边形 | 
 |  |  |         List<Point2D.Double> pts = new ArrayList<Point2D.Double>(); | 
 |  |  |         pts.add(new Point2D.Double(lonA, latA)); | 
 |  |  |         pts.add(new Point2D.Double(lonB, latB)); | 
 |  |  |         pts.add(new Point2D.Double(lonD, latD)); | 
 |  |  |         pts.add(new Point2D.Double(lonC, latC)); | 
 |  |  |  | 
 |  |  |         List<ArdAlarmpointsWell> innerList = new ArrayList();//查找多边形内兴趣点 | 
 |  |  |         for(ArdAlarmpointsWell ardAlarmpointsWell : ardAlarmpointsWellResult){ | 
 |  |  |             Point2D.Double point = new Point2D.Double(ardAlarmpointsWell.getLongitude(), ardAlarmpointsWell.getLatitude()); | 
 |  |  |             if(GeoTools.IsPtInPoly(point, pts)){ | 
 |  |  |                 innerList.add(ardAlarmpointsWell); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         List<Map<String,Object>> result = new ArrayList(); | 
 |  |  |         for(ArdAlarmpointsWell ardAlarmpointsWell : innerList){ | 
 |  |  |             Map<String,Object> map = new HashMap(); | 
 |  |  |             double distance_Target = RealDistance(ardCameras.getLongitude(),ardCameras.getLongitude(),ardAlarmpointsWell.getLongitude(), ardAlarmpointsWell.getLatitude()); | 
 |  |  |  | 
 |  |  |             double Angle_A = GetAngle(ardCameras.getLongitude(),ardCameras.getLongitude(),ardAlarmpointsWell.getLongitude(), ardAlarmpointsWell.getLatitude()); | 
 |  |  |             double Angle_E = Math.atan((ardCameras.getAltitude() - 0) / distance_Target) * 180 / Math.PI; | 
 |  |  |  | 
 |  |  |             Angle_A = Angle_A - (p - fHorFieldAngle/2);//视场角内方位 | 
 |  |  |  | 
 |  |  |             Angle_E = Angle_E - (360 - t - fVerFieldAngle/2);//视场角内俯仰 | 
 |  |  |  | 
 |  |  |             map.put("id",ardAlarmpointsWell.getId()); | 
 |  |  |             map.put("wellId",ardAlarmpointsWell.getWellId()); | 
 |  |  |             map.put("horFieldProportion",Angle_A/fHorFieldAngle);//横向占比 | 
 |  |  |             map.put("verFieldProportion",Angle_E/fVerFieldAngle);//纵向占比 | 
 |  |  |             result.add(map); | 
 |  |  |         } | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static double RealDistance(double base_pos_longitude,double base_pos_latitude,double tar_pos_longitude,double tar_pos_latitude){ | 
 |  |  |         double er; | 
 |  |  |         double f; | 
 |  |  |         double g; | 
 |  |  |         double l; | 
 |  |  |         double sg; | 
 |  |  |         double sl; | 
 |  |  |         double sf; | 
 |  |  |         double s; | 
 |  |  |         double c; | 
 |  |  |         double w; | 
 |  |  |         double r; | 
 |  |  |         double d; | 
 |  |  |         double h1; | 
 |  |  |         double h2; | 
 |  |  |         double fl; | 
 |  |  |  | 
 |  |  |         er = 6378.137; | 
 |  |  |         fl = 1 / 298.257; | 
 |  |  |         f = (base_pos_latitude + tar_pos_latitude)*Math.PI/360; | 
 |  |  |         g = (base_pos_latitude - tar_pos_latitude)*Math.PI/360; | 
 |  |  |         l = (base_pos_longitude - tar_pos_longitude)*Math.PI/360; | 
 |  |  |  | 
 |  |  |         sg = Math.sin(g); | 
 |  |  |         sl = Math.sin(l); | 
 |  |  |         sf = Math.sin(f); | 
 |  |  |  | 
 |  |  |         sg = Math.pow(sg,2); | 
 |  |  |         sl = Math.pow(sl,2); | 
 |  |  |         sf = Math.pow(sf,2); | 
 |  |  |  | 
 |  |  |         s = sg * (1 - sl) + (1 - sf) * sl; | 
 |  |  |         c = (1 - sg) * (1 - sl) + sf * sl; | 
 |  |  |  | 
 |  |  |         w = Math.atan(Math.sqrt(s / c)); | 
 |  |  |         r = Math.sqrt(s * c) / w; | 
 |  |  |         d = 2 * w * er; | 
 |  |  |         h1 = (3 * r - 1) / 2 / c; | 
 |  |  |         h2 = (3 * r + 1) / 2 / s; | 
 |  |  |  | 
 |  |  |         return 1000*d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg));//84 | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static double GetAngle(double base_pos_longitude,double base_pos_latitude,double tar_pos_longitude,double tar_pos_latitude){ | 
 |  |  |         double lat1 = base_pos_latitude * Math.PI / 180; | 
 |  |  |         double lon1 = base_pos_longitude * Math.PI / 180; | 
 |  |  |         double lat2 = tar_pos_latitude * Math.PI / 180; | 
 |  |  |         double lon2 = tar_pos_longitude * Math.PI / 180; | 
 |  |  |         double d = Math.sin(lat2)*Math.sin(lat1) + Math.cos(lat2)*Math.cos(lat1)*Math.cos(lon2 - lon1); | 
 |  |  |         if (d != 1){ | 
 |  |  |             d = Math.asin(Math.cos(lat2) * Math.sin(lon2 - lon1) / Math.sqrt(1 - d * d)); | 
 |  |  |             d = d * 180 / Math.PI; | 
 |  |  |         } | 
 |  |  |         else { | 
 |  |  |             d = 0; | 
 |  |  |         } | 
 |  |  |         if (lat1>lat2) { | 
 |  |  |             d = 180 - d; | 
 |  |  |         } | 
 |  |  |         else { | 
 |  |  |             if (lon1>lon2) { | 
 |  |  |                 d = 360 + d; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return d; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public int checkTable(String url, String username, String password, String tableName) throws ClassNotFoundException, SQLException { | 
 |  |  |         Connection connection = null; | 
 |  |  |  |