于紫祥_1901
2020-06-30 d903f312cf6a1d0fc4c5745832a9d6fa681e5141
src/main/java/com/moral/service/impl/MonitorPointServiceImpl.java
@@ -518,215 +518,228 @@
            List<Map> windList = new ArrayList<Map>();//存放每台设备的风向和经纬度
            Map<String, Object> jsonMap = new HashMap<String, Object>();//每台设备的数据
            Map<String, Object> deviceMap = null;
            for (Device device : deviceList) {
                deviceMap = new HashMap<String, Object>();
                smac = device.getMac();
                latitude = device.getLatitude();
                longitude = device.getLongitude();
            if (deviceList.size()>1){
                for (Device device : deviceList) {
                    deviceMap = new HashMap<String, Object>();
                    smac = device.getMac();
                    latitude = device.getLatitude();
                    longitude = device.getLongitude();
                jsonMap = historyHourlyService.getDataByMac(smac, Time);
                deviceMap.put("longitude", longitude);
                deviceMap.put("latitude", latitude);
                if (jsonMap != null) {
                    deviceMap.put("jsonMap", jsonMap);
                } else {
                    deviceMap.put("jsonMap", "该设备该时间点无数据");
                }
                list.add(deviceMap);
            }
            Map<String, Object> mapData = new HashMap<String, Object>();
            Map<String, Object> mapDevice;
            JSONArray windDir;
            for (Map<String, Object> objectMap : list) {
                mapDevice = new HashMap<String, Object>();
                Map<String, Object> map = null;
                if (!(objectMap.get("jsonMap") instanceof String)) {
                    mapData = (Map<String, Object>) objectMap.get("jsonMap");
                    map = (Map) JSON.parseObject((String) mapData.get("json"));
                    windDir = (JSONArray) JSONArray.toJSON(map.get("e23"));
                    JSONArray concentration = (JSONArray) JSONArray.toJSON(map.get(sensor));
                    BigDecimal bigDecimal1=new BigDecimal(0);
                    BigDecimal bigDecimal=new BigDecimal(0);
                    if (concentration!=null){
                        if (concentration.get(0) instanceof Integer){
                            bigDecimal1 =new BigDecimal(concentration.get(0).toString());
                        }else {
                            bigDecimal1= (BigDecimal) concentration.get(0);
                        }
                        if (windDir!=null){
                            if (windDir.get(0) instanceof Integer){
                                bigDecimal =new BigDecimal(windDir.get(0).toString());
                            }else {
                                bigDecimal=(BigDecimal) windDir.get(0);
                            }
                            mapDevice.put("e23", bigDecimal.doubleValue());
                            mapDevice.put("sensor", bigDecimal1.doubleValue());
                            mapDevice.put("longitude", objectMap.get("longitude"));
                            mapDevice.put("latitude", objectMap.get("latitude"));
                        }else {
                            mapDevice.put("noSensor", "无风向数据");
                            mapDevice.put("longitude", objectMap.get("longitude"));
                            mapDevice.put("latitude", objectMap.get("latitude"));
                        }
                    jsonMap = historyHourlyService.getDataByMac(smac, Time);
                    deviceMap.put("longitude", longitude);
                    deviceMap.put("latitude", latitude);
                    if (jsonMap != null) {
                        deviceMap.put("jsonMap", jsonMap);
                    } else {
                        deviceMap.put("jsonMap", "该设备该时间点无数据");
                    }
                } else {
                    mapDevice.put("info", objectMap.get("jsonMap"));
                    mapDevice.put("longitude", objectMap.get("longitude"));
                    mapDevice.put("latitude", objectMap.get("latitude"));
                }
                windList.add(mapDevice);
            }
            // if (windDir!=null){}
            Double differenceNum = 0.0;
            Map<String, Object> indexMap;
            List<Map> mapList = new ArrayList<>();
            for (int j = 0; j < windList.size(); j++) {
                for (int k = 0; k < windList.size(); k++) {
                    if (k != j) {
                        indexMap = new HashMap<String, Object>();
                        if (windList.get(k).containsKey("e23") && windList.get(j).containsKey("e23")) {
                            Double e23Numk = (Double) windList.get(k).get("e23");
                            Double e23Numj = (Double) windList.get(j).get("e23");
                            Double diff = e23Numk - e23Numj;
                            BigDecimal b = new BigDecimal(Math.abs(diff));
                            differenceNum = b.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
                            if (differenceNum > 180) {
                                differenceNum = 360 - differenceNum;
                    list.add(deviceMap);
                }
                Map<String, Object> mapData = new HashMap<String, Object>();
                Map<String, Object> mapDevice;
                JSONArray windDir;
                for (Map<String, Object> objectMap : list) {
                    mapDevice = new HashMap<String, Object>();
                    Map<String, Object> map = null;
                    if (!(objectMap.get("jsonMap") instanceof String)) {
                        mapData = (Map<String, Object>) objectMap.get("jsonMap");
                        map = (Map) JSON.parseObject((String) mapData.get("json"));
                        windDir = (JSONArray) JSONArray.toJSON(map.get("e23"));
                        JSONArray concentration = (JSONArray) JSONArray.toJSON(map.get(sensor));
                        BigDecimal bigDecimal1=new BigDecimal(0);
                        BigDecimal bigDecimal=new BigDecimal(0);
                        if (concentration!=null){
                            if (concentration.get(0) instanceof Integer){
                                bigDecimal1 =new BigDecimal(concentration.get(0).toString());
                            }else {
                                bigDecimal1= (BigDecimal) concentration.get(0);
                            }
                            indexMap.put("k", k);
                            indexMap.put("j", j);
                            indexMap.put("diff", differenceNum);
                        } else {
                            indexMap.put("k", k);
                            indexMap.put("j", j);
                            indexMap.put("info", "设备无数据");
                            if (windDir!=null){
                                if (windDir.get(0) instanceof Integer){
                                    bigDecimal =new BigDecimal(windDir.get(0).toString());
                                }else {
                                    bigDecimal=(BigDecimal) windDir.get(0);
                                }
                                mapDevice.put("e23", bigDecimal.doubleValue());
                                mapDevice.put("sensor", bigDecimal1.doubleValue());
                                mapDevice.put("longitude", objectMap.get("longitude"));
                                mapDevice.put("latitude", objectMap.get("latitude"));
                            }else {
                                mapDevice.put("noSensor", "无风向数据");
                                mapDevice.put("longitude", objectMap.get("longitude"));
                                mapDevice.put("latitude", objectMap.get("latitude"));
                            }
                        }
                    } else {
                        mapDevice.put("info", objectMap.get("jsonMap"));
                        mapDevice.put("longitude", objectMap.get("longitude"));
                        mapDevice.put("latitude", objectMap.get("latitude"));
                    }
                    windList.add(mapDevice);
                }
                // if (windDir!=null){}
                Double differenceNum = 0.0;
                Map<String, Object> indexMap;
                List<Map> mapList = new ArrayList<>();
                for (int j = 0; j < windList.size(); j++) {
                    for (int k = 0; k < windList.size(); k++) {
                        if (k != j) {
                            indexMap = new HashMap<String, Object>();
                            if (windList.get(k).containsKey("e23") && windList.get(j).containsKey("e23")) {
                                Double e23Numk = (Double) windList.get(k).get("e23");
                                Double e23Numj = (Double) windList.get(j).get("e23");
                                Double diff = e23Numk - e23Numj;
                                BigDecimal b = new BigDecimal(Math.abs(diff));
                                differenceNum = b.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
                                if (differenceNum > 180) {
                                    differenceNum = 360 - differenceNum;
                                }
                                indexMap.put("k", k);
                                indexMap.put("j", j);
                                indexMap.put("diff", differenceNum);
                            } else {
                                indexMap.put("k", k);
                                indexMap.put("j", j);
                                indexMap.put("info", "设备无数据");
                            }
//                     indexMap.put("longitude",windList.get(k).get("longitude"));
//                     indexMap.put("latitude",windList.get(k).get("latitude"));
                        mapList.add(indexMap);
                    } else {
                        continue;
                    }
                            mapList.add(indexMap);
                        } else {
                            continue;
                        }
                    }
                }
            }
            Double min = 0.0;
            int indexMin = 0;
            if (mapList.size()>0){
                if (mapList.get(0).containsKey("diff")) {
                    min = (Double) mapList.get(0).get("diff");
                    for (int q = 1; q < mapList.size(); q++) {
                        if (mapList.get(q).containsKey("diff")) {
                            if (min > (Double) mapList.get(q).get("diff")) {
                                min = (Double) mapList.get(q).get("diff");
                Double min = 0.0;
                int indexMin = 0;
                if (mapList.size()>0){
                    if (mapList.get(0).containsKey("diff")) {
                        min = (Double) mapList.get(0).get("diff");
                        for (int q = 1; q < mapList.size(); q++) {
                            if (mapList.get(q).containsKey("diff")) {
                                if (min > (Double) mapList.get(q).get("diff")) {
                                    min = (Double) mapList.get(q).get("diff");
                                    indexMin = q;
                                }
                            } else {
                                indexMin = q;
                            }
                        } else {
                            indexMin = q;
                        }
                    }
                }
            }
            Map twoDeviceMap = mapList.get(indexMin);
            List<Map> list1 = new ArrayList<Map>();           //存放风向夹角最小的两台设备的经纬度
            list1.add(windList.get((Integer) twoDeviceMap.get("k")));
            list1.add(windList.get((Integer) twoDeviceMap.get("j")));
            Double wind = 0.0;
            Double sum = 0.0;
            if (list1.get(0).containsKey("e23")) {
                if (Math.abs((Double) list1.get(0).get("e23") - (Double) list1.get(1).get("e23")) > 180) {
                    sum = (Double) list1.get(0).get("e23") + (Double) list1.get(1).get("e23");
                    wind = sum / 2 + 180;
                    if (wind > 360) {
                        wind = wind - 360;
                Map twoDeviceMap = mapList.get(indexMin);
                List<Map> list1 = new ArrayList<Map>();           //存放风向夹角最小的两台设备的经纬度
                list1.add(windList.get((Integer) twoDeviceMap.get("k")));
                list1.add(windList.get((Integer) twoDeviceMap.get("j")));
                Double wind = 0.0;
                Double sum = 0.0;
                if (list1.get(0).containsKey("e23")) {
                    if (Math.abs((Double) list1.get(0).get("e23") - (Double) list1.get(1).get("e23")) > 180) {
                        sum = (Double) list1.get(0).get("e23") + (Double) list1.get(1).get("e23");
                        wind = sum / 2 + 180;
                        if (wind > 360) {
                            wind = wind - 360;
                        }
                    } else {
                        for (Map map : list1) {
                            sum += (Double) map.get("e23");
                        }
                        wind = sum / 2;
                    }
                } else {
                    for (Map map : list1) {
                        sum += (Double) map.get("e23");
                    }
                    wind = sum / 2;
                    wind = 0.0;
                }
            } else {
                wind = 0.0;
            }
            Map<String, Object> longAndLatiMap;
            List<Map> longAndLatiList = new ArrayList<>();//经纬度夹角集合,存放的是windList中两台设备的下标和两台设备夹角与风向角的差值
            List<Map> preAngleDeviceList = new ArrayList<Map>(); //角度减去风向最小的两台设备
            if (wind != 0.0) {
                for (int f = 0; f < windList.size(); f++) {
                    for (int h = 0; h < windList.size(); h++) {
                        if (f != h) {
                            longAndLatiMap = new HashMap<String, Object>();
                            longAndLatiMap.put("h", h);
                            longAndLatiMap.put("f", f);
                            Double angle = mapUtils.getAngle(
                                    new MyLatLng((Double) windList.get(h).get("longitude"),
                                            (Double) windList.get(h).get("latitude")),
                                    new MyLatLng((Double) windList.get(f).get("longitude"),
                                            (Double) windList.get(f).get("latitude")));
                            Double angleDiff = Math.abs(angle - wind);
                            longAndLatiMap.put("angle", angleDiff);
                            longAndLatiList.add(longAndLatiMap);
                Map<String, Object> longAndLatiMap;
                List<Map> longAndLatiList = new ArrayList<>();//经纬度夹角集合,存放的是windList中两台设备的下标和两台设备夹角与风向角的差值
                List<Map> preAngleDeviceList = new ArrayList<Map>(); //角度减去风向最小的两台设备
                if (wind != 0.0) {
                    for (int f = 0; f < windList.size(); f++) {
                        for (int h = 0; h < windList.size(); h++) {
                            if (f != h) {
                                longAndLatiMap = new HashMap<String, Object>();
                                longAndLatiMap.put("h", h);
                                longAndLatiMap.put("f", f);
                                Double angle = mapUtils.getAngle(
                                        new MyLatLng((Double) windList.get(h).get("longitude"),
                                                (Double) windList.get(h).get("latitude")),
                                        new MyLatLng((Double) windList.get(f).get("longitude"),
                                                (Double) windList.get(f).get("latitude")));
                                Double angleDiff = Math.abs(angle - wind);
                                longAndLatiMap.put("angle", angleDiff);
                                longAndLatiList.add(longAndLatiMap);
                            }
                        }
                    }
                }
                Double minAngle = (Double) longAndLatiList.get(0).get("angle");
                int indexAngle = 0;
                for (int j = 0; j < longAndLatiList.size(); j++) {
                    if (minAngle > (Double) longAndLatiList.get(j).get("angle")) {
                        minAngle = (Double) longAndLatiList.get(j).get("angle");
                        indexAngle = j;
                    Double minAngle = (Double) longAndLatiList.get(0).get("angle");
                    int indexAngle = 0;
                    for (int j = 0; j < longAndLatiList.size(); j++) {
                        if (minAngle > (Double) longAndLatiList.get(j).get("angle")) {
                            minAngle = (Double) longAndLatiList.get(j).get("angle");
                            indexAngle = j;
                        }
                    }
                    //windList.get((Integer) longAndLatiList.get(indexAngle).get("f"))获得风向和经纬度
                    preAngleDeviceList.add(windList.get((Integer) longAndLatiList.get(indexAngle).get("h")));
                    preAngleDeviceList.add(windList.get((Integer) longAndLatiList.get(indexAngle).get("f")));
                    Double length = mapUtils.getDistance((Double) preAngleDeviceList.get(0).get("longitude"), (Double) preAngleDeviceList.get(0).get("latitude"),
                            (Double) preAngleDeviceList.get(1).get("longitude"), (Double) preAngleDeviceList.get(1).get("latitude"));
                    Double subLength = length/5;
                    Double subLength1 = length/6.1;
                    Double angle = mapUtils.getAngle(
                            new MyLatLng((Double) preAngleDeviceList.get(0).get("longitude"),
                                    (Double) preAngleDeviceList.get(0).get("latitude")),
                            new MyLatLng((Double) preAngleDeviceList.get(1).get("longitude"),
                                    (Double) preAngleDeviceList.get(1).get("latitude")));
                    params.put("preAngleDeviceList", preAngleDeviceList);
                    params.put("angle", angle);
                    List locationList = new ArrayList();
                    String[] firstLocation = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, (Double) preAngleDeviceList.get(0).get("longitude"),
                            (Double) preAngleDeviceList.get(0).get("latitude"), subLength);
                    String[] secondLoction = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(firstLocation[0]),
                            Double.parseDouble(firstLocation[1]), subLength);
                    String[] thirdLocation = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(secondLoction[0]),
                            Double.parseDouble(secondLoction[1]), subLength);
                    String[] fourthLoction = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(thirdLocation[0]),
                            Double.parseDouble(thirdLocation[1]), subLength);
                    String[] fivethLoction = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(fourthLoction[0]),
                            Double.parseDouble(fourthLoction[1]), subLength1);
                    locationList.add(firstLocation);
                    locationList.add(secondLoction);
                    locationList.add(thirdLocation);
                    locationList.add(fourthLoction);
                    locationList.add(fivethLoction);
                    params.put("locationList", locationList);
                    String preAngleDeviceString = JSON.toJSON(preAngleDeviceList).toString();
                    params.put("preAngleDeviceString", preAngleDeviceString);//两台添加箭头的设备
                } else {
                    params.put("preAngleDeviceString", 0);
                }
                //windList.get((Integer) longAndLatiList.get(indexAngle).get("f"))获得风向和经纬度
                preAngleDeviceList.add(windList.get((Integer) longAndLatiList.get(indexAngle).get("h")));
                preAngleDeviceList.add(windList.get((Integer) longAndLatiList.get(indexAngle).get("f")));
                Double length = mapUtils.getDistance((Double) preAngleDeviceList.get(0).get("longitude"), (Double) preAngleDeviceList.get(0).get("latitude"),
                        (Double) preAngleDeviceList.get(1).get("longitude"), (Double) preAngleDeviceList.get(1).get("latitude"));
                Double subLength = length / 5;
                Double angle = mapUtils.getAngle(
                        new MyLatLng((Double) preAngleDeviceList.get(0).get("longitude"),
                                (Double) preAngleDeviceList.get(0).get("latitude")),
                        new MyLatLng((Double) preAngleDeviceList.get(1).get("longitude"),
                                (Double) preAngleDeviceList.get(1).get("latitude")));
                params.put("preAngleDeviceList", preAngleDeviceList);
                params.put("angle", angle);
                List locationList = new ArrayList();
                String[] firstLocation = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, (Double) preAngleDeviceList.get(0).get("longitude"),
                        (Double) preAngleDeviceList.get(0).get("latitude"), subLength);
                String[] secondLoction = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(firstLocation[0]),
                        Double.parseDouble(firstLocation[1]), subLength);
                String[] thirdLocation = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(secondLoction[0]),
                        Double.parseDouble(secondLoction[1]), subLength);
                String[] fourthLoction = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(thirdLocation[0]),
                        Double.parseDouble(thirdLocation[1]), subLength);
                locationList.add(firstLocation);
                locationList.add(secondLoction);
                locationList.add(thirdLocation);
                locationList.add(fourthLoction);
                params.put("locationList", locationList);
                String preAngleDeviceString = JSON.toJSON(preAngleDeviceList).toString();
                params.put("preAngleDeviceString", preAngleDeviceString);//两台添加箭头的设备
            } else {
                params.put("preAngleDeviceString", "");
                params.put("wind", wind);
                //String preAngleDeviceString=preAngleDeviceList.
                params.put("deviceList", deviceList);
            }else {
                if (deviceList.size()!=0){
                    params.put("deviceList", deviceList.get(0));
                }else {
                    params.put("deviceList","");
                }
                params.put("preAngleDeviceString", 1);
                params.put("locationList", "");
            }
            //String preAngleDeviceString=preAngleDeviceList.
            params.put("wind", wind);
            params.put("list1", list1);
            params.put("deviceList", deviceList);
            params.put("latitudeCompany", latitudeCompany);
            params.put("longitudeCompany", longitudeCompany);
        }
        return params;
    }