From e745dd38c5a413eaa000c7c5434621fbcd1800d5 Mon Sep 17 00:00:00 2001 From: 于紫祥_1901 <email@yuzixiang_1910> Date: Wed, 23 Dec 2020 13:55:07 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/main/resources/mapper/HistoryFiveMinutelyMapper.xml | 15 src/main/java/com/moral/controller/DeviceController.java | 4 src/main/java/com/moral/util/WindUtils.java | 58 + src/main/webapp/view/cartrajectoryNew.jsp | 566 ++++++++++++++++++++ src/main/java/com/moral/service/HistoryFiveMinutelyService.java | 2 src/main/java/com/moral/service/impl/HistoryFiveMinutelyServiceImpl.java | 6 src/main/webapp/view/unorganizedMapV2.jsp | 209 +++++++ src/main/java/com/moral/controller/AlarmController.java | 4 src/main/java/com/moral/mapper/HistoryFiveMinutelyMapper.java | 2 src/main/java/com/moral/service/impl/HistoryServiceImpl.java | 14 src/main/java/com/moral/config/WebSocketConfig.java | 3 src/main/webapp/img/sensorLevel.png | 0 src/main/java/com/moral/controller/ScreenController.java | 615 +++++++++++++++------ src/main/java/com/moral/webSocketServer/BSAQIWebSocketServerTest.java | 173 ++++++ 14 files changed, 1,452 insertions(+), 219 deletions(-) diff --git a/src/main/java/com/moral/config/WebSocketConfig.java b/src/main/java/com/moral/config/WebSocketConfig.java index 5ea4e3d..5bb5e61 100644 --- a/src/main/java/com/moral/config/WebSocketConfig.java +++ b/src/main/java/com/moral/config/WebSocketConfig.java @@ -33,6 +33,7 @@ WebSocketServerNew.deviceService=deviceService; BSWebsocketServer.deviceService=deviceService; BSAQIWebSocketServer.deviceService=deviceService; + BSAQIWebSocketServerTest.deviceService=deviceService; } @Autowired public void setMessageService(AccountService accountService){ @@ -43,6 +44,8 @@ BSWebsocketServer.sensorService=sensorService; BSAQIWebSocketServer.sensorService=sensorService; ElectronicSWebSocketServer.sensorService=sensorService; + BSAQIWebSocketServerTest.sensorService=sensorService; + ElectronicSWebSocketServer.sensorService=sensorService; } @Autowired public void setSensorUnitService( SensorUnitService sensorUnitService){ diff --git a/src/main/java/com/moral/controller/AlarmController.java b/src/main/java/com/moral/controller/AlarmController.java index bb5a793..3f9b7d3 100644 --- a/src/main/java/com/moral/controller/AlarmController.java +++ b/src/main/java/com/moral/controller/AlarmController.java @@ -35,8 +35,8 @@ AlarmConfigService alarmConfigService; @Resource AlarmService alarmService; - @RequestMapping(value = "/count-by-times", method = RequestMethod.GET) +/* @RequestMapping(value = "/count-by-times", method = RequestMethod.GET) public ResultBean<List<Map>> countByTimes(Date start, Date end,@RequestParam(value = "timeUnits")Optional<TimeUnits> timeUnits) throws ParseException { return new ResultBean<>(alarmService.countByTimes(start,end,timeUnits.isPresent()?timeUnits.get():null)); - } + }*/ } diff --git a/src/main/java/com/moral/controller/DeviceController.java b/src/main/java/com/moral/controller/DeviceController.java index d02ddd8..9c27858 100644 --- a/src/main/java/com/moral/controller/DeviceController.java +++ b/src/main/java/com/moral/controller/DeviceController.java @@ -37,10 +37,10 @@ public ResultBean<Integer> countByExample(PageBean pageBean){ return new ResultBean<Integer>(deviceService.countByExample(pageBean)); } - @GetMapping("count-by-times") +/* @GetMapping("count-by-times") public ResultBean<List<Map>> countByTimes(Date start, Date end){ return new ResultBean<List<Map>>(deviceService.countByTimes(start,end,"%Y-%m")); - } + }*/ @GetMapping("page-list") public PageBean pageList(PageBean pageBean) { return deviceService.queryByPageBean(pageBean); diff --git a/src/main/java/com/moral/controller/ScreenController.java b/src/main/java/com/moral/controller/ScreenController.java index 34b7118..e34c786 100644 --- a/src/main/java/com/moral/controller/ScreenController.java +++ b/src/main/java/com/moral/controller/ScreenController.java @@ -180,6 +180,12 @@ @Resource private DeviceAdjustValueTimingService deviceAdjustValueTimingService; + @Resource + private PollutioSourcePointService pollutioSourcePointService; + + @Resource + private HistoryFiveMinutelyService historyFiveMinutelyService; + /** * Screen login. ������������ * @@ -708,7 +714,7 @@ ParameterUtils.getTimeType4Time(parameters); String time1 = (String) parameters.get("time"); time1 = time1.replaceAll(" ", ""); - parameters.put("time",time1); + parameters.put("time", time1); String mac1 = (String) parameters.get("mac"); List<Map<String, Object>> list = null; @@ -720,32 +726,39 @@ parameters.put("sensors", Arrays.asList(sensorKey)); // monitorPointService.isCompensateCalculation(parameters); list = historyMinutelyService.getMonitorPointOrDeviceAvgData(parameters); - - /* 0���������������������11������������0���������������������1-24������������������������0������������������������������������24������������ ������������������24���������������23-24���������24������������������������0��������������� */ /*������������start-------------------------------------------------------------------------*/ - list.remove(0); - //if (list.size() == 23) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd"); - //���������������������yyyy-MM-dd HH:mm:ss - time1 = time1 + " 00:00:00"; - Date date = sdf.parse(time1); - date = DateUtil.rollDay(date, 1); - //������������������������ - String time2 = sdf2.format(date); - parameters.put("time", time2); - /*���������������0������������������24���������������������������*/ - List<Map<String, Object>> nextDayList = historyMinutelyService.getMonitorPointOrDeviceAvgData(parameters); - if(!ObjectUtils.isEmpty(nextDayList)){ - time1=time1.replaceAll(" 00:00:00"," 24"); - Map<String, Object> datas = nextDayList.get(0); - datas.put("time",time1); - list.add(datas); + Iterator<Map<String, Object>> iterator = list.iterator(); + while (iterator.hasNext()) { + Map<String, Object> next = iterator.next(); + String hour = next.get("time").toString().substring(11, 13); + if ("00".equals(hour)) { + iterator.remove(); } - //} + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd"); + //���������������������yyyy-MM-dd HH:mm:ss + time1 = time1 + " 00:00:00"; + Date date = sdf.parse(time1); + date = DateUtil.rollDay(date, 1); + //������������������������ + String time2 = sdf2.format(date); + parameters.put("time", time2); + /*���������������0������������������24���������������������������*/ + List<Map<String, Object>> nextDayList = historyMinutelyService.getMonitorPointOrDeviceAvgData(parameters); + if (!ObjectUtils.isEmpty(nextDayList)) { + time1 = time1.replaceAll(" 00:00:00", " 24"); + for (Map<String, Object> map : nextDayList) { + String time = map.get("time").toString().substring(11, 13); + if("00".equals(time)){ + map.put("time", time1); + list.add(map); + } + } + } /*������������end-------------------------------------------------------------------------*/ @@ -1499,7 +1512,7 @@ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime timeLocalDateTime = LocalDateTime.parse(time, dateTimeFormatter); int month = timeLocalDateTime.getMonth().getValue(); - parameters.put("yearAndDay",yearAndDay); + parameters.put("yearAndDay", yearAndDay); Point dirPoint = historyHourlyService.getDirPoint(parameters); Map<String, Object> getPollutionSourceData = historyHourlyService.getPollutionSourceDataByHour(parameters); if (MapUtils.isEmpty(getPollutionSourceData)) { @@ -1609,6 +1622,50 @@ //System.out.println(paramsJson); model.addObject("carTrajectoryParams", paramsJson); model.setViewName("cartrajectory"); + return model; + } else { + StringBuilder msg = new StringBuilder(); + msg.append(" param[0] mac:"); + msg.append(mac); + log.warn(msg); + model.setViewName("403"); + return model; + } + } + + @GetMapping("/carTrajectoryNew") + @ApiOperation(value = "���������������������", notes = "���������������������") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "mac", value = "������mac������������p5dnd7a0392081���", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "startTime", value = "������������(���������2020-03-19-14)", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "������������(���������2020-03-19-17)", required = true, paramType = "query", dataType = "String") + }) + public ModelAndView carTrajectoryNew(ModelAndView model, HttpServletRequest request) throws Exception { + Map<String, Object> parameters = WebUtils.getParametersStartingWith(request, null); + String st = parameters.get("startTime").toString(); + String startYearAndDay = st.substring(0, st.lastIndexOf("-")); + String startHour = st.substring(st.lastIndexOf("-") + 1); + String startTime = startYearAndDay + " " + startHour + ":00:00"; + String et = parameters.get("endTime").toString(); + String endYearAndDay = et.substring(0, st.lastIndexOf("-")); + String endHour = et.substring(et.lastIndexOf("-") + 1); + String endTime = endYearAndDay + " " + endHour + ":00:00"; + parameters.put("startTime", startTime); + parameters.put("endTime", endTime); + String mac = parameters.get("mac").toString(); + if (mac != null && mac.length() != 0) { + List<List<Map<String, Object>>> sensorData = historyService.getCarSensorData(parameters); + Map<String, String> sensorsMap = sensorService.getSensorsMap(parameters); + List<Map<String, Object>> sensorList = new ArrayList<>(); + if (sensorData.size() == 3) { + sensorList = sensorData.get(0); + } + JSONObject params = new JSONObject(); + params.put("sensorInfo", sensorList); + params.put("sensorsMap", sensorsMap); + String paramsJson = params.toJSONString(); + model.addObject("carTrajectoryParams", paramsJson); + model.setViewName("cartrajectoryNew"); return model; } else { StringBuilder msg = new StringBuilder(); @@ -2111,9 +2168,9 @@ @ApiImplicitParam(name = "time", value = "������(���������2020-03-19)", required = true, paramType = "query", dataType = "String")}) public ResultBean<List<Map<String, Object>>> getWeatherNextDayDataByRegion(HttpServletRequest request) throws Exception { Map<String, Object> parameters = getParametersStartingWith(request, null); - List<String> sensorKeys=new ArrayList<>(); + List<String> sensorKeys = new ArrayList<>(); sensorKeys.add("e15"); - parameters.put("sensorKeys",sensorKeys); + parameters.put("sensorKeys", sensorKeys); List<Map<String, Object>> resultList = weatherService.getForecastAndReal(parameters); return new ResultBean<List<Map<String, Object>>>(resultList); } @@ -2126,10 +2183,10 @@ @ApiImplicitParam(name = "time", value = "������(���������2020-03-19)", required = true, paramType = "query", dataType = "String")}) public ResultBean<List<Map<String, Object>>> getForecastAndRealPM(HttpServletRequest request) throws Exception { Map<String, Object> parameters = getParametersStartingWith(request, null); - List<String> sensorKeys=new ArrayList<>(); + List<String> sensorKeys = new ArrayList<>(); sensorKeys.add("e1"); sensorKeys.add("e2"); - parameters.put("sensorKeys",sensorKeys); + parameters.put("sensorKeys", sensorKeys); List<Map<String, Object>> resultList = weatherService.getForecastAndReal(parameters); return new ResultBean<List<Map<String, Object>>>(resultList); } @@ -2635,26 +2692,26 @@ }*/ @PostMapping("insertAdjustValue") - public int insertAdjustValue(@RequestBody HashMap map){ - try{ + public int insertAdjustValue(@RequestBody HashMap map) { + try { int device_id = Integer.parseInt(map.get("id").toString()); String time = map.get("time").toString(); String[] arr = time.split(":"); - int seconds = Integer.parseInt(arr[0])*3600+Integer.parseInt(arr[1])*60+Integer.parseInt(arr[2]); + int seconds = Integer.parseInt(arr[0]) * 3600 + Integer.parseInt(arr[1]) * 60 + Integer.parseInt(arr[2]); //String t = URLEncoder.encode(������,"UTF-8") List list = (List) map.get("dataArray"); - String val=""; - for (int i = 0; i <list.size() ; i++) { - if (i==0){ - val=val+list.get(i); - }else { - val=val+","+list.get(i); + String val = ""; + for (int i = 0; i < list.size(); i++) { + if (i == 0) { + val = val + list.get(i); + } else { + val = val + "," + list.get(i); } } - String value = "{"+val+"}"; - deviceAdjustValueTimingService.insertData(device_id,seconds,value); + String value = "{" + val + "}"; + deviceAdjustValueTimingService.insertData(device_id, seconds, value); return 1; - }catch (Exception e){ + } catch (Exception e) { log.warn(e); } return 0; @@ -2662,34 +2719,34 @@ @RequestMapping("/biaozhun") @ResponseBody - public List<Device> queryDevice(String macOrName){ + public List<Device> queryDevice(String macOrName) { List<Device> deviceList = new ArrayList<>(); - if (!macOrName.equals("")){ - deviceList= deviceService.getDevice(macOrName); + if (!macOrName.equals("")) { + deviceList = deviceService.getDevice(macOrName); } return deviceList; } @RequestMapping("/getBiaoZhun") @ResponseBody - public List<DeviceAdjustValueTiming> getBiaoZhun(String id){ + public List<DeviceAdjustValueTiming> getBiaoZhun(String id) { List<DeviceAdjustValueTiming> dataByDeviceid = deviceAdjustValueTimingService.getDataByDeviceid(Integer.parseInt(id)); for (DeviceAdjustValueTiming deviceAdjustValueTiming : dataByDeviceid) { int seconds = Integer.parseInt(deviceAdjustValueTiming.getSeconds()); - String hour = String.valueOf(seconds/3600); - int millAndSeconds = seconds%3600; - String mill = String.valueOf(millAndSeconds/60); - String second = String.valueOf(millAndSeconds%60); - if (hour.length()<2){ - hour="0"+hour; + String hour = String.valueOf(seconds / 3600); + int millAndSeconds = seconds % 3600; + String mill = String.valueOf(millAndSeconds / 60); + String second = String.valueOf(millAndSeconds % 60); + if (hour.length() < 2) { + hour = "0" + hour; } - if (mill.length()<2){ - mill="0"+mill; + if (mill.length() < 2) { + mill = "0" + mill; } - if (second.length()<2){ - second="0"+second; + if (second.length() < 2) { + second = "0" + second; } - String time = hour+":"+mill+":"+second; + String time = hour + ":" + mill + ":" + second; Map<String, String> value = deviceAdjustValueTiming.getValue(); Collection<String> values = value.values(); deviceAdjustValueTiming.setSeconds(time); @@ -2700,15 +2757,15 @@ @RequestMapping("/getSensor") @ResponseBody - public List<Map<String, Object>> getSensor(String id){ + public List<Map<String, Object>> getSensor(String id) { List<Map<String, Object>> allSensors = sensorService.getSensorByDeviceId(id); return allSensors; } @RequestMapping("/deleteBiaoZhun") @ResponseBody - public int deleteBiaoZhun(String id){ - int i= deviceAdjustValueTimingService.delete(id); + public int deleteBiaoZhun(String id) { + int i = deviceAdjustValueTimingService.delete(id); return i; } @@ -2718,111 +2775,111 @@ @ApiImplicitParams(value = { @ApiImplicitParam(name = "monitorPointIds", value = "������monitorid", required = true, paramType = "query", dataType = "String"), @ApiImplicitParam(name = "time", value = "������(���������2020-03-19)", required = true, paramType = "query", dataType = "String")}) - public ResultBean<List<Map<String,Object>>> monitorAVGData(HttpServletRequest request) throws Exception { + public ResultBean<List<Map<String, Object>>> monitorAVGData(HttpServletRequest request) throws Exception { Map<String, Object> parameters = getParametersStartingWith(request, null); String monitorPointIds = (String) parameters.get("monitorPointIds"); String time = (String) parameters.get("time"); - time = time+" 00:00:00"; + time = time + " 00:00:00"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd mm:HH:ss");//���������������MM Date date = simpleDateFormat.parse(time); Calendar calendar = new GregorianCalendar(); calendar.setTime(date); - calendar.add(calendar.DATE,+1); - String date1= simpleDateFormat.format(date); - String date2= simpleDateFormat.format(calendar.getTime()); + calendar.add(calendar.DATE, +1); + String date1 = simpleDateFormat.format(date); + String date2 = simpleDateFormat.format(calendar.getTime()); String[] mIds = monitorPointIds.split(","); - List<List<Map<String,Object>>> lists = new ArrayList<>(); - if (mIds.length==1 && mIds.length!=0){ + List<List<Map<String, Object>>> lists = new ArrayList<>(); + if (mIds.length == 1 && mIds.length != 0) { String mId = mIds[0]; - List<Map<String,Object>> dataAvbByMIdAndTime = historyHourlyService.getDataAvbByMIdAndTime(mId, date1, date2); + List<Map<String, Object>> dataAvbByMIdAndTime = historyHourlyService.getDataAvbByMIdAndTime(mId, date1, date2); Double maxO3 = Double.parseDouble(dataAvbByMIdAndTime.get(dataAvbByMIdAndTime.size() - 1).get("maxO3").toString()); - Map<String,Object> dailyAvgData =new HashMap<>(); - if (dataAvbByMIdAndTime.get(dataAvbByMIdAndTime.size() - 2).get("data")!=""){ + Map<String, Object> dailyAvgData = new HashMap<>(); + if (dataAvbByMIdAndTime.get(dataAvbByMIdAndTime.size() - 2).get("data") != "") { dailyAvgData = (Map<String, Object>) dataAvbByMIdAndTime.get(dataAvbByMIdAndTime.size() - 2).get("data"); - dailyAvgData.put("maxO3_8h",new BigDecimal(maxO3).setScale(0,BigDecimal.ROUND_HALF_UP).doubleValue()); - }else { - dailyAvgData= historyHourlyService.getAvgDataByMId(mId, date1, date2); - if (dailyAvgData!=null){ - dailyAvgData.put("maxO3_8h",new BigDecimal(maxO3).setScale(0,BigDecimal.ROUND_HALF_UP).doubleValue()); - }else { + dailyAvgData.put("maxO3_8h", new BigDecimal(maxO3).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue()); + } else { + dailyAvgData = historyHourlyService.getAvgDataByMId(mId, date1, date2); + if (dailyAvgData != null) { + dailyAvgData.put("maxO3_8h", new BigDecimal(maxO3).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue()); + } else { dailyAvgData = new HashMap<>(); - dailyAvgData.put("PM2_5",""); - dailyAvgData.put("NO2",""); - dailyAvgData.put("SO2",""); - dailyAvgData.put("PM10",""); - dailyAvgData.put("O3_day",""); - dailyAvgData.put("CO",""); + dailyAvgData.put("PM2_5", ""); + dailyAvgData.put("NO2", ""); + dailyAvgData.put("SO2", ""); + dailyAvgData.put("PM10", ""); + dailyAvgData.put("O3_day", ""); + dailyAvgData.put("CO", ""); } } dataAvbByMIdAndTime.remove(dataAvbByMIdAndTime.size() - 1); dataAvbByMIdAndTime.remove(dataAvbByMIdAndTime.size() - 1); - Map<String,Object> dayMap = new HashMap<>(); - dayMap.put("data",dailyAvgData); - dayMap.put("time",date1.substring(0,11)); + Map<String, Object> dayMap = new HashMap<>(); + dayMap.put("data", dailyAvgData); + dayMap.put("time", date1.substring(0, 11)); dataAvbByMIdAndTime.add(dayMap); - for (int i = 0; i <dataAvbByMIdAndTime.size() ; i++) { - if (i!=dataAvbByMIdAndTime.size()-1){ + for (int i = 0; i < dataAvbByMIdAndTime.size(); i++) { + if (i != dataAvbByMIdAndTime.size() - 1) { Map<String, Object> map1 = AQICalculation2.hourlyAQI((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")); - if (Double.parseDouble(map1.get("AQI").toString())>50.0){ - ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("primary_pollutants",map1.get("maxSensor")); - ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("AQI",map1.get("AQI")); - }else { - ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("primary_pollutants","-"); - ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("AQI",map1.get("AQI")); + if (Double.parseDouble(map1.get("AQI").toString()) > 50.0) { + ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("primary_pollutants", map1.get("maxSensor")); + ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("AQI", map1.get("AQI")); + } else { + ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("primary_pollutants", "-"); + ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("AQI", map1.get("AQI")); } - }else { + } else { Map<String, Object> map1 = AQICalculation2.dayAQI((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")); - if (map1.get("AQI").toString().equals("")){ + if (map1.get("AQI").toString().equals("")) { break; } - if (Double.parseDouble(map1.get("AQI").toString())>50.0){ - ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("primary_pollutants",map1.get("maxSensor")); - ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("AQI",map1.get("AQI")); - }else { - ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("primary_pollutants","-"); - ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("AQI",map1.get("AQI")); - } + if (Double.parseDouble(map1.get("AQI").toString()) > 50.0) { + ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("primary_pollutants", map1.get("maxSensor")); + ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("AQI", map1.get("AQI")); + } else { + ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("primary_pollutants", "-"); + ((Map<String, Object>) dataAvbByMIdAndTime.get(i).get("data")).put("AQI", map1.get("AQI")); + } } } List timeList = new ArrayList(); for (int q = 0; q < dataAvbByMIdAndTime.size(); q++) { timeList.add(dataAvbByMIdAndTime.get(q).get("time")); } - if (dataAvbByMIdAndTime.size()<25){ + if (dataAvbByMIdAndTime.size() < 25) { for (int j = 1; j < 25; j++) { - Map<String,Object> map = null; + Map<String, Object> map = null; for (int q = 0; q < dataAvbByMIdAndTime.size(); q++) { - if (dataAvbByMIdAndTime.get(q).get("time").toString().length() > 2){ + if (dataAvbByMIdAndTime.get(q).get("time").toString().length() > 2) { continue; - }else { + } else { // System.out.println(Integer.parseInt(dataAvbByMIdAndTime.get(q).get("time").toString())+"==="+j); - String sj=""; - if (j<10){ - sj="0"+j; - }else { - if (j==24){ - sj="00"; - }else { - sj=""+j; + String sj = ""; + if (j < 10) { + sj = "0" + j; + } else { + if (j == 24) { + sj = "00"; + } else { + sj = "" + j; } } - if (!timeList.contains(sj)){ + if (!timeList.contains(sj)) { map = new HashMap<>(); - map.put("time",sj); + map.put("time", sj); Map map1 = new HashMap(); - map1.put("PM2_5",""); - map1.put("NO2",""); - map1.put("primary_pollutants","-"); - map1.put("SO2",""); - map1.put("O3",""); - map1.put("PM10",""); - map1.put("O3_8h",""); - map1.put("CO",""); - map1.put("AQI",""); - map.put("data",map1); + map1.put("PM2_5", ""); + map1.put("NO2", ""); + map1.put("primary_pollutants", "-"); + map1.put("SO2", ""); + map1.put("O3", ""); + map1.put("PM10", ""); + map1.put("O3_8h", ""); + map1.put("CO", ""); + map1.put("AQI", ""); + map.put("data", map1); dataAvbByMIdAndTime.add(map); break; - }else { + } else { break; } } @@ -2832,93 +2889,93 @@ /* for (int i1 = 0; i1 < dataAvbByMIdAndTime.size(); i1++) { System.out.println(dataAvbByMIdAndTime.get(i1)); }*/ - Collections.sort(dataAvbByMIdAndTime, new Comparator<Map<String, Object>>(){ + Collections.sort(dataAvbByMIdAndTime, new Comparator<Map<String, Object>>() { public int compare(Map<String, Object> o1, Map<String, Object> o2) { - String name1 =(String)o1.get("time");//name1���������list������������������������ - String name2= (String)o2.get("time"); //name1���������list���������������������������name + String name1 = (String) o1.get("time");//name1���������list������������������������ + String name2 = (String) o2.get("time"); //name1���������list���������������������������name return name1.compareTo(name2); } }); Map map1 = dataAvbByMIdAndTime.get(0); dataAvbByMIdAndTime.remove(0); dataAvbByMIdAndTime.add(map1); - for (int j = 0; j <dataAvbByMIdAndTime.size() ; j++) { - if (dataAvbByMIdAndTime.get(j).get("time").toString().length()>2){ + for (int j = 0; j < dataAvbByMIdAndTime.size(); j++) { + if (dataAvbByMIdAndTime.get(j).get("time").toString().length() > 2) { Map map2 = dataAvbByMIdAndTime.get(j); dataAvbByMIdAndTime.remove(j); dataAvbByMIdAndTime.add(map2); } } - if (dataAvbByMIdAndTime.size()==1){ - dataAvbByMIdAndTime=null; + if (dataAvbByMIdAndTime.size() == 1) { + dataAvbByMIdAndTime = null; } lists.add(dataAvbByMIdAndTime); //List<Device> devicesByMonitorPointId = deviceService.getDevicesByMonitorPointId(Integer.valueOf(mId)); - }else { - for (int i = 0; i <mIds.length ; i++) { - List<Map<String,Object>> dataAvbByMIdAndTime = historyHourlyService.getDataAvbByMIdAndTime(mIds[i], date1, date2); + } else { + for (int i = 0; i < mIds.length; i++) { + List<Map<String, Object>> dataAvbByMIdAndTime = historyHourlyService.getDataAvbByMIdAndTime(mIds[i], date1, date2); Double maxO3 = Double.parseDouble(dataAvbByMIdAndTime.get(dataAvbByMIdAndTime.size() - 1).get("maxO3").toString()); - Map<String,Object> dailyAvgData =new HashMap<>(); - if (dataAvbByMIdAndTime.get(dataAvbByMIdAndTime.size() - 2).get("data")!=""){ + Map<String, Object> dailyAvgData = new HashMap<>(); + if (dataAvbByMIdAndTime.get(dataAvbByMIdAndTime.size() - 2).get("data") != "") { dailyAvgData = (Map<String, Object>) dataAvbByMIdAndTime.get(dataAvbByMIdAndTime.size() - 2).get("data"); - dailyAvgData.put("maxO3_8h",new BigDecimal(maxO3).setScale(0,BigDecimal.ROUND_HALF_UP).doubleValue()); - }else { - dailyAvgData= historyHourlyService.getAvgDataByMId(mIds[i], date1, date2); - if (dailyAvgData!=null){ - dailyAvgData.put("maxO3_8h",new BigDecimal(maxO3).setScale(0,BigDecimal.ROUND_HALF_UP).doubleValue()); - }else { + dailyAvgData.put("maxO3_8h", new BigDecimal(maxO3).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue()); + } else { + dailyAvgData = historyHourlyService.getAvgDataByMId(mIds[i], date1, date2); + if (dailyAvgData != null) { + dailyAvgData.put("maxO3_8h", new BigDecimal(maxO3).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue()); + } else { dailyAvgData = new HashMap<>(); - dailyAvgData.put("PM2_5",""); - dailyAvgData.put("NO2",""); - dailyAvgData.put("SO2",""); - dailyAvgData.put("PM10",""); - dailyAvgData.put("O3_day",""); - dailyAvgData.put("CO",""); + dailyAvgData.put("PM2_5", ""); + dailyAvgData.put("NO2", ""); + dailyAvgData.put("SO2", ""); + dailyAvgData.put("PM10", ""); + dailyAvgData.put("O3_day", ""); + dailyAvgData.put("CO", ""); } } dataAvbByMIdAndTime.remove(dataAvbByMIdAndTime.size() - 1); dataAvbByMIdAndTime.remove(dataAvbByMIdAndTime.size() - 1); - Map<String,Object> dayMap = new HashMap<>(); - dayMap.put("data",dailyAvgData); - dayMap.put("time",date1.substring(0,11)); + Map<String, Object> dayMap = new HashMap<>(); + dayMap.put("data", dailyAvgData); + dayMap.put("time", date1.substring(0, 11)); dataAvbByMIdAndTime.add(dayMap); List timeList = new ArrayList(); for (int q = 0; q < dataAvbByMIdAndTime.size(); q++) { timeList.add(dataAvbByMIdAndTime.get(q).get("time")); } - if (dataAvbByMIdAndTime.size()<25){ + if (dataAvbByMIdAndTime.size() < 25) { for (int j = 1; j < 25; j++) { - Map<String,Object> map = null; + Map<String, Object> map = null; for (int q = 0; q < dataAvbByMIdAndTime.size(); q++) { - if (dataAvbByMIdAndTime.get(q).get("time").toString().length() > 2){ + if (dataAvbByMIdAndTime.get(q).get("time").toString().length() > 2) { continue; - }else { - // System.out.println(Integer.parseInt(dataAvbByMIdAndTime.get(q).get("time").toString())+"==="+j); - String sj=""; - if (j<10){ - sj="0"+j; - }else { - if (j==24){ - sj="00"; - }else { - sj=""+j; + } else { + // System.out.println(Integer.parseInt(dataAvbByMIdAndTime.get(q).get("time").toString())+"==="+j); + String sj = ""; + if (j < 10) { + sj = "0" + j; + } else { + if (j == 24) { + sj = "00"; + } else { + sj = "" + j; } } - if (!timeList.contains(sj)){ + if (!timeList.contains(sj)) { map = new HashMap<>(); - map.put("time",sj); + map.put("time", sj); Map map1 = new HashMap(); - map1.put("PM2_5",""); - map1.put("NO2",""); - map1.put("SO2",""); - map1.put("O3",""); - map1.put("PM10",""); - map1.put("O3_8h",""); - map1.put("CO",""); - map.put("data",map1); + map1.put("PM2_5", ""); + map1.put("NO2", ""); + map1.put("SO2", ""); + map1.put("O3", ""); + map1.put("PM10", ""); + map1.put("O3_8h", ""); + map1.put("CO", ""); + map.put("data", map1); dataAvbByMIdAndTime.add(map); break; - }else { + } else { break; } } @@ -2926,18 +2983,18 @@ } } - Collections.sort(dataAvbByMIdAndTime, new Comparator<Map<String, Object>>(){ + Collections.sort(dataAvbByMIdAndTime, new Comparator<Map<String, Object>>() { public int compare(Map<String, Object> o1, Map<String, Object> o2) { - String name1 =(String)o1.get("time");//name1���������list������������������������ - String name2= (String)o2.get("time"); //name1���������list���������������������������name + String name1 = (String) o1.get("time");//name1���������list������������������������ + String name2 = (String) o2.get("time"); //name1���������list���������������������������name return name1.compareTo(name2); } }); Map map1 = dataAvbByMIdAndTime.get(0); dataAvbByMIdAndTime.remove(0); dataAvbByMIdAndTime.add(map1); - for (int j = 0; j <dataAvbByMIdAndTime.size() ; j++) { - if (dataAvbByMIdAndTime.get(j).get("time").toString().length()>2){ + for (int j = 0; j < dataAvbByMIdAndTime.size(); j++) { + if (dataAvbByMIdAndTime.get(j).get("time").toString().length() > 2) { Map map2 = dataAvbByMIdAndTime.get(j); dataAvbByMIdAndTime.remove(j); dataAvbByMIdAndTime.add(map2); @@ -2948,20 +3005,20 @@ List<Map<String, Object>> dataByMonitorPoints = historyHourlyService.getDataByMonitorPoints(mIds, date1, date2); lists.add(dataByMonitorPoints); } - List<Map<String, Object>> rList =new ArrayList<>(); - if (lists.size()==1 && lists.get(0)!=null){ + List<Map<String, Object>> rList = new ArrayList<>(); + if (lists.size() == 1 && lists.get(0) != null) { for (int i = 0; i < lists.get(0).size(); i++) { List list = new ArrayList(); list.add(lists.get(0).get(i).get("data")); Map map = new HashMap(); - map.put("data",list); - map.put("time",lists.get(0).get(i).get("time")); + map.put("data", list); + map.put("time", lists.get(0).get(i).get("time")); rList.add(map); } - } else if (lists.size()==1 && lists.get(0)==null){ + } else if (lists.size() == 1 && lists.get(0) == null) { rList.add(null); - }else { + } else { for (int j = 0; j < lists.get(0).size(); j++) { Map<String, Object> listMap = new HashMap(); List<Map> mapList = new ArrayList<>(); @@ -2985,7 +3042,7 @@ rList.add(listMap); } } - return new ResultBean<List<Map<String,Object>>>(rList); + return new ResultBean<List<Map<String, Object>>>(rList); } @PostMapping("byAccountGetDevices") @@ -2994,4 +3051,188 @@ List<Device> devicesList = deviceService.getDevicesByAccountId(id); return devicesList; } + + @GetMapping("/unorganizedEmissionsFiveMinute") + @ApiOperation(value = "������������������������", notes = "������������������������") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "monitorPointId", value = "������Id", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "sensorKey", value = "������", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "realTime", value = "������", required = true, paramType = "query", dataType = "String"), + @ApiImplicitParam(name = "accountId", value = "������id", required = false, paramType = "query", dataType = "String")}) + public ModelAndView unorganizedEmissionsBackupsV2(HttpServletRequest request, ModelAndView model) { + Map<String, Object> parameters = WebUtils.getParametersStartingWith(request, null); + String sensorKey = parameters.get("sensorKey").toString(); + //������������������������������ + PollutionSourcePoint pollutionSourcePoint = pollutioSourcePointService.selectByMonitorPointId(539); + //��������������������������� + List<Device> deviceList = deviceService.getDevicesByMonitorPointId(539); + //��������������������� + Map<String,Object> pa = new HashMap<>(); + //��������������������������������� + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Calendar beforeTime = Calendar.getInstance(); + Date newTime = beforeTime.getTime(); + beforeTime.add(Calendar.MINUTE,-5); + Date startTime = beforeTime.getTime(); + beforeTime.add(Calendar.MINUTE,6); + Date endTime = beforeTime.getTime(); + //pa.put("sensorKey","e1"); + pa.put("yearAndMonth",sdf.format(newTime).substring(0,7).replace("-","")); + pa.put("startTime",startTime); + pa.put("endTime",endTime); + List<String> macs = new ArrayList<>(); + List<String> sensorKeys = new ArrayList<>(); + for (Device device:deviceList) { + macs.add(device.getMac()); + } + sensorKeys.add(sensorKey); + sensorKeys.add("e18"); + sensorKeys.add("e23"); + pa.put("macs",macs); + pa.put("sensorKeys",sensorKeys); + pa.put("macNumber",macs.size()); + List<Map<String, Object>> fiveMinuteDataList = historyFiveMinutelyService.getFiveMinutesDataByMacsAndTimeSolt(pa); + //������������������������������������������ + double[] allDeviceData = new double[fiveMinuteDataList.size()]; + int i = 0; + //������������ + List<Map<String,Object>> windList = new ArrayList<>(); + for (Map map:fiveMinuteDataList) { + String[] wind_speed = map.get("e18").toString().split(","); + if (!map.containsKey("e23")){ + continue; + } + String[] wind_direction = map.get("e23").toString().split(","); + Map<String,Object> windMap = new HashMap<>(); + windMap.put("wind_speed",wind_speed[0].substring(1,wind_speed[0].length())); + windMap.put("wind_direction",wind_direction[0].substring(1,wind_direction[0].length())); + windList.add(windMap); + String[] sensorArr = map.get(sensorKey).toString().split(","); + double sensorData = Double.parseDouble(sensorArr[0].substring(1,sensorArr[0].length())); + allDeviceData[i] = sensorData; + i = i+1; + } + //��������������������������� + Map<String,Double> res = WindUtils.getWind_direction_speed(windList); + //��������������������������������������������� + Map<String,Double> angleMap = new HashMap(); + MyLatLng pollutionSourcePoint_log_lat = new MyLatLng(pollutionSourcePoint.getLongitude(),pollutionSourcePoint.getLatitude()); + for (Device device:deviceList) { + MyLatLng device_log_lat = new MyLatLng(device.getLongitude(),device.getLatitude()); + //������������������������������������������������������ + double angle = mapUtils.getAngle(device_log_lat,pollutionSourcePoint_log_lat); + angleMap.put(device.getMac(),angle); + } + Map<String,Double> disparityMap = new HashMap<>(); + for (String key:angleMap.keySet()) { + double angleDisparity = Math.abs(angleMap.get(key)-res.get("wind_direction")); + if (angleDisparity>180){ + angleDisparity = 360-angleDisparity; + } + disparityMap.put(key,angleDisparity); + } + Optional<Map.Entry<String, Double>> minDisparity = disparityMap.entrySet() + .stream() + .min(Map.Entry.comparingByValue()); + //������������������������disparityMap������������minDisparity���������������key������������������������������������������ + List<String> minAngleDisparityMacList = new ArrayList<>(); + for (String key:disparityMap.keySet()) { + if (disparityMap.get(key) == minDisparity.get().getValue()){ + minAngleDisparityMacList.add(minDisparity.get().getKey()); + } + } + //������������map������������������ + Map<String,Object> fiveMinuteDataMap = new HashMap(); + if (minAngleDisparityMacList.size()<2){//��������������� + for (Map fiveMinuteData:fiveMinuteDataList) { + if (fiveMinuteData.get("mac").toString().equals(minAngleDisparityMacList.get(0))){ + fiveMinuteDataMap.putAll(fiveMinuteData); + break; + } + } + }else { + + } + Device referenceDevice = new Device(); + for (Device device:deviceList) { + if (device.getMac().equals(fiveMinuteDataMap.get("mac"))){ + referenceDevice = device; + } + } + //��������������������� + double sum = 0; + for (int j=0;j<allDeviceData.length;j++) { + sum = sum+allDeviceData[j]; + } + double deviceDataAvg = sum/allDeviceData.length; + //��������������������������������������������� + double distance = mapUtils.getDistance(pollutionSourcePoint.getLongitude(),pollutionSourcePoint.getLatitude(),referenceDevice.getLongitude(),referenceDevice.getLatitude()); + //���������������������������x,y + double x = Math.cos(Math.toRadians(minDisparity.get().getValue()))*distance; + double y = Math.sin(Math.toRadians(minDisparity.get().getValue()))*distance; + //��������������������� + String[] fiveMinuteData = fiveMinuteDataMap.get(sensorKey).toString().split(","); + double c = Double.parseDouble(fiveMinuteData[0].substring(1,fiveMinuteData[0].length()))-deviceDataAvg; + //������������ + double pollutionSourceIntensity = EmissionDataUtil.getPollutionSourceIntensity(c,x,y,res.get("wind_speed")); + + //��������������������� + Map<String,Object> center = new HashMap<>(); + center.put("lng",120.997119); + center.put("lat",31.451714); + + //������������������������������������ + List<Map<String,Double>> numericalValueList = new ArrayList<>(); + Map<String,Double> numericalValueMap = new HashMap<>(); + numericalValueMap.put("lng",120.997119); + numericalValueMap.put("lat",31.451714); + numericalValueMap.put("count",0.027); + numericalValueList.add(numericalValueMap); + Map<String,Double> numericalValueMap2 = new HashMap<>(); + numericalValueMap2.put("lng",120.99516); + numericalValueMap2.put("lat",31.448664); + numericalValueMap2.put("count",0.029); + numericalValueList.add(numericalValueMap2); + Map<String,Double> numericalValueMap3 = new HashMap<>(); + numericalValueMap3.put("lng",120.998538); + numericalValueMap3.put("lat",31.449289); + numericalValueMap3.put("count",0.033); + numericalValueList.add(numericalValueMap3); + Map<String,Double> numericalValueMap4 = new HashMap<>(); + numericalValueMap4.put("lng",120.998628); + numericalValueMap4.put("lat",31.452027); + numericalValueMap4.put("count",0.025); + numericalValueList.add(numericalValueMap4); + Map<String,Double> numericalValueMap5 = new HashMap<>(); + numericalValueMap5.put("lng",121.000383); + numericalValueMap5.put("lat",31.451469); + numericalValueMap5.put("count",0.05); + numericalValueList.add(numericalValueMap5); + Map<String,Double> numericalValueMap6 = new HashMap<>(); + numericalValueMap6.put("lng",120.999908); + numericalValueMap6.put("lat",31.449389); + numericalValueMap6.put("count",0.04); + numericalValueList.add(numericalValueMap6); + Map<String,Double> numericalValueMap7 = new HashMap<>(); + numericalValueMap7.put("lng",120.998519); + numericalValueMap7.put("lat",31.450588); + numericalValueMap7.put("count",0.10); + numericalValueList.add(numericalValueMap7); + + + JSONObject params = new JSONObject(); + params.put("accountId",190); + params.put("level",17); + params.put("center",center); + params.put("points",numericalValueList); + + + + //������������������ + //JSONObject params=monitorPointService.getMonitorPointById(monitPointId,Time,3,sensor); + // model.addObject("params",params); + model.addObject("params", params); + model.setViewName("unorganizedMapV2"); + return model; + } } \ No newline at end of file diff --git a/src/main/java/com/moral/mapper/HistoryFiveMinutelyMapper.java b/src/main/java/com/moral/mapper/HistoryFiveMinutelyMapper.java index 0aadbdd..c3a01d6 100644 --- a/src/main/java/com/moral/mapper/HistoryFiveMinutelyMapper.java +++ b/src/main/java/com/moral/mapper/HistoryFiveMinutelyMapper.java @@ -10,4 +10,6 @@ Map<String,Object> getFiveMinutesDataByMac(Map<String,Object> parameters); List<Map<String,Object>> getFiveMinutesSersorDataByMacsAndTime(Map<String,Object> parameters); + + List<Map<String,Object>> getFiveMinutesDataByMacsAndTimeSolt(Map<String,Object> parameters); } diff --git a/src/main/java/com/moral/service/HistoryFiveMinutelyService.java b/src/main/java/com/moral/service/HistoryFiveMinutelyService.java index 21972b8..78456b7 100644 --- a/src/main/java/com/moral/service/HistoryFiveMinutelyService.java +++ b/src/main/java/com/moral/service/HistoryFiveMinutelyService.java @@ -9,4 +9,6 @@ Map<String,Object> getFiveMinutesDataByMac(Map<String, Object> parameters); List<Map<String, Object>> getFiveMinutesSersorDataByMacsAndTime(Map<String,Object> parameters); + + List<Map<String, Object>> getFiveMinutesDataByMacsAndTimeSolt(Map<String,Object> parameters); } diff --git a/src/main/java/com/moral/service/impl/HistoryFiveMinutelyServiceImpl.java b/src/main/java/com/moral/service/impl/HistoryFiveMinutelyServiceImpl.java index b2dc382..156b8ba 100644 --- a/src/main/java/com/moral/service/impl/HistoryFiveMinutelyServiceImpl.java +++ b/src/main/java/com/moral/service/impl/HistoryFiveMinutelyServiceImpl.java @@ -32,5 +32,11 @@ return historyFiveMinutelyMapper.getFiveMinutesSersorDataByMacsAndTime(parameters); } + @Override + public List<Map<String, Object>> getFiveMinutesDataByMacsAndTimeSolt(Map<String, Object> parameters) { + ValidateUtil.notNull(parameters,"���������������������������������"); + return historyFiveMinutelyMapper.getFiveMinutesDataByMacsAndTimeSolt(parameters); + } + } diff --git a/src/main/java/com/moral/service/impl/HistoryServiceImpl.java b/src/main/java/com/moral/service/impl/HistoryServiceImpl.java index 08137c7..498bcec 100644 --- a/src/main/java/com/moral/service/impl/HistoryServiceImpl.java +++ b/src/main/java/com/moral/service/impl/HistoryServiceImpl.java @@ -540,8 +540,8 @@ String startTime = parameters.get("startTime").toString(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime startTimeLocalDateTime = LocalDateTime.parse(startTime, dateTimeFormatter); - LocalDateTime today = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS); - LocalDateTime startTimeDay = startTimeLocalDateTime.truncatedTo(ChronoUnit.DAYS); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); + int format = Integer.parseInt(sdf.format(new Date())); int year = startTimeLocalDateTime.getYear(); int month = startTimeLocalDateTime.getMonthValue(); String monthStr = month < 10 ? ("0" + month) : month + ""; @@ -553,17 +553,15 @@ } parameters.put("sensorKeys", sensorKeys); List<Map<String, Object>> listMap = null; - /*if (today.compareTo(startTimeDay) == 0) { - listMap = historyMapper.listGetSensorData(parameters); - }*/ - //if (CollectionUtils.isEmpty(listMap)) { listMap = historyMapper.getCarSensorData(parameters); if (CollectionUtils.isEmpty(listMap)) { if (year <= 2019) { listMap = historyMinutelyMapper.getSensorData(parameters); } else { - parameters.put("yearAndMonth", yearAndMonth); - listMap = historyMinutelyMapper.getSensorData2020(parameters); + if (Integer.parseInt(yearAndMonth) <= format) { + parameters.put("yearAndMonth", yearAndMonth); + listMap = historyMinutelyMapper.getSensorData2020(parameters); + } } } //} diff --git a/src/main/java/com/moral/util/WindUtils.java b/src/main/java/com/moral/util/WindUtils.java index 01d7073..80de618 100644 --- a/src/main/java/com/moral/util/WindUtils.java +++ b/src/main/java/com/moral/util/WindUtils.java @@ -1,5 +1,6 @@ package com.moral.util; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -29,26 +30,26 @@ u1 = 0; v1 = wind_speed*1; }else if (0<wind_direction&&wind_direction<90){ - u1 = wind_speed*Math.sin(wind_direction); - v1 = wind_speed*Math.cos(wind_direction); + u1 = wind_speed*Math.sin(Math.toRadians(wind_direction)); + v1 = wind_speed*Math.cos(Math.toRadians(wind_direction)); }else if (wind_direction == 90){ u1 = wind_speed*1; v1 = 0; }else if (90<wind_direction&&wind_direction<180){ - u1 = wind_speed*Math.sin(180-wind_direction); - v1 = -1*wind_speed*Math.cos(180-wind_direction); + u1 = wind_speed*Math.sin(Math.toRadians(180-wind_direction)); + v1 = -1*wind_speed*Math.cos(Math.toRadians(180-wind_direction)); }else if (wind_direction == 180){ u1 = 0; v1 = wind_speed*-1; }else if (180<wind_direction&&wind_direction<270){ - u1 = -1*wind_speed*Math.sin(wind_direction-180); - v1 = -1*wind_speed*Math.cos(wind_direction-180); + u1 = -1*wind_speed*Math.sin(Math.toRadians(wind_direction-180)); + v1 = -1*wind_speed*Math.cos(Math.toRadians(wind_direction-180)); }else if (wind_direction == 270){ u1 = wind_speed*-1; v1 = 0; }else if (270<wind_direction&&wind_direction<360){ - u1 = wind_speed*Math.sin(360-wind_direction); - v1 = -1*wind_speed*Math.cos(360-wind_direction); + u1 = wind_speed*Math.sin(Math.toRadians(360-wind_direction)); + v1 = -1*wind_speed*Math.cos(Math.toRadians(360-wind_direction)); } u = u+u1; v = v+v1; @@ -59,30 +60,47 @@ windDirectionSpeedMap.put("wind_speed",0.0); }else if (u==0&&v>0){ windDirectionSpeedMap.put("wind_direction",0.0); - windDirectionSpeedMap.put("wind_speed",v); + windDirectionSpeedMap.put("wind_speed",v/list.size()); }else if (u>0&&v>0){ - windDirectionSpeedMap.put("wind_direction",Math.atan2(u,v)); - windDirectionSpeedMap.put("wind_speed",Math.sqrt(u*u+v*v)); + windDirectionSpeedMap.put("wind_direction",Math.toDegrees(Math.atan2(u,v))); + windDirectionSpeedMap.put("wind_speed",Math.sqrt(u*u+v*v)/list.size()); }else if (u>0&&v==0){ windDirectionSpeedMap.put("wind_direction",90.0); - windDirectionSpeedMap.put("wind_speed",u); + windDirectionSpeedMap.put("wind_speed",u/list.size()); }else if (u>0&&v<0){ - windDirectionSpeedMap.put("wind_direction",Math.atan2(-v,u)+90); - windDirectionSpeedMap.put("wind_speed",Math.sqrt(u*u+v*v)); + windDirectionSpeedMap.put("wind_direction",Math.toDegrees(Math.atan2(-v,u))+90); + windDirectionSpeedMap.put("wind_speed",Math.sqrt(u*u+v*v)/list.size()); }else if (u==0&&v<0){ windDirectionSpeedMap.put("wind_direction",180.0); - windDirectionSpeedMap.put("wind_speed",-v); + windDirectionSpeedMap.put("wind_speed",Math.abs(v)/list.size()); }else if (u<0&&v<0){ - windDirectionSpeedMap.put("wind_direction",Math.atan2(-u,-v)+180); - windDirectionSpeedMap.put("wind_speed",Math.sqrt(u*u+v*v)); + windDirectionSpeedMap.put("wind_direction",Math.toDegrees(Math.atan2(-u,-v))+180); + windDirectionSpeedMap.put("wind_speed",Math.sqrt(u*u+v*v)/list.size()); }else if (u<0&&v==0){ windDirectionSpeedMap.put("wind_direction",270.0); - windDirectionSpeedMap.put("wind_speed",-u); + windDirectionSpeedMap.put("wind_speed",Math.abs(u)/list.size()); }else if (u<0&&v>0){ - windDirectionSpeedMap.put("wind_direction",Math.atan2(v,-u)+270); - windDirectionSpeedMap.put("wind_speed",Math.sqrt(u*u+v*v)); + windDirectionSpeedMap.put("wind_direction",Math.toDegrees(Math.atan2(v,-u))+270); + windDirectionSpeedMap.put("wind_speed",Math.sqrt(u*u+v*v)/list.size()); } return windDirectionSpeedMap; } + /*public static void main(String[] args) { + List list = new ArrayList(); + Map map = new HashMap(); + Map map2 = new HashMap(); + map.put("wind_direction",45); + map.put("wind_speed",1); + map2.put("wind_direction",45); + map2.put("wind_speed",1); + list.add(map); + list.add(map2); + Map<String, Double> re = getWind_direction_speed(list); + System.out.println(re); + System.out.println(Math.toRadians(45)); + System.out.println(Math.sin(Math.toRadians(45))); + System.out.println(Math.cos(Math.toRadians(45))); + }*/ + } diff --git a/src/main/java/com/moral/webSocketServer/BSAQIWebSocketServerTest.java b/src/main/java/com/moral/webSocketServer/BSAQIWebSocketServerTest.java new file mode 100644 index 0000000..2341912 --- /dev/null +++ b/src/main/java/com/moral/webSocketServer/BSAQIWebSocketServerTest.java @@ -0,0 +1,173 @@ +package com.moral.webSocketServer; + +import com.alibaba.fastjson.JSON; +import com.moral.entity.Device; +import com.moral.entity.Sensor; +import com.moral.service.DeviceService; +import com.moral.service.SensorService; +import com.moral.util.RabbitMQUtils; +import com.rabbitmq.client.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import javax.annotation.PostConstruct; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Slf4j +@ServerEndpoint("/web/AQIWebSocketTest/{param}") +@Component +public class BSAQIWebSocketServerTest { + + public static SensorService sensorService; + + public static DeviceService deviceService; + + /** + * concurrent������������������Set���������������������������������������WebSocket��������� + */ + private static ConcurrentHashMap<String, BSAQIWebSocketServerTest> webSocketMap = new ConcurrentHashMap<>(); + /** + * ������������������������������������������������������������������������������ + */ + private Session session; + + private String orgId; + + private String accountId; + + private String mac; + + private final String exchange = "screens_data"; + + private static Map<String, Sensor> sensors; + + @PostConstruct + public void init() { + sensors = new HashMap<>(); + List<Sensor> allSensors = sensorService.getAllSensors(); + for (Sensor sensor : allSensors) { + sensors.put(sensor.getSensorKey(), sensor); + } + } + + @OnOpen + public void onOpen(Session session, @PathParam("param") String param) { + this.session = session; + String[] params = param.split("&"); + this.accountId = params[0]; + this.orgId = params[1]; + this.mac = params[2]; + + if (webSocketMap.containsKey(accountId)) { + webSocketMap.remove(accountId); + webSocketMap.put(accountId, this); + } else { + webSocketMap.put(accountId, this); + } + + + try { + Connection connection = RabbitMQUtils.getConnection(); + final Channel channel = connection.createChannel(); + //������������������ + String queue = channel.queueDeclare().getQueue(); + //������������������������routingKey������������ + String routingKey = ""; + routingKey = this.orgId + "." + this.mac; + channel.queueBind(queue, exchange, routingKey); + + + //������������,��������������������� + channel.basicQos(30);//��������������� + channel.basicConsume(queue, false, new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + try{ + //������MQ������������������������������������������������������������ + Map message = (Map) JSON.parse((String) JSON.parse(new String(body))); + Device device = deviceService.getDeviceByMac(mac,false); + sendDeviceInfo(message, device); + //������������ + channel.basicAck(envelope.getDeliveryTag(), true); + //������socket������������������ + if (!webSocketMap.containsKey(accountId)) { + RabbitMQUtils.closeConnectionChannel(connection, channel); + } + }catch (Exception e){ + log.error(e.getMessage()); + RabbitMQUtils.closeConnectionChannel(connection, channel); + } + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @OnClose + public void onClose() { + if (webSocketMap.containsKey(accountId)) { + webSocketMap.remove(accountId); + } + } + + //������������������������������ + @OnMessage + public void onMessage(String message, Session session) { + + } + + @OnError + public void onError(Session session, Throwable error) { + log.error(error.getMessage()); + } + + public void sendMessage(String message) throws IOException { + try { + if (session.isOpen()) { + this.session.getBasicRemote().sendText(message); + } + } catch (IOException e) { + + //log.error(e.getMessage()); + } + } + + /** + * @Description: ������������mac������accountid���������������������mac������������������ + * @Param: [param] + * @return: void + * @Author: ��������� + * @Date: 2020/9/30 + */ + private void sendDeviceInfo(Map<String, Object> param, Device device) { + + try { + Map<String, Object> sortMap = new LinkedHashMap<>(); + //��������������������������������� + sortMap.put("name", device.getName()); + sortMap.put("address", device.getAddress()); + //������������ + param.forEach((key, value) -> { + Sensor sensor = sensors.get(key); + if (!ObjectUtils.isEmpty(sensor)) { + String unit = ObjectUtils.isEmpty(sensor.getUnit()) ? "" : (String) sensor.getUnit(); + sortMap.put(sensor.getSensorKey(), value + unit); + } + }); + sendMessage(JSON.toJSONString(sortMap)); + } catch (IOException e) { + log.error("������mac������������������������"); + } + } + +} diff --git a/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml b/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml index 642d314..1c6c1fb 100644 --- a/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml +++ b/src/main/resources/mapper/HistoryFiveMinutelyMapper.xml @@ -32,4 +32,19 @@ #{mac} </foreach> </select> + + <select id="getFiveMinutesDataByMacsAndTimeSolt" resultType="map"> + select h.mac,h.time, + <foreach collection="sensorKeys" separator="," item="sensorKey"> + json->'$.${sensorKey}' AS '${sensorKey}' + </foreach> + FROM history_five_minutely_${yearAndMonth} h + WHERE mac IN + <foreach collection="macs" separator="," open="(" close=")" item="mac"> + #{mac} + </foreach> + AND time BETWEEN #{startTime} AND #{endTime} + ORDER BY h.time DESC + LIMIT #{macNumber} + </select> </mapper> \ No newline at end of file diff --git a/src/main/webapp/img/sensorLevel.png b/src/main/webapp/img/sensorLevel.png new file mode 100644 index 0000000..aedd8c9 --- /dev/null +++ b/src/main/webapp/img/sensorLevel.png Binary files differ diff --git a/src/main/webapp/view/cartrajectoryNew.jsp b/src/main/webapp/view/cartrajectoryNew.jsp new file mode 100644 index 0000000..32798c1 --- /dev/null +++ b/src/main/webapp/view/cartrajectoryNew.jsp @@ -0,0 +1,566 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title></title> + <script type="text/javascript" + src="http://api.map.baidu.com/api?v=2.0&ak=rER1sgBIcQxkfNSlm2wmBGZGgEERrooM"></script> + <script type="text/javascript" src="/js/jquery.min.js"></script> +</head> +<style type="text/css"> + body, + html, + #mapCanvas { + width: 100%; + height: 100%; + overflow: hidden; + margin: 0; + z-index: 0; + font-size: 14px; + font-family: "������������"; + } + + .main_body { + border: 0; + margin: 0; + width: 100%; + height: 100%; + position: relative; + } + + * { + margin: 0; + padding: 0; + list-style: none; + } + + #cpm { + width: 300px; + height: 100px; + position: absolute; + background-color: #ffffff; + display: none; + left: 50%; + top: 50%; + margin-left: -150px; + margin-top: -50px; + z-index: 11; + color: #000000; + border: 2px solid #FF7F50; + font-size: 28px; + line-height: 100px; + text-align: center; + } + + .BMap_pop > img { + top: 42px !important; + margin-left: -10px; + } + + .BMap_pop div:nth-child(1) div { + display: none; + } + + .BMap_pop div:nth-child(3) { + display: none; + } + + .BMap_pop div:nth-child(5) { + display: none; + } + + .BMap_pop div:nth-child(7) { + display: none; + } + + .BMap_pop div:nth-child(9) { + top: 35px !important; + border-radius: 5px; + } + + #selectSenor { + position: absolute; + z-index: 1; + left: 30px; + top: 20px; + font-size: 20px; + background: lightgrey; + } + + button { + font-size: 15px; + } + + .sensorLevel { + position: absolute; + z-index: 1; + bottom: 20px; + right: 10px; + width: 100px; + height: 200px; + } + +</style> + +<body> +<div class="main_body"> + <div id="selectSenor"> + <input type="radio" value="e1" name="sensor" checked>PM2.5 + <input type="radio" value="e2" name="sensor">PM10 + <input type="radio" value="e17" name="sensor">TVOC + </div> + + <img src="/img/sensorLevel.png" class="sensorLevel"> + <div id="cpm">���������������������</div> + <div id="mapCanvas"></div> <!-- ������������ --> +</div> +</body> +</html> + +<script type="text/javascript"> + var GPS = { + PI: 3.14159265358979324, + x_pi: 3.14159265358979324 * 3000.0 / 180.0, + delta: function (lat, lon) { + var a = 6378245.0; // a: ������������������������������������������������������������������ + var ee = 0.00669342162296594323; // ee: ��������������������� + var dLat = this.transformLat(lon - 105.0, lat - 35.0); + var dLon = this.transformLon(lon - 105.0, lat - 35.0); + var radLat = lat / 180.0 * this.PI; + var magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + var sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * this.PI); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * this.PI); + return {'lat': dLat, 'lon': dLon}; + }, + + //WGS-84 to GCJ-02 + gcj_encrypt: function (wgsLat, wgsLon) { + if (this.outOfChina(wgsLat, wgsLon)) + return {'lat': wgsLat, 'lon': wgsLon}; + + var d = this.delta(wgsLat, wgsLon); + return {'lat': wgsLat + d.lat, 'lon': wgsLon + d.lon}; + }, + //GCJ-02 to WGS-84 + gcj_decrypt: function (gcjLat, gcjLon) { + if (this.outOfChina(gcjLat, gcjLon)) + return {'lat': gcjLat, 'lon': gcjLon}; + + var d = this.delta(gcjLat, gcjLon); + return {'lat': gcjLat - d.lat, 'lon': gcjLon - d.lon}; + }, + //GCJ-02 to WGS-84 exactly + gcj_decrypt_exact: function (gcjLat, gcjLon) { + var initDelta = 0.01; + var threshold = 0.000000001; + var dLat = initDelta, dLon = initDelta; + var mLat = gcjLat - dLat, mLon = gcjLon - dLon; + var pLat = gcjLat + dLat, pLon = gcjLon + dLon; + var wgsLat, wgsLon, i = 0; + while (1) { + wgsLat = (mLat + pLat) / 2; + wgsLon = (mLon + pLon) / 2; + var tmp = this.gcj_encrypt(wgsLat, wgsLon) + dLat = tmp.lat - gcjLat; + dLon = tmp.lon - gcjLon; + if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold)) + break; + + if (dLat > 0) pLat = wgsLat; else mLat = wgsLat; + if (dLon > 0) pLon = wgsLon; else mLon = wgsLon; + + if (++i > 10000) break; + } + return {'lat': wgsLat, 'lon': wgsLon}; + }, + //GCJ-02 to BD-09 + bd_encrypt: function (gcjLat, gcjLon) { + var x = gcjLon, y = gcjLat; + var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi); + var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi); + bdLon = z * Math.cos(theta) + 0.0065; + bdLat = z * Math.sin(theta) + 0.006; + return {'lat': bdLat, 'lon': bdLon}; + }, + //BD-09 to GCJ-02 + bd_decrypt: function (bdLat, bdLon) { + var x = bdLon - 0.0065, y = bdLat - 0.006; + var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi); + var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi); + var gcjLon = z * Math.cos(theta); + var gcjLat = z * Math.sin(theta); + return {'lat': gcjLat, 'lon': gcjLon}; + }, + //WGS-84 to Web mercator + //mercatorLat -> y mercatorLon -> x + mercator_encrypt: function (wgsLat, wgsLon) { + var x = wgsLon * 20037508.34 / 180.; + var y = Math.log(Math.tan((90. + wgsLat) * this.PI / 360.)) / (this.PI / 180.); + y = y * 20037508.34 / 180.; + return {'lat': y, 'lon': x}; + }, + // Web mercator to WGS-84 + // mercatorLat -> y mercatorLon -> x + mercator_decrypt: function (mercatorLat, mercatorLon) { + var x = mercatorLon / 20037508.34 * 180.; + var y = mercatorLat / 20037508.34 * 180.; + y = 180 / this.PI * (2 * Math.atan(Math.exp(y * this.PI / 180.)) - this.PI / 2); + return {'lat': y, 'lon': x}; + }, + // two point's distance + distance: function (latA, lonA, latB, lonB) { + var earthR = 6371000.; + var x = Math.cos(latA * this.PI / 180.) * Math.cos(latB * this.PI / 180.) * Math.cos((lonA - lonB) * this.PI / 180); + var y = Math.sin(latA * this.PI / 180.) * Math.sin(latB * this.PI / 180.); + var s = x + y; + if (s > 1) s = 1; + if (s < -1) s = -1; + var alpha = Math.acos(s); + var distance = alpha * earthR; + return distance; + }, + outOfChina: function (lat, lon) { + if (lon < 72.004 || lon > 137.8347) + return true; + if (lat < 0.8293 || lat > 55.8271) + return true; + return false; + }, + transformLat: function (x, y) { + var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin(y / 3.0 * this.PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(y / 12.0 * this.PI) + 320 * Math.sin(y * this.PI / 30.0)) * 2.0 / 3.0; + return ret; + }, + transformLon: function (x, y) { + var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin(x / 3.0 * this.PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(x / 12.0 * this.PI) + 300.0 * Math.sin(x / 30.0 * this.PI)) * 2.0 / 3.0; + return ret; + } + }; + + var params = ${requestScope.carTrajectoryParams}; + var sensorInfo = params["sensorInfo"]; + var map = new BMap.Map("mapCanvas", {enableMapClick: false}); + var mapStyle = { + features: ["road", "building", "water", "land"], // ������������������poi + style: "normal" // ������������������������������ + }; + map.setMapStyle(mapStyle); + + //������������ + var mapType = new BMap.MapTypeControl( + { + mapTypes: [BMAP_NORMAL_MAP, BMAP_SATELLITE_MAP], + anchor: BMAP_ANCHOR_TOP_RIGHT + } + ); + map.addControl(mapType); + map.setMapType(BMAP_SATELLITE_MAP);//������������������������������������������ + var navigation = new BMap.NavigationControl({ + anchor: BMAP_ANCHOR_BOTTOM_LEFT, + type: BMAP_NAVIGATION_CONTROL_LARGE + }); + map.addControl(navigation);//������������ + map.enableScrollWheelZoom(true); // ������������������������ + map.addControl(new BMap.ScaleControl()); + if (sensorInfo.length === 0) { + showNoFlightTrajectory(); + } + var trackPoints = [];//��������������������������������������������������������� + var points = []; + //������������ + var size = 50; + var distance = size / 2 / Math.sin(1 * Math.PI / 4); + //������������������ + var sensor = $("input[type='radio']:checked").val(); + for (var i = 0; i < sensorInfo.length; i++) { + if (typeof (sensorInfo[i]["e76"]) == "undefined") { + sensorInfo.splice(i, 1); + i--; + } else { + var lon = parseFloat(sensorInfo[i].e76.substr(0, sensorInfo[i].e76.length - 1)); + var lat = parseFloat(sensorInfo[i].e77.substr(0, sensorInfo[i].e77.length - 1)); + if (lon > 150 || lon < 70 || lat <= 20 || lat > 60) { + sensorInfo.splice(i, 1); + i--; + } + if (i > 1) { + if (sensorInfo[i]["e76"] === sensorInfo[i - 1]["e76"] && sensorInfo[i]["e77"] === sensorInfo[i - 1]["e77"]) { + sensorInfo.splice(i, 1); + i--; + } + } + } + } + + points = getShowPoints(); + + map.centerAndZoom(points, 13);// ������������������������������������ + map.setViewport(points);// ������������������������������������������������������ + drawPolygon(sensor);//��������� + drawLine();//������������ + drawStartAndEnd();//��������������������� + + //������������������ + function showNoFlightTrajectory() { + var point = new BMap.Point(120.987287, 31.391562); + map.centerAndZoom(point, 17); + setTimeout(function () { + document.getElementById("cpm").style.display = 'block'; + }, 250); + } + + //���������������������������������������������distance������ + function getPoint(angle, lng, lat, distance) { + var EARTH_RADIUS = 6378137; + //��������������������������������������� + var ra = distance / EARTH_RADIUS; + // ���������radian��������������������������� + angle = angle / 180 * Math.PI; + lng = lng / 180 * Math.PI; + lat = lat / 180 * Math.PI; + lng = lng + Math.atan2(Math.sin(angle) * Math.sin(ra) * Math.cos(lat), Math.cos(ra) - Math.sin(lat) * Math.sin(lat)); + lat = Math.asin(Math.sin(lat) * Math.cos(ra) + Math.cos(lat) * Math.sin(ra) * Math.cos(angle)); + // ���������������10��������������� + lng = lng * 180 / Math.PI; + lat = lat * 180 / Math.PI; + return new BMap.Point(lng, lat); + } + + //��������������������� + function getColor(senosor, data) { + var color; + switch (sensor) { + case 'e1': + if (data < 35) { + color = '#0FB820'; + } else if (data < 75) { + color = '#B8B002'; + } else if (data < 115) { + color = '#E55F03'; + } else if (data < 150) { + color = '#C9031B'; + } else if (data < 250) { + color = '#C00160'; + } else { + color = '#BC0238'; + } + break; + case 'e2': + if (data < 50) { + color = '#0FB820'; + } else if (data < 150) { + color = '#B8B002'; + } else if (data < 250) { + color = '#E55F03'; + } else if (data < 350) { + color = '#C9031B'; + } else if (data < 420) { + color = '#C00160'; + } else { + color = '#BC0238'; + } + break; + case 'e17': + if (data < 1.5) { + color = '#0FB820'; + } else if (data < 3) { + color = '#B8B002'; + } else if (data < 5) { + color = '#E55F03'; + } else { + color = '#BC0238'; + } + break; + default: + color = '#0FB820'; + break; + } + return color; + } + + //��������������������������������� + function drawPolygon(sensor) { + $.each(points, function (item, point) { + var sw = getPoint(225, point.lng, point.lat, distance); + var ne = getPoint(45, point.lng, point.lat, distance); + var data = point[sensor]; + //������������������������������������ + color = getColor(sensor, data); + var polygon = new BMap.Polygon([ + new BMap.Point(sw.lng, sw.lat),//��������� + new BMap.Point(ne.lng, sw.lat),//��������� + new BMap.Point(ne.lng, ne.lat),//��������� + new BMap.Point(sw.lng, ne.lat)//��������� + ], {strokeWeight: 0.5, strokeOpacity: 0.5, fillColor: color}); + map.addOverlay(polygon); + //���������������label������ + setLabelStyle(data, point); + }); + } + + //��������������������� + function drawLine() { + //������������������������ + var sy = new BMap.Symbol(BMap_Symbol_SHAPE_BACKWARD_OPEN_ARROW, { + scale: 0.6,//������������������ + strokeColor: 'white',//������������������������������������ + strokeWeight: 3,//������������ + }); + var icons = new BMap.IconSequence(sy, '100%', '4%', false);//���������true������������������������������ + //������������������������ + var trackLine = new BMap.Polyline(points, { + strokeColor: "red",//������������ + strokeWeight: 4,//������ + strokeOpacity: 0.3,//���������������������������������0 - 1 + enableEditing: false,//���������������������������������false + enableClicking: false,//������������������������������������true + icons: [icons], + }); + map.addOverlay(trackLine); + } + + //��������������������� + function drawStartAndEnd() { + var startIcon = new BMap.Icon("/img/start.png", new BMap.Size(48, 48)); + var startMark = new BMap.Marker(points[0], {icon: startIcon, offset: new BMap.Size(0, -20)}); + map.addOverlay(startMark); + var endIcon = new BMap.Icon("/img/end.png", new BMap.Size(48, 48)); + var endMark = new BMap.Marker(points[points.length - 1], {icon: endIcon, offset: new BMap.Size(0, -20)}); + map.addOverlay(endMark); + } + + //������������>=50m���������points + function getShowPoints() { + points.push(convertPoint(0)); + for (var i = 1; i < sensorInfo.length; i++) { + var flag = true; + var point1 = convertPoint(i); + var sw1 = getPoint(225, point1.lng, point1.lat, distance); + var ne1 = getPoint(45, point1.lng, point1.lat, distance); + for (var j = 0; j < points.length; j++) { + var point2 = points[j]; + var dis = parseInt(map.getDistance(point1, point2)); + if (dis < size) { + flag = false; + } + } + if (flag) { + points.push(point1); + } + } + return points; + } + + //point���������label������ + function setLabelStyle(content, point) { + var label = new BMap.Label("<span class='my-maptip'>" + content + "<br /><span>",//���lable������������ + { + offset: new BMap.Size(-8, -10),//label������������������������label������������������������ + position: point + } + );//label��������� + + var offsetSize = new BMap.Size(0, 0); + var size = "10px"; + if (map.getZoom() <= 16) { + size = "0px"; + } + var labelStyle = { + border: "0", + fontSize: size, + height: "20px", + lineHeight: "20px", + fontFamily: "������������", + backgroundColor: "0.05", + fontWeight: "bold" + }; + label.setStyle(labelStyle); + map.addOverlay(label); + } + + //������������������������ + map.addEventListener("zoomend", function () { + //��������������������������������������� + var zoom = this.getZoom(); + $('span.my-maptip').parent()[zoom <= 16 ? 'hide' : 'show'](); + $('span.my-maptip').parent().css("font-size", 30 - zoom); + }); + + $("#selectSenor").change(function () { + map.clearOverlays() + sensor = $("input[type='radio']:checked").val(); + drawPolygon(sensor); + drawLine(); + drawStartAndEnd(); + }) + + //������������������ + function convertPoint(index) { + var value = sensorInfo[index]; + if (typeof (value.e76) == "undefined") { + showNoFlightTrajectory(); + } + var lon = parseFloat(value.e76.substr(0, value.e76.length - 1)); + var lat = parseFloat(value.e77.substr(0, value.e77.length - 1)); + var m = GPS.gcj_encrypt(lat, lon).lon; + var n = GPS.gcj_encrypt(lat, lon).lat; + lon = GPS.bd_encrypt(n, m).lon; + lat = GPS.bd_encrypt(n, m).lat; + var point = new BMap.Point(lon, lat); + point['e1'] = parseInt(sensorInfo[index]['e1']); + point['e2'] = parseInt(sensorInfo[index]['e2']); + point['e17'] = parseFloat(sensorInfo[index]['e17']).toFixed(2); + return point; + } + + //��������������������� + function getAngle(n, next) { + var ret + var w1 = n.lat / 180 * Math.PI + var j1 = n.lng / 180 * Math.PI + + var w2 = next.lat / 180 * Math.PI + var j2 = next.lng / 180 * Math.PI + + ret = 4 * Math.pow(Math.sin((w1 - w2) / 2), 2) - Math.pow(Math.sin((j1 - j2) / 2) * (Math.cos(w1) - Math.cos(w2)), 2); + ret = Math.sqrt(ret); + + // var temp = Math.sin(Math.abs(j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2)); + var temp = Math.sin((j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2)); + ret = ret / temp; + + ret = Math.atan(ret) / Math.PI * 180; + ret += 90; + + // ������������������������if..else���������������������������������������������,������������ret������ + if (j1 - j2 < 0) { + // console.log('j1<j2') + if (w1 - w2 < 0) { + // console.log('w1<w2') + ret; + } else { + // console.log('w1>w2') + ret = -ret + 180; + } + } else { + // console.log('j1>j2') + if (w1 - w2 < 0) { + // console.log('w1<w2') + ret = 180 + ret; + } else { + // console.log('w1>w2') + ret = -ret; + } + } + return ret; + } +</script> \ No newline at end of file diff --git a/src/main/webapp/view/unorganizedMapV2.jsp b/src/main/webapp/view/unorganizedMapV2.jsp new file mode 100644 index 0000000..319ab1f --- /dev/null +++ b/src/main/webapp/view/unorganizedMapV2.jsp @@ -0,0 +1,209 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@page isELIgnored="false" %> + +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> + <script type="text/javascript" src="/js/jquery.min.js"></script> + <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=rER1sgBIcQxkfNSlm2wmBGZGgEERrooM"></script> + <script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script> + <title>���������������������</title> + <style type="text/css"> + ul,li{list-style: none;margin:0;padding:0;float:left;} + html{height:100%} + body{height:100%;margin:0px;padding:0px;font-family:"������������";} + #container{height:100%;width:100%;} + #r-result{width:100%;} + </style> +</head> +<body> +<div id="container"></div> +<div id="r-result" style="display:none"> + <input type="button" ��nclick="openHeatmap();" value="���������������"/><input type="button" ��nclick="closeHeatmap();" value="���������������"/> +</div> +<div id="mapParams" style="display: none;"> + ${requestScope.params} +</div> +</body> +</html> +<script type="text/javascript"> + var map = new BMap.Map("container", {minZoom: 14, maxZoom: 19}); + //var map = new BMap.Map("container"); // ������������������ + + var params = $.parseJSON($("#mapParams").html()); + var accountId = params["accountId"]; + var level = params["level"]; + var center = params["center"]; + var points2 = params["points"]; + + var point = new BMap.Point(center['lng'],center['lat']); + map.centerAndZoom(point, level); // ������������������������������������������������������ + //map.setCurrentCity("������"); //������������������������ + map.enableScrollWheelZoom(); // ������������������ + + var points = []; + for (var i =0;i<points2.length;i++) { + var json; + var a = points2[i]; + var b = a['']; + json = { + lng : a['lng'], + lat : a['lat'], + count : a['count'] + }; + points[i] = json; + }; + + /*var points =[ + {"lng":"120.997119","lat":"31.451714","count":"0.027"}, + {"lng":"120.99516","lat":"31.448664","count":"0.029"}, + {"lng":"120.998538","lat":"31.449289","count":"0.033"}, + {"lng":"120.998628","lat":"31.452027","count":"0.025"}, + {"lng":"121.000383","lat":"31.451469","count":"0.05"}, + {"lng":"120.999908","lat":"31.449389","count":"0.04"}, + {"lng":"120.998519","lat":"31.450588","count":"0.10"}, + ]; + alert(points[1]);*/ + + var points1 =[ + + {"lng":"114.363979","lat":"36.03773","count":"52"}, + {"lng":"114.295894","lat":"36.231772","count":"7"}, + {"lng":"114.504007","lat":"36.093311","count":"6"}, + {"lng":"114.395983","lat":"36.201385","count":"19"}, + {"lng":"114.718751","lat":"36.091966","count":"2"}, + {"lng":"114.48261","lat":"36.146032","count":"4"}, + {"lng":"114.037656","lat":"36.276956","count":"1"}, + {"lng":"114.425989","lat":"36.157907","count":"5"}, + {"lng":"114.309662","lat":"36.19489","count":"8"}, + {"lng":"114.008762","lat":"36.162515","count":"11"}, + {"lng":"114.149597","lat":"36.25203","count":"11"}, + {"lng":"114.634489","lat":"36.09711","count":"3"}, + {"lng":"114.035667","lat":"36.042826","count":"105"}, + {"lng":"114.220135","lat":"36.116061","count":"38"}, + {"lng":"114.137829","lat":"36.054525","count":"7"}, + {"lng":"114.137348","lat":"36.136101","count":"55"}, + {"lng":"114.078537","lat":"36.235848","count":"28"}, + {"lng":"114.648979","lat":"36.043749","count":"111"}, + {"lng":"114.104776","lat":"36.124067","count":"12"}, + {"lng":"114.578275","lat":"36.095941","count":"3"}, + {"lng":"114.578275","lat":"36.095941","count":"22"}, + {"lng":"114.578275","lat":"36.095941","count":"4"}, + {"lng":"113.913152","lat":"36.000907","count":"5"}, + {"lng":"113.831853","lat":"35.836377","count":"4"}, + {"lng":"113.825641","lat":"36.072186","count":"16"}, + {"lng":"113.931695","lat":"36.262638","count":"9"}, + {"lng":"113.965077","lat":"35.919748","count":"6"}, + {"lng":"113.830067","lat":"35.932444","count":"1"}, + {"lng":"113.830067","lat":"35.932444","count":"7"}, + {"lng":"113.750022","lat":"35.976316","count":"10"}, + {"lng":"113.934346","lat":"36.166723","count":"6"}, + {"lng":"113.928979","lat":"36.059528","count":"14"}, + {"lng":"113.898287","lat":"35.777936","count":"6"}, + {"lng":"113.867283","lat":"36.134905","count":"29"}, + {"lng":"113.81997","lat":"36.280506","count":"6"}, + {"lng":"113.936795","lat":"35.768474","count":"3"}, + {"lng":"113.818245","lat":"36.183143","count":"107"}, + {"lng":"113.762547","lat":"35.916163","count":"12"}, + {"lng":"113.762547","lat":"35.916163","count":"17"}, + {"lng":"114.309528","lat":"36.098035","count":"12"}, + {"lng":"114.184941","lat":"36.066066","count":"10"}, + {"lng":"114.265651","lat":"36.016851","count":"10"}, + {"lng":"114.794527","lat":"35.889239","count":"4"}, + {"lng":"114.916588","lat":"35.953233","count":"33"}, + {"lng":"114.862802","lat":"36.082315","count":"5"}, + {"lng":"114.821994","lat":"35.940167","count":"7"}, + {"lng":"114.732801","lat":"36.010095","count":"1"}, + {"lng":"114.665014","lat":"35.827956","count":"5"}, + {"lng":"114.687001","lat":"35.926633","count":"4"}, + {"lng":"114.886604","lat":"35.823869","count":"17"}, + {"lng":"114.714493","lat":"35.824384","count":"9"}, + {"lng":"114.838951","lat":"35.714762","count":"8"}, + {"lng":"114.768614","lat":"35.820543","count":"3"}, + {"lng":"114.945903","lat":"36.001222","count":"10"}, + {"lng":"114.814282","lat":"36.05379","count":"1"}, + {"lng":"114.89458","lat":"36.128534","count":"2"}, + {"lng":"114.768884","lat":"36.09376","count":"3"}, + {"lng":"114.891728","lat":"35.996425","count":"9"}, + {"lng":"114.899498","lat":"35.683682","count":"2"}, + {"lng":"114.436397","lat":"35.942211","count":"13"}, + {"lng":"114.537118","lat":"35.959195","count":"5"}, + {"lng":"114.374189","lat":"35.92115","count":"21"}, + {"lng":"114.435536","lat":"35.884432","count":"1"}, + {"lng":"114.434839","lat":"35.885617","count":"23"}, + {"lng":"114.468909","lat":"35.952258","count":"17"}, + {"lng":"114.358104","lat":"35.944822","count":"27"}, + {"lng":"114.647021","lat":"35.968271","count":"6"}, + {"lng":"114.483172","lat":"35.862866","count":"3"}, + {"lng":"114.589631","lat":"35.856694","count":"4"}, + {"lng":"114.37365","lat":"35.930392","count":"1"}, + {"lng":"114.322755","lat":"35.82315","count":"26"}, + {"lng":"114.322755","lat":"35.82315","count":"6"}, + {"lng":"114.376392","lat":"36.013433","count":"3"}, + {"lng":"114.447681","lat":"36.052479","count":"6"}, + {"lng":"114.447681","lat":"36.052479","count":"13"}, + {"lng":"114.31517","lat":"36.117569","count":"5"} + + + ];//������������������������ + + + if(!isSupportCanvas()){ + alert('���������������������������canvas������������������,���������������������������������������������������~') + } + //���������������,������������heatmap.js��������� https://github.com/pa7/heatmap.js/blob/master/README.md + //������������������: + /* visible ���������������������,���������true + * opacity ������������������,1-100 + * radius ������������������������������������ + * gradient {JSON} ������������������������ . gradient������������ + * { + .2:'rgb(0, 255, 255)', + .5:'rgb(0, 110, 255)', + .8:'rgb(100, 0, 255)' + } + ������ key ���������������������, 0~1. + value ������������. + */ + heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":100,"visible":true}); + map.addOverlay(heatmapOverlay); + heatmapOverlay.setDataSet({data:points,max:0.13}); + + //closeHeatmap(); + + + + //���������������������������canvas + function isSupportCanvas(){ + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + } + + function setGradient(){ + /*������������������: + { + 0:'rgb(102, 255, 0)', + .5:'rgb(255, 170, 0)', + 1:'rgb(255, 0, 0)' + }*/ + var gradient = {}; + var colors = document.querySelectorAll("input[type='color']"); + colors = [].slice.call(colors,0); + colors.forEach(function(ele){ + gradient[ele.getAttribute("data-key")] = ele.value; + }); + heatmapOverlay.setOptions({"gradient":gradient}); + } + + function openHeatmap(){ + heatmapOverlay.show(); + } + + function closeHeatmap(){ + heatmapOverlay.hide(); + } +</script> + -- Gitblit v1.8.0