| | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; |
| | | import com.moral.api.config.Interceptor.UserHelper; |
| | | import com.moral.api.config.mybatis.MybatisPlusConfig; |
| | | import com.moral.api.entity.*; |
| | | import com.moral.api.mapper.DeviceMapper; |
| | |
| | | import com.moral.api.mapper.HistoryHourlyMapper; |
| | | import com.moral.api.pojo.dto.Wind.WindData; |
| | | import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO; |
| | | import com.moral.api.pojo.enums.SysDictTypeEnum; |
| | | import com.moral.api.pojo.ext.wind.WindListExt; |
| | | import com.moral.api.pojo.form.device.MonitorPointQueryForm; |
| | | import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm; |
| | | import com.moral.api.pojo.vo.user.QxUser; |
| | | import com.moral.api.service.DeviceService; |
| | | import com.moral.api.service.HistoryFiveMinutelyService; |
| | | import com.moral.api.service.MonitorPointService; |
| | | import com.moral.api.service.SysDictTypeService; |
| | | import com.moral.api.utils.UnitConvertUtils; |
| | | import com.moral.constant.Constants; |
| | | import com.moral.constant.RedisConstants; |
| | |
| | | import com.moral.util.RegionCodeUtils; |
| | | import io.lettuce.core.GeoCoordinates; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.collections4.CollectionUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | 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.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | DeviceService deviceService; |
| | | @Autowired |
| | | DeviceMapper deviceMapper; |
| | | @Autowired |
| | | private SysDictTypeService sysDictTypeService; |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form) { |
| | |
| | | //风场数据 |
| | | windData = historyFiveMinutelyMapper.getAreaWindData(params); |
| | | } |
| | | return getWindData(windData); |
| | | return getWindData(windData,params); |
| | | } |
| | | |
| | | |
| | |
| | | map.put("lat", Lat * 180 / Math.PI); |
| | | return map; |
| | | } |
| | | private int windDate(String ids){ |
| | | int num = 200; |
| | | if(StringUtils.isEmpty(ids)){ |
| | | return num; |
| | | } |
| | | List<Integer> list = Arrays.asList(ids.split(",")).stream().map(s->Integer.parseInt(s.trim())).collect(Collectors.toList()); |
| | | LambdaQueryChainWrapper<MonitorPoint> wrapper = monitorPointService.lambdaQuery(); |
| | | wrapper.in(MonitorPoint::getId,list); |
| | | List<MonitorPoint> resultList = wrapper.list(); |
| | | if(CollectionUtils.isEmpty(resultList)){ |
| | | return num; |
| | | } |
| | | List<String> integerList = resultList.stream().map(s->s.getOrganizationId().toString()).collect(Collectors.toList()); |
| | | List<SysDictData> sysDictList = sysDictTypeService.listWindAll(SysDictTypeEnum.WIND_FARM_SCOPE.value,integerList); |
| | | if(CollectionUtils.isEmpty(sysDictList)){ |
| | | return num; |
| | | } |
| | | num = sysDictList.stream().mapToInt(s->Integer.parseInt(s.getDataValue())).max().getAsInt(); |
| | | return num; |
| | | } |
| | | |
| | | public List<Object> getWindData(List<WindData> windData) { |
| | | public List<Object> getWindData(List<WindData> windData,Map<String, Object> params) { |
| | | 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<>(); |
| | | List<Map<String, Object>> mapList = 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(); |
| | |
| | | map.put("la", latitude); |
| | | map.put("U", U); |
| | | map.put("V", V); |
| | | map.put("mac", data.getMac()); |
| | | mapList.add(map); |
| | | } |
| | | |
| | |
| | | laLaMap.put("minLo", lomi); |
| | | laLaMap.put("maxLa", lama); |
| | | laLaMap.put("minLa", lami); |
| | | |
| | | |
| | | int perdlen = windDate(Objects.nonNull(params.get("monitorPointList"))?params.get("monitorPointList").toString():null); |
| | | int length = perdlen*10; |
| | | |
| | | Double lo1 = lomi - length * 0.00001141; |
| | | //Double lo1 = lomi - length * 0.000001141 * 2; |
| | | Double lo2 = loma + length * 0.00001141; |
| | |
| | | int nums = Objects.nonNull(nx*ny)?nx*ny+100:100; |
| | | List<Double> uList = new ArrayList<>(nums); |
| | | List<Double> vList = new ArrayList<>(nums); |
| | | |
| | | |
| | | for (int j = 0; j < nx * ny; j++) { |
| | | uList.add(0.0); |
| | | vList.add(0.0); |
| | | } |
| | | 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); |
| | | } |
| | | } |
| | | // 微动风场 |
| | | /* WindListExt windListExt = getWindList(mapList.get(i),loList,laList,500,50); |
| | | if(Objects.nonNull(windListExt)&&Objects.nonNull(windListExt.getUValue()) ){ |
| | | U = windListExt.getUValue(); |
| | | V = windListExt.getVValue(); |
| | | }*/ |
| | | for (int j = 0; j < nx * ny; j++) { |
| | | if (i == 0) { |
| | | if ((y >= 2 && j == (y) * nx + x)) { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /*WindListExt windList = getWindList(length,perdlen,params); |
| | | for(int i =0; i< windList.getUList().size(); i++){ |
| | | Double d = windList.getUList().get(i); |
| | | if(Objects.nonNull(d)&& (!d.equals(0d))){ |
| | | uList.set(i,d); |
| | | } |
| | | } |
| | | for(int i =0; i< windList.getVList().size(); i++){ |
| | | Double d = windList.getVList().get(i); |
| | | if(Objects.nonNull(d)&& (!d.equals(0d))){ |
| | | vList.set(i,d); |
| | | } |
| | | }*/ |
| | | /*//结果集 |
| | | List<Object> list = new ArrayList<>(); |
| | | String uData = "\"" + "data" + "\"" + ": " + uList; |
| | | String vData = "\"" + "data" + "\"" + ": " + vList; |
| | | |
| | |
| | | list.add(jsonArray); |
| | | list.add(centerPoint.get("lng")); |
| | | list.add(centerPoint.get("lat")); |
| | | list.add(laLaMap); |
| | | list.add(laLaMap);*/ |
| | | |
| | | Map<String,Object> map = new HashMap<>(); |
| | | map.put("uList",uList); |
| | | map.put("vList",vList); |
| | | map.put("dx",dx); |
| | | map.put("dy",dy); |
| | | map.put("nx",nx); |
| | | map.put("ny",ny); |
| | | map.put("la1",la1); |
| | | map.put("la2",la2); |
| | | map.put("lo1",lo1); |
| | | map.put("lo2",lo2); |
| | | map.put("laLaMap",laLaMap); |
| | | return getWindData(map,centerPoint); |
| | | } |
| | | |
| | | private WindListExt getWindList(int length,int perdlen,Map<String, Object> params){ |
| | | params.put("time","2023-10-16 04:00"); |
| | | String time = params.get("time").toString(); |
| | | String timeUnits = DateUtils.stringToDateString(time, "yyyy-MM-dd HH:mm", DateUtils.yyyyMM_EN); |
| | | params.put("timeUnits", timeUnits); |
| | | List<WindData> windData = historyHourlyMapper.getArea(params); |
| | | WindListExt windListExt = new WindListExt(); |
| | | List<String> stringList = Arrays.asList("p5dnd7a0245400","p5dnd7a0245472","p5dnd7a0245374","p5dnd7a0245385"); |
| | | List<GeoCoordinates> points = new ArrayList<>(); |
| | | Double loma = 0d; |
| | | Double lomi = 0d; |
| | | Double lama = 0d; |
| | | Double lami = 0d; |
| | | List<Double> loList = new ArrayList<>(); |
| | | List<Double> laList = new ArrayList<>(); |
| | | List<Map<String, Object>> mapList = new ArrayList<>(); |
| | | Double U = 0d; |
| | | Double V = 0d; |
| | | 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); |
| | | if(stringList.contains(data.getMac())){ |
| | | map.put("lo", longitude); |
| | | map.put("la", latitude); |
| | | map.put("U", U); |
| | | map.put("V", V); |
| | | map.put("mac", data.getMac()); |
| | | mapList.add(map); |
| | | } |
| | | } |
| | | if (loList.size() > 0) { |
| | | loma = Collections.max(loList); |
| | | lomi = Collections.min(loList); |
| | | } |
| | | if (laList.size() > 0) { |
| | | lama = Collections.max(laList); |
| | | lami = Collections.min(laList); |
| | | } |
| | | 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); |
| | | int nums = Objects.nonNull(nx*ny)?nx*ny+100:100; |
| | | List<Double> uList = new ArrayList<>(nums); |
| | | List<Double> vList = new ArrayList<>(nums); |
| | | for (int j = 0; j < nx * ny; j++) { |
| | | uList.add(0.0); |
| | | vList.add(0.0); |
| | | } |
| | | 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"); |
| | | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | windListExt.setUList(uList); |
| | | windListExt.setVList(vList); |
| | | return windListExt; |
| | | } |
| | | |
| | | private List<Object> getWindData(Map<String,Object> map, Map<String, Double> centerPoint){ |
| | | List<Object> list = new ArrayList<>(); |
| | | String uData = "\"" + "data" + "\"" + ": " + map.get("uList"); |
| | | String vData = "\"" + "data" + "\"" + ": " + map.get("vList"); |
| | | |
| | | String header1 = "\"" + "header" + "\"" + ": " + "{" + "\"" + "parameterUnit" + "\"" + ": " + "\"" + "m/s" + "\"" + ", " + "\"" + "parameterNumber" + "\"" + ": " + 2 + |
| | | ", " + "\"" + "dx" + "\"" + ": " + map.get("dx") + ", " + "\"" + "dy" + "\"" + ": " + map.get("dy") + |
| | | ", " + "\"" + "parameterNumberName" + "\"" + ": " + "\"" + "eastward_wind" + "\"" + ", " + "\"" + "la1" + "\"" + ": " + map.get("la1") + ", " + "\"" + "la2" + "\"" + ": " + map.get("la2") + |
| | | ", " + "\"" + "parameterCategory" + "\"" + ": " + 2 + ", " + "\"" + "lo1" + "\"" + ": " + map.get("lo1") + ", " + "\"" + "lo2" + "\"" + ": " + map.get("lo2") + |
| | | ", " + "\"" + "nx" + "\"" + ": " + map.get("nx") + ", " + "\"" + "ny" + "\"" + ": " + map.get("ny") + ", " + "\"" + "refTime" + "\"" + ": " + "\"" + "2020-07-22 23:00:00" + "\"" + "}"; |
| | | |
| | | String header2 = "\"" + "header" + "\"" + ": " + "{" + "\"" + "parameterUnit" + "\"" + ": " + "\"" + "m/s" + "\"" + ", " + "\"" + "parameterNumber" + "\"" + ": " + 3 + |
| | | ", " + "\"" + "dx" + "\"" + ": " + map.get("dx") + ", " + "\"" + "dy" + "\"" + ": " + map.get("dy") + |
| | | ", " + "\"" + "parameterNumberName" + "\"" + ": " + "\"" + "eastward_wind" + "\"" + ", " + "\"" + "la1" + "\"" + ": " + map.get("la1") + ", " + "\"" + "la2" + "\"" + ": " + map.get("la2") + |
| | | ", " + "\"" + "parameterCategory" + "\"" + ": " + 2 + ", " + "\"" + "lo1" + "\"" + ": " + map.get("lo1") + ", " + "\"" + "lo2" + "\"" + ": " + map.get("lo2") + |
| | | ", " + "\"" + "nx" + "\"" + ": " + map.get("nx") + ", " + "\"" + "ny" + "\"" + ": " + map.get("ny") + ", " + "\"" + "refTime" + "\"" + ": " + "\"" + "2020-07-22 23:00:00" + "\"" + "}"; |
| | | |
| | | |
| | | String s1 = "[" + "{" + header1 + ", " + uData + "}" + ", " + "{" + header2 + ", " + vData + "}" + "]"; |
| | | //System.out.println(s1); |
| | | JSONArray jsonArray = JSONArray.parseArray(s1); |
| | | |
| | | list.add(jsonArray); |
| | | list.add(centerPoint.get("lng")); |
| | | list.add(centerPoint.get("lat")); |
| | | list.add(map.get("laLaMap")); |
| | | return list; |
| | | } |
| | | |