| | |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.moral.mapper.AQIMapper; |
| | | import com.moral.mapper.AreaMapper; |
| | | import com.moral.mapper.CityMapper; |
| | | import com.moral.mapper.DeviceMapper; |
| | | import com.moral.mapper.WeatherMapper; |
| | | import com.moral.mapper.HistoryHourlyMapper; |
| | | import com.moral.mapper.MonitorPointMapper; |
| | | import com.moral.mapper.ProvinceMapper; |
| | | import com.moral.service.WeatherService; |
| | | |
| | | @Service |
| | |
| | | @Resource |
| | | private HistoryHourlyMapper historyHourlyMapper; |
| | | |
| | | //O3,PM2.5,PM10预测数据插入forecast_weather表 |
| | | @Override |
| | | public int insertForecastWeatherNew() throws ParseException { |
| | | Calendar c = Calendar.getInstance(); |
| | |
| | | cityList.add(ks); |
| | | int count = 0; |
| | | for (Map<String, Object> map : cityList) { |
| | | String cityCode = map.get("cityCode").toString(); |
| | | String id = map.get("cityId").toString(); |
| | | Map<String, Object> dataMap = restTemplate.getForObject("https://api.heweather.net/v7/weather/72h?key=da05c6c4852d4f7aa3364a9236ee9e26&gzip=n&location={1}", Map.class, id); |
| | | if (dataMap == null) { |
| | |
| | | List<Map<String, Object>> hourlyList = (List<Map<String, Object>>) JSONObject.parse(string); |
| | | for (Map<String, Object> hourlyMap : hourlyList) { |
| | | //逐小时预报时间 |
| | | String fxTime = hourlyMap.get("fxTime").toString().split("\\+")[0].replace("T", " ") + ":00"; |
| | | hourlyMap.remove("fxTime"); |
| | | String fxTime = hourlyMap.remove("fxTime").toString().split("\\+")[0].replace("T", " ") + ":00"; |
| | | //icon为不需要字段 |
| | | hourlyMap.remove("icon"); |
| | | hourlyMap.put("time", fxTime); |
| | | //天气 |
| | | String text = hourlyMap.get("text").toString(); |
| | | //风速km/h->m/s |
| | | Double windSpeed = Double.valueOf(hourlyMap.get("windSpeed").toString()); |
| | | double windSpeed = Double.parseDouble(hourlyMap.get("windSpeed").toString()); |
| | | windSpeed = windSpeed * 1000 / 3600; |
| | | hourlyMap.put("windSpeed", df.format(windSpeed)); |
| | | String condition = ""; |
| | | if ("晴".equals(text)) { |
| | | condition = "100"; |
| | | } else if ("雾".equals(text)) { |
| | | condition = "90"; |
| | | } else if ("多云".equals(text)) { |
| | | condition = "80"; |
| | | } else if ("霾".equals(text)) { |
| | | condition = "70"; |
| | | } else if ("阴".equals(text) || "扬沙".equals(text) || "浮尘".equals(text) || "".equals(text)) { |
| | | condition = "60"; |
| | | } else if ("阵雨".equals(text)) { |
| | | condition = "45"; |
| | | } else if ("雷阵雨".equals(text)) { |
| | | condition = "40"; |
| | | } else if ("雷阵雨转小雨".equals(text) || "阵雨转小雨".equals(text)) { |
| | | condition = "30"; |
| | | } else if ("小雨".equals(text)) { |
| | | condition = "20"; |
| | | } else if ("雨".equals(text)) { |
| | | condition = "10"; |
| | | } else if ("雷阵雨转中雨".equals(text)) { |
| | | condition = "5"; |
| | | } else if ("雷阵雨转大雨".equals(text)) { |
| | | condition = "4"; |
| | | } else if ("中雨".equals(text) || "大雨".equals(text) || "暴雨".equals(text) |
| | | || "小雪".equals(text) || "中雪".equals(text) || "大雪".equals(text) |
| | | || "雨夹雪".equals(text) || "雨夹雪(伴有冰雹)".equals(text) || "暴雪".equals(text) |
| | | ) { |
| | | condition = "0"; |
| | | } else { |
| | | condition = "50"; |
| | | } |
| | | hourlyMap.put("condition", condition); |
| | | hourlyMap.put("windScale", String.valueOf(getWindScale(windSpeed))); |
| | | hourlyMap.put("condition", getWeatherCondition(text)); |
| | | String hour = fxTime.split(" ")[0]; |
| | | String hour1 = fxTime.split(":")[0]; |
| | | if (hour.equals(nextDay)) { |
| | |
| | | } |
| | | nextDayList.remove(0); |
| | | map.put("data", nextDayList); |
| | | } |
| | | //计算 |
| | | c.setTime(sdf.parse(today)); |
| | | c.add(Calendar.YEAR, -3); |
| | | Date start = c.getTime(); |
| | | Date end = sdf.parse(today); |
| | | int timeUnits1 = c.get(Calendar.YEAR); |
| | | int timeUnits2 = timeUnits1 + 1; |
| | | int timeUnits3 = timeUnits1 + 2; |
| | | int timeUnits4 = timeUnits1 + 3; |
| | | //当天前15天 70%,当天前45天15%,其他 15% |
| | | c.setTime(end); |
| | | c.add(Calendar.DAY_OF_MONTH, -15); |
| | | //前15天分割时间 |
| | | Date slicedTime1 = c.getTime(); |
| | | //前45天分割时间 |
| | | c.add(Calendar.DAY_OF_MONTH, -30); |
| | | Date slicedTime2 = c.getTime(); |
| | | |
| | | //today:今天 |
| | | c.setTime(sdf.parse(today)); |
| | | c.add(Calendar.YEAR, -3); |
| | | Date start = c.getTime(); |
| | | Date end = sdf.parse(today); |
| | | int timeUnits1 = c.get(Calendar.YEAR); |
| | | int timeUnits2 = timeUnits1 + 1; |
| | | int timeUnits3 = timeUnits1 + 2; |
| | | int timeUnits4 = timeUnits1 + 3; |
| | | //当天前15天 70%,当天前45天15%,其他 15% |
| | | c.setTime(end); |
| | | c.add(Calendar.DAY_OF_MONTH, -15); |
| | | //前15天分割时间 |
| | | Date slicedTime1 = c.getTime(); |
| | | //前45天分割时间 |
| | | c.add(Calendar.DAY_OF_MONTH, -30); |
| | | Date slicedTime2 = c.getTime(); |
| | | for (Map<String, Object> map : cityList) { |
| | | String cityCode = map.get("cityCode").toString(); |
| | | ArrayList<Map<String, Object>> dataList = (ArrayList<Map<String, Object>>) map.get("data"); |
| | | for (Map<String, Object> dataMap : dataList) { |
| | | //每个城市结果存放list |
| | | List<Map<String, Object>> resultList = new ArrayList<>(); |
| | | for (Map<String, Object> nextDayMap : nextDayList) { |
| | | Map<String, Object> hashMap = new HashMap<>(); |
| | | List<String> hours = new ArrayList<>(); |
| | | hashMap.put("cityCode", cityCode); |
| | | hashMap.put("start", start); |
| | | hashMap.put("end", end); |
| | | hashMap.put("typeFormat", "%Y-%m-%d %H:%i:%s"); |
| | | Integer condition = Integer.valueOf(dataMap.get("condition").toString()); |
| | | Double temp = Double.valueOf(dataMap.get("temp").toString()); |
| | | Integer pressure = Integer.valueOf(dataMap.get("pressure").toString()); |
| | | String time = dataMap.get("time").toString(); |
| | | int condition = Integer.parseInt(nextDayMap.get("condition").toString()); |
| | | double temp = Double.parseDouble(nextDayMap.get("temp").toString()); |
| | | int pressure = Integer.parseInt(nextDayMap.get("pressure").toString()); |
| | | String time = nextDayMap.remove("time").toString(); |
| | | //月份,pm2.5,pm10去往年同月取 |
| | | String month = time.substring(5, 7); |
| | | //明日此小时风向 |
| | | String windDir = nextDayMap.get("windDir").toString(); |
| | | double windSpeed = Double.parseDouble(nextDayMap.get("windSpeed").toString()); |
| | | //当前小时 |
| | | hours.add(time.substring(11, 13)); |
| | | c.setTime(sdf1.parse(time)); |
| | |
| | | Double avg2 = getAvgO3(params, times2); |
| | | Double avg3 = getAvgO3(params, times3); |
| | | Double resultO3 = avg1 * 0.7 + avg2 * 0.15 + avg3 * 0.15; |
| | | dataMap.put("O3C", String.valueOf(Math.round(resultO3))); |
| | | } |
| | | |
| | | List<Map<String, Object>> resultList = new ArrayList<>(); |
| | | for (Map<String, Object> dataMap : dataList) { |
| | | Map<String, Object> resultMap = new HashMap<>(); |
| | | String time = dataMap.remove("time").toString(); |
| | | Map<String, Object> params = new HashMap<>(); |
| | | params.put("cityCode", cityCode); |
| | | params.put("time", sdf1.parse(time)); |
| | | nextDayMap.put("O3C", String.valueOf(Math.round(resultO3))); |
| | | //pm2.5,pm10预测 |
| | | params.put("time", time); |
| | | String beam = weatherMapper.getBeam(params); |
| | | if (beam != null) { |
| | | dataMap.put("beam", beam.replace("\"", "")); |
| | | nextDayMap.put("beam", beam.replace("\"", "")); |
| | | } |
| | | //每个小时一个map |
| | | Map<String, Object> resultMap = new HashMap<>(); |
| | | resultMap.put("cityCode", cityCode); |
| | | resultMap.put("time", time); |
| | | resultMap.put("json", JSONObject.toJSONString(dataMap)); |
| | | resultMap.put("json", JSONObject.toJSONString(nextDayMap)); |
| | | resultList.add(resultMap); |
| | | } |
| | | Map<String, Object> parameters = new HashMap<>(); |
| | |
| | | Double windSpeed = Double.valueOf(nextDayMap.get("windSpeed").toString()); |
| | | windSpeed = windSpeed * 1000 / 3600; |
| | | nextDayMap.put("windSpeed", df.format(windSpeed)); |
| | | nextDayMap.put("windScale", String.valueOf(getWindScale(windSpeed))); |
| | | String text = nextDayMap.get("text").toString(); |
| | | String condition = ""; |
| | | if ("晴".equals(text)) { |
| | | condition = "100"; |
| | | } else if ("雾".equals(text)) { |
| | | condition = "90"; |
| | | } else if ("多云".equals(text)) { |
| | | condition = "80"; |
| | | } else if ("霾".equals(text)) { |
| | | condition = "70"; |
| | | } else if ("阴".equals(text) || "扬沙".equals(text) || "浮尘".equals(text) || "".equals(text)) { |
| | | condition = "60"; |
| | | } else if ("阵雨".equals(text)) { |
| | | condition = "45"; |
| | | } else if ("雷阵雨".equals(text)) { |
| | | condition = "40"; |
| | | } else if ("雷阵雨转小雨".equals(text) || "阵雨转小雨".equals(text)) { |
| | | condition = "30"; |
| | | } else if ("小雨".equals(text)) { |
| | | condition = "20"; |
| | | } else if ("雨".equals(text)) { |
| | | condition = "10"; |
| | | } else if ("雷阵雨转中雨".equals(text)) { |
| | | condition = "5"; |
| | | } else if ("雷阵雨转大雨".equals(text)) { |
| | | condition = "4"; |
| | | } else if ("中雨".equals(text) || "大雨".equals(text) || "暴雨".equals(text) |
| | | || "小雪".equals(text) || "中雪".equals(text) || "大雪".equals(text) |
| | | || "雨夹雪".equals(text) || "雨夹雪(伴有冰雹)".equals(text) || "暴雪".equals(text) |
| | | ) { |
| | | condition = "0"; |
| | | } else { |
| | | condition = "50"; |
| | | } |
| | | nextDayMap.put("condition", condition); |
| | | nextDayMap.put("condition", getWeatherCondition(text)); |
| | | } |
| | | map.put("data", nextDayList); |
| | | } |
| | |
| | | jsonMap.remove("obsTime"); |
| | | jsonMap.remove("icon"); |
| | | String text = jsonMap.get("text").toString(); |
| | | String condition; |
| | | if ("晴".equals(text)) { |
| | | condition = "100"; |
| | | } else if ("雾".equals(text)) { |
| | | condition = "90"; |
| | | } else if ("多云".equals(text)) { |
| | | condition = "80"; |
| | | } else if ("霾".equals(text)) { |
| | | condition = "70"; |
| | | } else if ("阴".equals(text) || "扬沙".equals(text) || "浮尘".equals(text) || "".equals(text)) { |
| | | condition = "60"; |
| | | } else if ("阵雨".equals(text)) { |
| | | condition = "45"; |
| | | } else if ("雷阵雨".equals(text)) { |
| | | condition = "40"; |
| | | } else if ("雷阵雨转小雨".equals(text) || "阵雨转小雨".equals(text)) { |
| | | condition = "30"; |
| | | } else if ("小雨".equals(text)) { |
| | | condition = "20"; |
| | | } else if ("雨".equals(text)) { |
| | | condition = "10"; |
| | | } else if ("雷阵雨转中雨".equals(text)) { |
| | | condition = "5"; |
| | | } else if ("雷阵雨转大雨".equals(text)) { |
| | | condition = "4"; |
| | | } else if ("中雨".equals(text) || "大雨".equals(text) || "暴雨".equals(text) |
| | | || "小雪".equals(text) || "中雪".equals(text) || "大雪".equals(text) |
| | | || "雨夹雪".equals(text) || "雨夹雪(伴有冰雹)".equals(text) || "暴雪".equals(text) |
| | | ) { |
| | | condition = "0"; |
| | | } else { |
| | | condition = "50"; |
| | | } |
| | | jsonMap.put("condition", condition); |
| | | jsonMap.put("condition", getWeatherCondition(text)); |
| | | resultMap.put("json", JSONObject.toJSONString(jsonMap)); |
| | | resultList.add(resultMap); |
| | | } |
| | | weatherMapper.deleteRealWeather(sdf1.format(now)); |
| | | return weatherMapper.insertRealWeather(resultList); |
| | | } |
| | | |
| | | private int getWindScale(Double windSpeed) { |
| | | int windScale = 0; |
| | | if (windSpeed <= 1.5) { |
| | | windScale = 1; |
| | | } else if (windSpeed <= 3.3) { |
| | | windScale = 2; |
| | | } else if (windSpeed <= 5.4) { |
| | | windScale = 3; |
| | | } else if (windSpeed <= 7.9) { |
| | | windScale = 4; |
| | | } else if (windSpeed <= 10.7) { |
| | | windScale = 5; |
| | | } else if (windSpeed <= 13.8) { |
| | | windScale = 6; |
| | | } else if (windSpeed <= 17.1) { |
| | | windScale = 7; |
| | | } else if (windSpeed <= 20.7) { |
| | | windScale = 8; |
| | | } else if (windSpeed <= 24.4) { |
| | | windScale = 9; |
| | | } else if (windSpeed <= 28.4) { |
| | | windScale = 10; |
| | | } else if (windSpeed <= 32.6) { |
| | | windScale = 11; |
| | | }else if (windSpeed <= 36.9) { |
| | | windScale = 12; |
| | | } |
| | | return windScale; |
| | | } |
| | | |
| | | private String getWeatherCondition(String text) { |
| | | String condition; |
| | | if ("晴".equals(text)) { |
| | | condition = "100"; |
| | | } else if ("雾".equals(text)) { |
| | | condition = "90"; |
| | | } else if ("多云".equals(text)) { |
| | | condition = "80"; |
| | | } else if ("霾".equals(text)) { |
| | | condition = "70"; |
| | | } else if ("阴".equals(text) || "扬沙".equals(text) || "浮尘".equals(text) || "".equals(text)) { |
| | | condition = "60"; |
| | | } else if ("阵雨".equals(text)) { |
| | | condition = "45"; |
| | | } else if ("雷阵雨".equals(text)) { |
| | | condition = "40"; |
| | | } else if ("雷阵雨转小雨".equals(text) || "阵雨转小雨".equals(text)) { |
| | | condition = "30"; |
| | | } else if ("小雨".equals(text)) { |
| | | condition = "20"; |
| | | } else if ("雨".equals(text)) { |
| | | condition = "10"; |
| | | } else if ("雷阵雨转中雨".equals(text)) { |
| | | condition = "5"; |
| | | } else if ("雷阵雨转大雨".equals(text)) { |
| | | condition = "4"; |
| | | } else if ("中雨".equals(text) || "大雨".equals(text) || "暴雨".equals(text) |
| | | || "小雪".equals(text) || "中雪".equals(text) || "大雪".equals(text) |
| | | || "雨夹雪".equals(text) || "雨夹雪(伴有冰雹)".equals(text) || "暴雪".equals(text) |
| | | ) { |
| | | condition = "0"; |
| | | } else { |
| | | condition = "50"; |
| | | } |
| | | return condition; |
| | | } |
| | | } |
| | | |
| | | |