| | |
| | | import org.eclipse.paho.client.mqttv3.MqttException; |
| | | |
| | | import java.awt.geom.Point2D; |
| | | import java.math.BigDecimal; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | |
| | | ((ArdSyCarDayServiceImpl)SpringUtils.getBean("ardSyCarDayServiceImpl")).insertArdSyCarDay(carId);//新增车辆上报时间 |
| | | Map<String,Object> result = ((ArdSyCarServiceImpl)SpringUtils.getBean("ardSyCarServiceImpl")).getArdSyCarAndDeptByCarId(carId);//查询车辆及部门 |
| | | if(result != null){ |
| | | // if("30".equals(carId)){ |
| | | //清淤开始---------- |
| | | //清淤开始---------- |
| | | try{ |
| | | String lng = (String) gpsMap.get("lng").toString();//获取经度 |
| | | String lat = (String) gpsMap.get("lat").toString();//获取纬度 |
| | | String carName = (String) gpsMap.get("carName");//获取车牌号 |
| | |
| | | //无锁 |
| | | rtuType = false; |
| | | } |
| | | // log.debug("定位数据:车辆carId:"+carId+"经度lng:"+lng+"纬度lat:"+lat); |
| | | // log.debug("定位数据:车辆carId:"+carId+"经度lng:"+lng+"纬度lat:"+lat); |
| | | //定义2维空间 |
| | | Point2D.Double point = new Point2D.Double(Double.parseDouble(lng), Double.parseDouble(lat)); |
| | | List<Point2D.Double> pts = new ArrayList<Point2D.Double>(); |
| | |
| | | } |
| | | } |
| | | //车辆有值优先判断是否为手动添加车辆 |
| | | if(ardAccessFence.getIsAlarm()==1){ |
| | | //1为手动添加车辆无需报警信息,更新位置即可 |
| | | ardAccessFence.setLng(lng); |
| | | ardAccessFence.setLat(lat); |
| | | ardAccessFenceService.updAccess(ardAccessFence); |
| | | }else if(ardAccessFence.getIsAlarm() == 2){ |
| | | //2为手动添加报警车辆有报警,所在围栏名称赋null,排查报警信息,只需处理路上情况 |
| | | ardAccessFence.setNowWallName(null); |
| | | //如果在路上判断坐标是否与上次一样 |
| | | if(ardAccessFence.getLng().equals(lng) && ardAccessFence.getLat().equals(lat)){ |
| | | if(timeType){ |
| | | Date nowTime = sdf.parse(time); |
| | | Date lastTime = sdf.parse(ardAccessFence.getLastTime()); |
| | | Long diff = (nowTime.getTime() - lastTime.getTime())/1000; |
| | | ArdAccessNum list = accessNumService.queryNum(); |
| | | if(list!=null){ |
| | | int alarm = list.getAlarm(); |
| | | if(diff>=alarm){ |
| | | //报警字段为1提示报警 |
| | | ardAccessFence.setIsWarning(1); |
| | | ardAccessFence.setAlarmLat(lat); |
| | | ardAccessFence.setAlarmLng(lng); |
| | | ardAccessFenceService.updAccess(ardAccessFence); |
| | | } |
| | | } |
| | | }else { |
| | | log.debug(carId+"号车定位时间为空"); |
| | | } |
| | | }else { |
| | | //如果不一样更新坐标 |
| | | ardAccessFence.setLat(lat); |
| | | ardAccessFence.setLng(lng); |
| | | ardAccessFence.setLastTime(time); |
| | | ardAccessFenceService.updAccess(ardAccessFence); |
| | | } |
| | | }else if(ardAccessFence.getIsAlarm() == 0 || ardAccessFence.getIsAlarm() == null){ |
| | | if(ardAccessFence.getIsAlarm() == 0 || ardAccessFence.getIsAlarm() == null){ |
| | | //车辆非手动添加数据,判断是否有进入围栏ID |
| | | if(ardAccessFence.getIntoShipmentId()==null){ |
| | | //没有进入装油点,赋值经纬度 |
| | |
| | | } |
| | | } |
| | | } |
| | | }else |
| | | if(ardAccessFence.getIsAlarm()==1){ |
| | | //1为手动添加车辆无需报警信息,更新位置即可 |
| | | ardAccessFence.setLng(lng); |
| | | ardAccessFence.setLat(lat); |
| | | ardAccessFenceService.updAccess(ardAccessFence); |
| | | }else if(ardAccessFence.getIsAlarm() == 2){ |
| | | //2为手动添加报警车辆有报警,所在围栏名称赋null,排查报警信息,只需处理路上情况 |
| | | ardAccessFence.setNowWallName(null); |
| | | //如果在路上判断坐标是否与上次一样 |
| | | if(ardAccessFence.getLng().equals(lng) && ardAccessFence.getLat().equals(lat)){ |
| | | if(timeType){ |
| | | Date nowTime = sdf.parse(time); |
| | | Date lastTime = sdf.parse(ardAccessFence.getLastTime()); |
| | | Long diff = (nowTime.getTime() - lastTime.getTime())/1000; |
| | | ArdAccessNum list = accessNumService.queryNum(); |
| | | if(list!=null){ |
| | | int alarm = list.getAlarm(); |
| | | if(diff>=alarm){ |
| | | //报警字段为1提示报警 |
| | | ardAccessFence.setIsWarning(1); |
| | | ardAccessFence.setAlarmLat(lat); |
| | | ardAccessFence.setAlarmLng(lng); |
| | | ardAccessFenceService.updAccess(ardAccessFence); |
| | | } |
| | | } |
| | | }else { |
| | | log.debug(carId+"号车定位时间为空"); |
| | | } |
| | | }else { |
| | | //如果不一样更新坐标 |
| | | ardAccessFence.setLat(lat); |
| | | ardAccessFence.setLng(lng); |
| | | ardAccessFence.setLastTime(time); |
| | | ardAccessFenceService.updAccess(ardAccessFence); |
| | | } |
| | | } |
| | | // } |
| | | } |
| | | //清淤结束------------ |
| | | }catch(Exception e){ |
| | | |
| | | } |
| | | //清淤结束------------ |
| | | |
| | | gpsMap.putAll(result); |
| | | String ancestors = (String) gpsMap.get("ancestors");//获取父级部门 |
| | |
| | | PositionContainer.getDeptPositionMap().put(deptIdp,deptMapp); |
| | | }else{ |
| | | deptMapp.put((String)gpsMap.get("carId"),gpsMap); |
| | | } |
| | | } |
| | | } |
| | | //若有用户需要追踪车辆,则计算预估位置 |
| | | if(PositionContainer.getUserPositionMap().size() != 0){ |
| | | for(String userId : PositionContainer.getUserPositionMap().keySet()){ |
| | | Map<String,Map<String,Object>> carIdCarMap = PositionContainer.getUserPositionMap().get(userId); |
| | | if(carIdCarMap != null){ |
| | | if(carIdCarMap.keySet().contains(carId)){ |
| | | if(PositionContainer.getCarPositionMap().get(carId) == null){ |
| | | gpsMap.put("elng",gpsMap.get("lng")); |
| | | gpsMap.put("elat",gpsMap.get("lat")); |
| | | }else{ |
| | | Double velocityOld = ((Integer) PositionContainer.getCarPositionMap().get(carId).get("speed")).doubleValue(); |
| | | Double velocityNew = ((Integer) gpsMap.get("speed")).doubleValue(); |
| | | Double acceleration = Double.valueOf(1000*(velocityNew - velocityOld)/3600); |
| | | Double distance = getDistance(velocityNew, acceleration ,"1.5"); |
| | | Double[] eposition = azimuth_offset(((BigDecimal)gpsMap.get("lng")).doubleValue(),((BigDecimal)gpsMap.get("lat")).doubleValue(),(Integer)gpsMap.get("drct"),distance); |
| | | gpsMap.put("elng",eposition[0]); |
| | | gpsMap.put("elat",eposition[1]); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | public Double[] azimuth_offset(double origin_lon, double origin_lat, Integer direction,double distance){ |
| | | Double[] lonlat = new Double[2]; |
| | | if(direction != null && distance > 0){ |
| | | lonlat[0] = origin_lon + distance * Math.sin(direction* Math.PI / 180) * 180 / ( Math.PI * 6371229 * Math.cos(origin_lat * Math.PI / 180)); |
| | | lonlat[1] = origin_lat + distance * Math.cos(direction* Math.PI / 180) / ( Math.PI * 6371229 / 180); |
| | | }else{ |
| | | lonlat[0] = origin_lon; |
| | | lonlat[1] = origin_lat; |
| | | } |
| | | return lonlat; |
| | | } |
| | | |
| | | public Double getDistance(Double velocity ,Double acceleration ,String time){ |
| | | Double distance = velocity*Double.parseDouble(time) + 0.5*acceleration*Double.parseDouble(time)*Double.parseDouble(time); |
| | | return distance; |
| | | } |
| | | |
| | | /*public Double getVelocity(Double velocity ,Double acceleration ,String time){ |
| | | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | Long t = (long) 0; |
| | | try { |
| | | t = (new Date().getTime() - simpleDateFormat.parse(time).getTime())/1000; |
| | | } catch (Exception e) { |
| | | // TODO Auto-generated catch block |
| | | e.printStackTrace(); |
| | | } |
| | | Double velocityt = velocity + acceleration*t; |
| | | return velocityt; |
| | | }*/ |
| | | |
| | | } |