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