| | |
| | | Object lower = params.get("o3Lower"); |
| | | double max; |
| | | List<Double> avgs = new ArrayList<>(); |
| | | for (int i = 8; i <= 24; i++) { |
| | | for (int i = 7; i <= 23; i++) { |
| | | List<Double> data = new ArrayList<>(); |
| | | for (Map<String, Object> dataMap : list) { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class); |
| | | if (ObjectUtils.isEmpty(dataValue.get(Constants.SENSOR_CODE_O3))){ |
| | | continue; |
| | | } |
| | | Double o3 = Double.parseDouble(dataValue.get(Constants.SENSOR_CODE_O3).toString()); |
| | | |
| | | //O3数据标记位 |
| | |
| | | } |
| | | |
| | | int hour = DateUtils.getHour((Date) dataMap.get("time")); |
| | | if (hour == 0) { |
| | | hour = 24; |
| | | } |
| | | if (hour <= i && hour >= i - 7) { |
| | | data.add(o3); |
| | | } |
| | |
| | | * @return 功能:臭氧8小时滑动值计算 |
| | | */ |
| | | public static List<Map<String, Object>> getO3_8H(List<Map<String, Object>> data) { |
| | | Date time1 = null; |
| | | Date time2 = null; |
| | | for (Map<String, Object> datum : data) { |
| | | Date time = (Date) datum.get("time"); |
| | | if (DateUtils.getHour(time) == 0) { |
| | | time2 = DateUtils.getDate(DateUtils.dateToDateString(time, DateUtils.yyyy_MM_dd_EN)); |
| | | } else { |
| | | time1 = DateUtils.getDate(DateUtils.dateToDateString(time, DateUtils.yyyy_MM_dd_EN)); |
| | | } |
| | | } |
| | | |
| | | Date date = (Date) data.get(0).get("time"); |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (int i = 8; i <= 24; i++) { |
| | | for (int i = 7; i <= 23; i++) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | if (i < 24) { |
| | | map.put("time", ObjectUtils.isEmpty(time1) ? null : DateUtils.addHours(time1, i)); |
| | | } else { |
| | | map.put("time", ObjectUtils.isEmpty(time2) ? null : time2); |
| | | } |
| | | map.put("time", DateUtils.addHours(date, i)); |
| | | List<Double> value = new ArrayList<>(); |
| | | for (Map<String, Object> dataMap : data) { |
| | | Map<String, Object> sensorValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class); |
| | | Double o3 = Double.parseDouble(sensorValue.get("O3").toString()); |
| | | Date time = (Date) dataMap.get("time"); |
| | | int hour = DateUtils.getHour(time); |
| | | if (hour == 0) { |
| | | hour = 24; |
| | | } |
| | | if (hour <= i && hour >= i - 7) { |
| | | value.add(o3); |
| | | } |
| | |
| | | public static double percentile(List<Double> data, int p) { |
| | | int n = data.size(); |
| | | Collections.sort(data); |
| | | double v = n / (100 / p); |
| | | if (n % (100 / p) == 0) { |
| | | if (v == n) { |
| | | return data.get(n - 1); |
| | | } |
| | | return (data.get((int) v - 1) + data.get((int) v)) / 2; |
| | | } |
| | | double v = MathUtils.division(MathUtils.mul(n, p),100d,1); |
| | | v = Math.ceil(v)-1; |
| | | return sciCal(data.get((int) v), 4); |
| | | } |
| | | |
| | | |
| | | |
| | | //一氧化碳周月均值计算 |
| | | public static Map<String, Object> getCOAvgOfWeekOrMonth(Map<String, Object> params) { |
| | |
| | | result.put(Constants.SENSOR_CODE_O3, percentile(data, 90)); |
| | | return result; |
| | | } |
| | | |
| | | //各因子年均值计算 |
| | | /** |
| | | * 年均值算法 |
| | | * PM2.5,PM10,CO,日均值95百分位 |
| | | * SO2,NO2,日均值98百分位 |
| | | * O3,日最大值90百分位 |
| | | * |
| | | * @param list 数据 |
| | | * @param sensorCode 因子code |
| | | */ |
| | | public static Double getAvgOfYear(List<Map<String, Object>> list, String sensorCode) { |
| | | List<Double> data = new ArrayList<>(); |
| | | for (Map<String, Object> dataMap : list) { |
| | | Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class); |
| | | Object o = dataValue.get(sensorCode); |
| | | if (ObjectUtils.isEmpty(o)) { |
| | | continue; |
| | | } |
| | | Double sensorValue = Double.parseDouble(o.toString()); |
| | | data.add(sensorValue); |
| | | } |
| | | if (data.size() == 0) { |
| | | return null; |
| | | } |
| | | |
| | | Double v = null; |
| | | if ("PM2_5".equals(sensorCode) || "PM10".equals(sensorCode) || "CO".equals(sensorCode)) { |
| | | v = percentile(data, 95); |
| | | } else if ("SO2".equals(sensorCode) || "NO2".equals(sensorCode)) { |
| | | v = percentile(data, 98); |
| | | } else if ("O3".equals(sensorCode)) { |
| | | v = percentile(data, 90); |
| | | } |
| | | return v; |
| | | } |
| | | } |