From 3be7bd55ff0a4ab2ed25b46cdfd1dede92300ea3 Mon Sep 17 00:00:00 2001 From: jinpengyong <jpy123456> Date: Thu, 26 Aug 2021 11:15:29 +0800 Subject: [PATCH] kafa数据从redis获取型号,当前组织下走航车设备列表 --- screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 229 insertions(+), 8 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java index 0ee5973..c9701ec 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java +++ b/screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java @@ -1,25 +1,28 @@ package com.moral.api.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.Device; import com.moral.api.entity.HistoryFiveMinutely; import com.moral.api.entity.MonitorPoint; import com.moral.api.mapper.HistoryFiveMinutelyMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.api.pojo.dto.Wind.WindData; import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO; import com.moral.api.pojo.form.device.MonitorPointQueryForm; import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm; import com.moral.api.service.HistoryFiveMinutelyService; import com.moral.api.service.MonitorPointService; import com.moral.constant.RedisConstants; +import com.moral.util.DateUtils; +import io.lettuce.core.GeoCoordinates; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * <p> @@ -36,6 +39,8 @@ MonitorPointService monitorPointService; @Autowired RedisTemplate redisTemplate; + @Autowired + HistoryFiveMinutelyMapper historyFiveMinutelyMapper; @Override public List<DeviceAndFiveMinuteDataDTO> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form) { @@ -56,17 +61,233 @@ for (Device device : devices) { DeviceAndFiveMinuteDataDTO dto = new DeviceAndFiveMinuteDataDTO(); String mac = device.getMac(); + //������������������ Map<String, Object> sensorValues = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DATA_FIVE_MINUTES, mac); - Map<String,Object> value = new HashMap<>(); + //������������������������������������ + HistoryFiveMinutely dbHistoryFiveMinutely = queryLastDataByMac(mac); + if(ObjectUtils.isEmpty(dbHistoryFiveMinutely)) + continue; + String dbDataStr = dbHistoryFiveMinutely.getValue(); + sensorValues = JSON.parseObject(dbDataStr, HashMap.class); + Map<String,Object> sensorValue = new HashMap<>(); if (sensorValues!=null&&sensorValues.get(sensorCode) != null) - value.put(sensorCode,sensorValues.get(sensorCode)); + sensorValue.put(sensorCode,sensorValues.get(sensorCode)); else - value.put(sensorCode,null); + sensorValue.put(sensorCode,null); dto.setDevice(device); - dto.setSensorValue(value); + dto.setSensorValue(sensorValue); dtos.add(dto); } return dtos; } + @Override + public HistoryFiveMinutely queryLastDataByMac(String mac) { + QueryWrapper<HistoryFiveMinutely> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mac",mac); + queryWrapper.orderByDesc("time"); + queryWrapper.last("limit 0,1"); + List<HistoryFiveMinutely> historyFiveMinutelies = historyFiveMinutelyMapper.selectList(queryWrapper); + if(ObjectUtils.isEmpty(historyFiveMinutelies)) + return null; + return historyFiveMinutelies.get(0); + } + + + @Override + public List<Object> getAreaWindData(Map<String, Object> params) { + String timeUnits = DateUtils.dateToDateString(new Date(), DateUtils.yyyyMM_EN); + params.put("timeUnits", timeUnits); + //������������ + List<WindData> windData = historyFiveMinutelyMapper.getAreaWindData(params); + return getWindData(windData); + } + + + /** + * ������������������������������������������ + * + * @param geoCoordinateList + * @return + */ + public Map<String, Double> getCenterPoint(List<GeoCoordinates> geoCoordinateList) { + int total = geoCoordinateList.size(); + double X = 0, Y = 0, Z = 0; + for (GeoCoordinates g : geoCoordinateList) { + double lat, lon, x, y, z; + lat = (double) g.getY() * Math.PI / 180; + lon = (double) g.getX() * Math.PI / 180; + x = Math.cos(lat) * Math.cos(lon); + y = Math.cos(lat) * Math.sin(lon); + z = Math.sin(lat); + X += x; + Y += y; + Z += z; + } + + X = X / total; + Y = Y / total; + Z = Z / total; + double Lon = Math.atan2(Y, X); + double Hyp = Math.sqrt(X * X + Y * Y); + double Lat = Math.atan2(Z, Hyp); + + Map<String, Double> map = new HashMap<>(); + map.put("lng", Lon * 180 / Math.PI); + map.put("lat", Lat * 180 / Math.PI); + return map; + } + + public List<Object> getWindData(List<WindData> windData) { + List<GeoCoordinates> points = new ArrayList<>(); + int length = 2000; + int perdlen = 200; + Double loma = 0d; + Double lomi = 0d; + Double lama = 0d; + Double lami = 0d; + List<Double> loList = new ArrayList<>(); + List<Double> laList = new ArrayList<>(); + Double U; + Double V; + //��������� + List<Object> list = new ArrayList<>(); + List<Map<String, Object>> mapList = new ArrayList<>(); + for (WindData data : windData) { + Double longitude = data.getLongitude(); + Double latitude = data.getLatitude(); + GeoCoordinates geoCoordinates = GeoCoordinates.create(longitude, latitude); + points.add(geoCoordinates); + loList.add(longitude); + laList.add(latitude); + + Map<String, Object> map = new HashMap<>(); + Double windDir = data.getWindDir(); + Double windSpeed = data.getWindSpeed(); + if (windDir == null) { + windDir = 0d; + windSpeed = 0d; + } + double dir = (360.0 - (windDir + 180.0) * Math.PI / 180.0); + U = windSpeed * Math.cos(dir); + V = windSpeed * Math.sin(dir); + map.put("lo", longitude); + map.put("la", latitude); + map.put("U", U); + map.put("V", V); + mapList.add(map); + } + + //������������������������������������������������ + Map<String, Double> centerPoint = getCenterPoint(points); + + if (loList.size() > 0) { + loma = Collections.max(loList); + lomi = Collections.min(loList); + } + if (laList.size() > 0) { + lama = Collections.max(laList); + lami = Collections.min(laList); + } + Map<String, Object> laLaMap = new HashMap<>(); + laLaMap.put("maxLo", loma); + laLaMap.put("minLo", lomi); + laLaMap.put("maxLa", lama); + laLaMap.put("minLa", lami); + + Double lo1 = lomi - length * 0.00001141; + Double lo2 = loma + length * 0.00001141; + Double la2 = lami - length * 0.00000899; + Double la1 = lama + length * 0.00000899; + + double dx = 0.00001141 * perdlen; + double dy = 0.00000899 * perdlen; + int nx = (int) Math.floor((lo2 - lo1) / dx); + int ny = (int) Math.floor((la1 - la2) / dy); + + + List<Double> uList = new ArrayList<>(); + List<Double> vList = new ArrayList<>(); + int x; + int y; + + for (int i = 0; i < mapList.size(); i++) { + Double lo = (Double) mapList.get(i).get("lo"); + Double la = (Double) mapList.get(i).get("la"); + x = (int) Math.floor((lo - lo1) / dx); + y = Math.abs((int) Math.floor((la - la1) / dy)); + U = (Double) mapList.get(i).get("U"); + V = (Double) mapList.get(i).get("V"); + if (i == 0) { + for (int j = 0; j < nx * ny; j++) { + uList.add(0.0); + vList.add(0.0); + } + } + for (int j = 0; j < nx * ny; j++) { + if (i == 0) { + if ((y >= 2 && j == (y) * nx + x)) { + int k; + for (k = j - 2 * nx; k <= j + 2 * nx; k = k + nx) { + uList.set(k, U); + uList.set(k - 1, U); + uList.set(k - 2, U); + uList.set(k + 1, U); + uList.set(k + 2, U); + vList.set(k, V); + vList.set(k - 1, V); + vList.set(k - 2, V); + vList.set(k + 1, V); + vList.set(k + 2, V); + } + } + } else { + if (y >= 1 && j == y * nx + x) { + int k; + for (k = j - 2 * nx; k <= j + 2 * nx; ) { + uList.set(k - 1, U); + uList.set(k - 2, U); + uList.set(k + 1, U); + uList.set(k + 2, U); + vList.set(k - 1, V); + vList.set(k - 2, V); + vList.set(k + 1, V); + vList.set(k + 2, V); + k = k + nx; + } + uList.set(j, U); + vList.set(j, V); + } + } + } + } + String uData = "\"" + "data" + "\"" + ": " + uList; + String vData = "\"" + "data" + "\"" + ": " + vList; + + String header1 = "\"" + "header" + "\"" + ": " + "{" + "\"" + "parameterUnit" + "\"" + ": " + "\"" + "m/s" + "\"" + ", " + "\"" + "parameterNumber" + "\"" + ": " + 2 + + ", " + "\"" + "dx" + "\"" + ": " + dx + ", " + "\"" + "dy" + "\"" + ": " + dy + + ", " + "\"" + "parameterNumberName" + "\"" + ": " + "\"" + "eastward_wind" + "\"" + ", " + "\"" + "la1" + "\"" + ": " + la1 + ", " + "\"" + "la2" + "\"" + ": " + la2 + + ", " + "\"" + "parameterCategory" + "\"" + ": " + 2 + ", " + "\"" + "lo1" + "\"" + ": " + lo1 + ", " + "\"" + "lo2" + "\"" + ": " + lo2 + + ", " + "\"" + "nx" + "\"" + ": " + nx + ", " + "\"" + "ny" + "\"" + ": " + ny + ", " + "\"" + "refTime" + "\"" + ": " + "\"" + "2020-07-22 23:00:00" + "\"" + "}"; + + String header2 = "\"" + "header" + "\"" + ": " + "{" + "\"" + "parameterUnit" + "\"" + ": " + "\"" + "m/s" + "\"" + ", " + "\"" + "parameterNumber" + "\"" + ": " + 3 + + ", " + "\"" + "dx" + "\"" + ": " + dx + ", " + "\"" + "dy" + "\"" + ": " + dy + + ", " + "\"" + "parameterNumberName" + "\"" + ": " + "\"" + "eastward_wind" + "\"" + ", " + "\"" + "la1" + "\"" + ": " + la1 + ", " + "\"" + "la2" + "\"" + ": " + la2 + + ", " + "\"" + "parameterCategory" + "\"" + ": " + 2 + ", " + "\"" + "lo1" + "\"" + ": " + lo1 + ", " + "\"" + "lo2" + "\"" + ": " + lo2 + + ", " + "\"" + "nx" + "\"" + ": " + nx + ", " + "\"" + "ny" + "\"" + ": " + ny + ", " + "\"" + "refTime" + "\"" + ": " + "\"" + "2020-07-22 23:00:00" + "\"" + "}"; + + + String s1 = "[" + "{" + header1 + ", " + uData + "}" + ", " + "{" + header2 + ", " + vData + "}" + "]"; + JSONArray jsonArray = JSONArray.parseArray(s1); + + list.add(jsonArray); + list.add(centerPoint.get("lng")); + list.add(centerPoint.get("lat")); + list.add(laLaMap); + return list; + } + + + + } -- Gitblit v1.8.0