|
@@ -9,6 +9,9 @@ import com.cpp.web.domain.station.WindTowerStatusData;
|
|
|
import com.cpp.web.service.station.WindTowerStatusDataService;
|
|
|
import io.swagger.annotations.Api;
|
|
|
import io.swagger.annotations.ApiOperation;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.Data;
|
|
|
+import lombok.Getter;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
@@ -82,71 +85,43 @@ public class WindTowerStatusDataController {
|
|
|
List<BigDecimal> ws80List = new ArrayList<>();
|
|
|
List<BigDecimal> ws90List = new ArrayList<>();
|
|
|
List<BigDecimal> ws100List = new ArrayList<>();
|
|
|
- List<BigDecimal> wdHubHeightList = new ArrayList<>();
|
|
|
- List<BigDecimal> wd10List = new ArrayList<>();
|
|
|
- List<BigDecimal> wd30List = new ArrayList<>();
|
|
|
- List<BigDecimal> wd50List = new ArrayList<>();
|
|
|
- List<BigDecimal> wd60List = new ArrayList<>();
|
|
|
- List<BigDecimal> wd70List = new ArrayList<>();
|
|
|
- List<BigDecimal> wd80List = new ArrayList<>();
|
|
|
- List<BigDecimal> wd90List = new ArrayList<>();
|
|
|
- List<BigDecimal> wd100List = new ArrayList<>();
|
|
|
LinkedHashMap<String, List> wsMap = new LinkedHashMap<>();
|
|
|
|
|
|
Long momentTime = 5 * 60 * 1000L;
|
|
|
for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + momentTime) {
|
|
|
// 设置时间
|
|
|
- String tempTimeStr = sdf.format(tempTime);
|
|
|
+ String tempTimeStr = sdf.format(tempTime);
|
|
|
timeList.add(tempTimeStr);
|
|
|
- if (dataGroupMap.get(tempTimeStr)!=null){
|
|
|
+ if (dataGroupMap.get(tempTimeStr) != null) {
|
|
|
WindTowerStatusData windTowerStatusData = dataGroupMap.get(tempTimeStr);
|
|
|
// 风速轮毂
|
|
|
BigDecimal wsHubHeight = windTowerStatusData.getWsHubHeight();
|
|
|
wsHubHeightList.add(wsHubHeight);
|
|
|
- // 轮毂风向
|
|
|
- wdHubHeightList.add(windTowerStatusData.getWdHubHeight());
|
|
|
// ws10
|
|
|
BigDecimal ws10 = windTowerStatusData.getWs10();
|
|
|
ws10List.add(ws10);
|
|
|
- // wd10
|
|
|
- wd10List.add(windTowerStatusData.getWd10());
|
|
|
// ws30
|
|
|
BigDecimal ws30 = windTowerStatusData.getWs30();
|
|
|
ws30List.add(ws30);
|
|
|
- // wd30
|
|
|
- wd30List.add(windTowerStatusData.getWd30());
|
|
|
// ws50
|
|
|
BigDecimal ws50 = windTowerStatusData.getWs50();
|
|
|
ws50List.add(ws50);
|
|
|
- // wd50
|
|
|
- wd50List.add(windTowerStatusData.getWd50());
|
|
|
// ws60
|
|
|
BigDecimal ws60 = windTowerStatusData.getWs60();
|
|
|
ws60List.add(ws60);
|
|
|
- // wd60
|
|
|
- wd60List.add(windTowerStatusData.getWd60());
|
|
|
// ws70
|
|
|
BigDecimal ws70 = windTowerStatusData.getWs70();
|
|
|
ws70List.add(ws70);
|
|
|
- // wd70
|
|
|
- wd70List.add(windTowerStatusData.getWd70());
|
|
|
// ws80
|
|
|
BigDecimal ws80 = windTowerStatusData.getWs80();
|
|
|
ws80List.add(ws80);
|
|
|
- // wd80
|
|
|
- wd80List.add(windTowerStatusData.getWd80());
|
|
|
// ws90
|
|
|
BigDecimal ws90 = windTowerStatusData.getWs90();
|
|
|
ws90List.add(ws90);
|
|
|
- // wd90
|
|
|
- wd90List.add(windTowerStatusData.getWd90());
|
|
|
// ws100
|
|
|
BigDecimal ws100 = windTowerStatusData.getWs100();
|
|
|
ws100List.add(ws100);
|
|
|
- // wd100
|
|
|
- wd100List.add(windTowerStatusData.getWd100());
|
|
|
- }
|
|
|
- else{
|
|
|
+ } else {
|
|
|
// 风速轮毂
|
|
|
wsHubHeightList.add(null);
|
|
|
// ws10
|
|
@@ -181,121 +156,130 @@ public class WindTowerStatusDataController {
|
|
|
returnMap.put("tableList", talbeList);
|
|
|
returnMap.put("wsTime", timeList);
|
|
|
returnMap.put("wsMap", wsMap);
|
|
|
-
|
|
|
- LinkedHashMap<String, Float[]> wdMap = new LinkedHashMap<>();
|
|
|
- Float[] wdHubHeightRate = getCalcWd(wdHubHeightList);
|
|
|
- Float[] wd10Rate = getCalcWd(wd10List);
|
|
|
- Float[] wd30Rate = getCalcWd(wd30List);
|
|
|
- Float[] wd50Rate = getCalcWd(wd50List);
|
|
|
- Float[] wd60Rate = getCalcWd(wd60List);
|
|
|
- Float[] wd70Rate = getCalcWd(wd70List);
|
|
|
- Float[] wd80Rate = getCalcWd(wd80List);
|
|
|
- Float[] wd90Rate = getCalcWd(wd90List);
|
|
|
- Float[] wd100Rate = getCalcWd(wd100List);
|
|
|
- wdMap.put("轮毂风向", wdHubHeightRate);
|
|
|
- wdMap.put("10米风向", wd10Rate);
|
|
|
- wdMap.put("30米风向", wd30Rate);
|
|
|
- wdMap.put("50米风向", wd50Rate);
|
|
|
- wdMap.put("60米风向", wd60Rate);
|
|
|
- wdMap.put("70米风向", wd70Rate);
|
|
|
- wdMap.put("80米风向", wd80Rate);
|
|
|
- wdMap.put("90米风向", wd90Rate);
|
|
|
- wdMap.put("100米风向", wd100Rate);
|
|
|
- returnMap.put("wdMap", wdMap);
|
|
|
+ returnMap.put("wdMap", geWsWdWfData(dataGroupMap.values().stream().collect(Collectors.toList())));
|
|
|
|
|
|
return R.ok(returnMap);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 计算风向
|
|
|
+ * 构造风向风速风频玫瑰图数据
|
|
|
+ *
|
|
|
+ * @param windTowerStatusDataList
|
|
|
* @return
|
|
|
*/
|
|
|
- private Float[] getCalcWd(List<BigDecimal> wdList){
|
|
|
- int[] frequency16 = new int[16];
|
|
|
- Float[] frequency16Rate = new Float[16];
|
|
|
- for(BigDecimal b: wdList){
|
|
|
- if(b!=null){
|
|
|
- float wdfloat = b.floatValue();
|
|
|
- //N 北 0 348.76-11.25
|
|
|
- if( (wdfloat>=348.76F && wdfloat<=360F) || (wdfloat>=0 && wdfloat<= 11.25)){
|
|
|
- frequency16[0]++;
|
|
|
- }
|
|
|
- //NNE 北东北 22.5 11.26-33.75
|
|
|
- if(wdfloat>=11.26F && wdfloat<=33.75F){
|
|
|
- frequency16[15]++;
|
|
|
- }
|
|
|
- //NE 东北 45 33.76-56.25
|
|
|
- if(wdfloat>=33.76F && wdfloat<=56.25F){
|
|
|
- frequency16[14]++;
|
|
|
- }
|
|
|
- //ENE 东东北 67.5 56.26-78.75
|
|
|
- if(wdfloat>=56.26F && wdfloat<=78.75F){
|
|
|
- frequency16[13]++;
|
|
|
- }
|
|
|
- //E 东 90 78.76-101.25
|
|
|
- if(wdfloat>=78.76F && wdfloat<=101.25F){
|
|
|
- frequency16[12]++;
|
|
|
- }
|
|
|
- //ESE 东东南 112.5 101.26-123.75
|
|
|
- if(wdfloat>=101.26F && wdfloat<=123.75F){
|
|
|
- frequency16[11]++;
|
|
|
- }
|
|
|
- //SE 东南 135 123.76-146.25
|
|
|
- if(wdfloat>=123.76F && wdfloat<=146.25F){
|
|
|
- frequency16[10]++;
|
|
|
- }
|
|
|
- //SSE 南东南 157.5 146.26-168.75
|
|
|
- if(wdfloat>=146.26F && wdfloat<=168.75F){
|
|
|
- frequency16[9]++;
|
|
|
- }
|
|
|
- //S 南 180 168.76-191.25
|
|
|
- if(wdfloat>=168.76F && wdfloat<=191.25F){
|
|
|
- frequency16[8]++;
|
|
|
- }
|
|
|
- //SSW 南西南 202.5 191.26-213.75
|
|
|
- if(wdfloat>=191.26F && wdfloat<=213.75F){
|
|
|
- frequency16[7]++;
|
|
|
- }
|
|
|
- //SW 西南 225 213.76-236.25
|
|
|
- if(wdfloat>=213.76F && wdfloat<=236.25F){
|
|
|
- frequency16[6]++;
|
|
|
- }
|
|
|
- //WSW 西西南 247.5 236.26-258.75
|
|
|
- if(wdfloat>=236.26F && wdfloat<=258.75F){
|
|
|
- frequency16[5]++;
|
|
|
- }
|
|
|
- //W 西 270 258.76-281.25
|
|
|
- if(wdfloat>=258.76F && wdfloat<=281.25F){
|
|
|
- frequency16[4]++;
|
|
|
- }
|
|
|
- //WNW 西西北 295.5 281.26-303.75
|
|
|
- if(wdfloat>=281.26F && wdfloat<=303.75F){
|
|
|
- frequency16[3]++;
|
|
|
- }
|
|
|
- //NW 西北 315 303.76-326.25
|
|
|
- if(wdfloat>=303.76F && wdfloat<=326.25F){
|
|
|
- frequency16[2]++;
|
|
|
- }
|
|
|
- //NNW 北西北 337.5 326.26-348.
|
|
|
- if(wdfloat>=326.26F && wdfloat<=348.75F){
|
|
|
- frequency16[1]++;
|
|
|
- }
|
|
|
+ private List geWsWdWfData(List<WindTowerStatusData> windTowerStatusDataList) {
|
|
|
+ Map<WsIntervalEnum, List<WindTowerStatusData>> wsIntervalEnumListMap = windTowerStatusDataList.stream().collect(Collectors.groupingBy(w -> WsIntervalEnum.getWsInterval(w.getWdHubHeight().doubleValue())));
|
|
|
+ List<Map<String,Object>> list = new ArrayList<>();
|
|
|
+
|
|
|
+ for (WsIntervalEnum value : WsIntervalEnum.values()) {
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
+ Map<String,Object> eumForMap = new HashMap<>();
|
|
|
+ eumForMap.put("explain",value.getExplain());
|
|
|
+ eumForMap.put("color",value.getColor());
|
|
|
+ map.put("key",eumForMap);
|
|
|
+ if (wsIntervalEnumListMap.containsKey(value)) {
|
|
|
+ map.put("value", getCalcWd(wsIntervalEnumListMap.get(value), Double.valueOf(windTowerStatusDataList.size())));
|
|
|
+ } else {
|
|
|
+ map.put("value", new Double[]{0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D});
|
|
|
}
|
|
|
+ list.add(map);
|
|
|
}
|
|
|
- BigDecimal sumToltal= new BigDecimal(0);
|
|
|
- for(int wdf:frequency16){
|
|
|
- BigDecimal b = new BigDecimal(wdf);
|
|
|
- sumToltal = sumToltal.add(b);
|
|
|
- }
|
|
|
|
|
|
- for(int i =0; i<frequency16.length;i++){
|
|
|
- if(frequency16[i] ==0){
|
|
|
- frequency16Rate[i]= 0f;
|
|
|
- }else{
|
|
|
- BigDecimal dividend = new BigDecimal(frequency16[i]);
|
|
|
- frequency16Rate[i] =dividend.divide(sumToltal,2, BigDecimal.ROUND_HALF_UP).floatValue();
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构造风向风速风频玫瑰图数据
|
|
|
+ *
|
|
|
+ * @param windTowerStatusDataList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Double[] getCalcWd(List<WindTowerStatusData> windTowerStatusDataList, Double size) {
|
|
|
+ Map<WdEnum, List<WindTowerStatusData>> wdEnumListMap = windTowerStatusDataList.stream().collect(Collectors.groupingBy(w -> WdEnum.getWdEnum(w.getWdHubHeight().doubleValue())));
|
|
|
+
|
|
|
+ Double[] data = new Double[]{0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D, 0D};
|
|
|
+ if (size != 0) {
|
|
|
+ for (Map.Entry<WdEnum, List<WindTowerStatusData>> wdEnumListEntry : wdEnumListMap.entrySet()) {
|
|
|
+ Double wdSize = Double.valueOf(wdEnumListEntry.getValue().size());
|
|
|
+ data[wdEnumListEntry.getKey().index] = BigDecimal.valueOf(wdSize / size * 100).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
|
|
|
}
|
|
|
}
|
|
|
- return frequency16Rate;
|
|
|
+ return data;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ @Getter
|
|
|
+ @AllArgsConstructor
|
|
|
+ enum WdEnum {
|
|
|
+ N("北", 348.76D, 11.25D, 0),
|
|
|
+ NNE("北东北", 11.26D, 33.75D, 1),
|
|
|
+ NE("东北", 33.76D, 56.25D, 2),
|
|
|
+ ENE("东东北", 56.26D, 78.75D, 3),
|
|
|
+ E("东", 78.76D, 101.25D, 4),
|
|
|
+ ESE("东东南", 101.26D, 123.75D, 5),
|
|
|
+ SE("东南", 123.76D, 146.25D, 6),
|
|
|
+ SSE("南东南", 146.26D, 168.75D, 7),
|
|
|
+ S("南", 168.76D, 191.25D, 8),
|
|
|
+ SSW("南西南", 191.26D, 213.75D, 9),
|
|
|
+ SW("西南", 213.76D, 236.75D, 10),
|
|
|
+ WSW("西西南", 236.26D, 258.75D, 11),
|
|
|
+ W("西", 258.76D, 281.25D, 12),
|
|
|
+ WNW("西西北", 281.26D, 303.75D, 13),
|
|
|
+ NW("西北", 303.76D, 326.25D, 14),
|
|
|
+ NNW("北西北", 326.26D, 348.75D, 15),
|
|
|
+ ;
|
|
|
+ private String explain;
|
|
|
+ private Double min;
|
|
|
+ private Double max;
|
|
|
+ private Integer index;
|
|
|
+
|
|
|
+ public static WdEnum getWdEnum(Double wd) {
|
|
|
+ return (wd >= N.min || wd <= N.max) ? N :
|
|
|
+ (wd >= NNE.min && wd <= NNE.max) ? NNE :
|
|
|
+ (wd >= NE.min && wd <= NE.max) ? NE :
|
|
|
+ (wd >= ENE.min && wd <= ENE.max) ? ENE :
|
|
|
+ (wd >= E.min && wd <= E.max) ? E :
|
|
|
+ (wd >= ESE.min && wd <= ESE.max) ? ESE :
|
|
|
+ (wd >= SE.min && wd <= SE.max) ? SE :
|
|
|
+ (wd >= SSE.min && wd <= SSE.max) ? SSE :
|
|
|
+ (wd >= SSW.min && wd <= SSW.max) ? SSW :
|
|
|
+ (wd >= SW.min && wd <= SW.max) ? SW :
|
|
|
+ (wd >= WSW.min && wd <= WSW.max) ? WSW :
|
|
|
+ (wd >= W.min && wd <= W.max) ? W :
|
|
|
+ (wd >= WNW.min && wd <= WNW.max) ? WNW :
|
|
|
+ (wd >= NW.min && wd <= NW.max) ? NW :
|
|
|
+ NNW;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Getter
|
|
|
+ @AllArgsConstructor
|
|
|
+ enum WsIntervalEnum {
|
|
|
+ I1("<0.5m/s", 0D, 0.4D, 0,"rgb(255,0,47)"),
|
|
|
+ I2("0.5~2m/s", 0.5D, 1.9D, 1,"rgba(16,217,16,0.96)"),
|
|
|
+ I3("2~4m/s", 2D, 3.9D, 2,"rgba(15,246,15,0.96)"),
|
|
|
+ I4("4~6m/s", 4D, 5.9D, 3,"rgb(239,248,10)"),
|
|
|
+ I5("6~8m/s", 6D, 7.9D, 4,"rgb(244,245,244)"),
|
|
|
+ I6("8~10m/s", 8D, 9.9D, 5,"rgb(98,206,111)"),
|
|
|
+ I7(">10m/s", 10D, 100D, 5,"rgb(232,236,124)"),
|
|
|
+ ;
|
|
|
+ private String explain;
|
|
|
+ private Double min;
|
|
|
+ private Double max;
|
|
|
+ private Integer index;
|
|
|
+ private String color;
|
|
|
+
|
|
|
+ public static WsIntervalEnum getWsInterval(Double ws) {
|
|
|
+ return (ws >= I2.min && ws <= I2.max) ? I2 :
|
|
|
+ (ws >= I3.min && ws <= I3.max) ? I3 :
|
|
|
+ (ws >= I5.min && ws <= I5.max) ? I5 :
|
|
|
+ (ws >= I6.min && ws <= I6.max) ? I6 :
|
|
|
+ (ws >= I7.min && ws <= I7.max) ? I7 :
|
|
|
+ I1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|