小玉潭洪水预报模型优化

(cherry picked from commit 06d10a70865c7561888e7e0d9f24598e298a9c9e)
master
cxw 2024-10-14 13:28:45 +08:00
parent fd0238ba1c
commit f2d432d1ee
2 changed files with 46 additions and 3 deletions

View File

@ -99,4 +99,10 @@ public class ForecastResultVo {
*/ */
@Schema(description="土壤含水量") @Schema(description="土壤含水量")
private BigDecimal pa; private BigDecimal pa;
/**
*
*/
@Schema(description = "水库当前库容")
private BigDecimal nowCap;
} }

View File

@ -25,6 +25,7 @@ import com.gunshi.project.xyt.model.StPptnRAverage;
import com.gunshi.project.xyt.model.StRsvrR; import com.gunshi.project.xyt.model.StRsvrR;
import com.gunshi.project.xyt.model.StStbprpB; import com.gunshi.project.xyt.model.StStbprpB;
import com.gunshi.project.xyt.model.StZqrlB; import com.gunshi.project.xyt.model.StZqrlB;
import com.gunshi.project.xyt.model.StZvarlB;
import com.gunshi.project.xyt.util.DataHandleUtil; import com.gunshi.project.xyt.util.DataHandleUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -92,6 +93,9 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
@Autowired @Autowired
private AttResBaseService attResBaseService; private AttResBaseService attResBaseService;
@Autowired
private StZvarlBService stZvarlBService;
/** /**
* @description: * @description:
@ -200,6 +204,7 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
.collect(Collectors.toList()); .collect(Collectors.toList());
double dt = 0.0; double dt = 0.0;
double Wm = 0.0; double Wm = 0.0;
double qOther = 0.0;
Map<String, String> paramMap = paramList.stream().collect(Collectors.toMap(ForecastUseparam::getParamCode, ForecastUseparam::getParamValue)); Map<String, String> paramMap = paramList.stream().collect(Collectors.toMap(ForecastUseparam::getParamCode, ForecastUseparam::getParamValue));
if (paramMap.get("dt").isEmpty()) { if (paramMap.get("dt").isEmpty()) {
throw new IllegalArgumentException("温馨提示当前洪水预报所依赖的数据尚不完整请检查时间单元△T是否缺失。"); throw new IllegalArgumentException("温馨提示当前洪水预报所依赖的数据尚不完整请检查时间单元△T是否缺失。");
@ -207,6 +212,9 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
if (paramMap.get("Im").isEmpty()) { if (paramMap.get("Im").isEmpty()) {
throw new IllegalArgumentException("温馨提示当前洪水预报所依赖的数据尚不完整请检查最大初损值Im是否缺失。"); throw new IllegalArgumentException("温馨提示当前洪水预报所依赖的数据尚不完整请检查最大初损值Im是否缺失。");
} }
if (!paramMap.get("qOther").isEmpty()) {
qOther = Double.parseDouble(paramMap.get("qOther"));
}
dt = Double.parseDouble(paramMap.get("dt")); dt = Double.parseDouble(paramMap.get("dt"));
Wm = Double.parseDouble(paramMap.get("Im")); Wm = Double.parseDouble(paramMap.get("Im"));
List<ForecastU> uList = forecastUService.list(); List<ForecastU> uList = forecastUService.list();
@ -234,6 +242,8 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
H1 = Double.parseDouble(rsvrR.getRz()); H1 = Double.parseDouble(rsvrR.getRz());
// 泄流量 // 泄流量
List<StZqrlB> stZqrlBList = stZqrlBService.list(new QueryWrapper<StZqrlB>().eq("stcd", attResBase.getStcd())); List<StZqrlB> stZqrlBList = stZqrlBService.list(new QueryWrapper<StZqrlB>().eq("stcd", attResBase.getStcd()));
// 库容曲线
List<StZvarlB> zvarlBS = stZvarlBService.list(new QueryWrapper<StZvarlB>().eq("stcd", attResBase.getStcd()));
// 水位历史数据 // 水位历史数据
List<StRsvrR> rsvrRRealList = stRsvrRService.list(new QueryWrapper<StRsvrR>().eq("stcd", attResBase.getStcd()).ge("tm", startTime).le("tm", endTime)); List<StRsvrR> rsvrRRealList = stRsvrRService.list(new QueryWrapper<StRsvrR>().eq("stcd", attResBase.getStcd()).ge("tm", startTime).le("tm", endTime));
List<StRsvrR> resultList = reorganizeRsvrRData(rsvrRRealList, dt); List<StRsvrR> resultList = reorganizeRsvrRData(rsvrRRealList, dt);
@ -272,7 +282,7 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
double[] PList = pForecastList.stream().mapToDouble(Double::parseDouble).toArray(); double[] PList = pForecastList.stream().mapToDouble(Double::parseDouble).toArray();
// 预测执行 // 预测执行
List<FloodAlgorithemVo> forecastVoList = RrainfallForecast.getData(sdf.format(period[0]), forecastPa.getK().doubleValue(), forecastPa.getPa0().doubleValue(), Wm, forecastPa.getPt0().doubleValue(), H1, dt, List<FloodAlgorithemVo> forecastVoList = RrainfallForecast.getData(sdf.format(period[0]), forecastPa.getK().doubleValue(), forecastPa.getPa0().doubleValue(), Wm, forecastPa.getPt0().doubleValue(), H1, dt,
forecastPa.getPa().doubleValue(), PList, u, attResBase.getStcd()); forecastPa.getPa().doubleValue(), PList, u, attResBase.getStcd(), qOther);
if (CollectionUtils.isNotEmpty(forecastVoList)) { if (CollectionUtils.isNotEmpty(forecastVoList)) {
// 筛选同时段的真实水位数据 // 筛选同时段的真实水位数据
List<StRsvrR> realRsvrList = resultList.stream().filter(item -> item.getTm().compareTo(period[0]) >= 0 && item.getTm().compareTo(period[1]) <= 0).collect(Collectors.toList()); List<StRsvrR> realRsvrList = resultList.stream().filter(item -> item.getTm().compareTo(period[0]) >= 0 && item.getTm().compareTo(period[1]) <= 0).collect(Collectors.toList());
@ -291,13 +301,15 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
// resultVo.setRealRkQValue();// 暂无真实入库流量 // resultVo.setRealRkQValue();// 暂无真实入库流量
resultVo.setYcCkQValue(floodAlgorithemVo.getCq());// 预测出库流量 resultVo.setYcCkQValue(floodAlgorithemVo.getCq());// 预测出库流量
resultVo.setYcSwHValue(floodAlgorithemVo.getKh());// 预测水库水位 resultVo.setYcSwHValue(floodAlgorithemVo.getKh());// 预测水库水位
H1 = resultVo.getYcSwHValue().doubleValue();// 以预测水位作为下一次预测段起始值 H1 = resultVo.getYcSwHValue().doubleValue();// 以预测水位作为下一次预测段起始值
String dateMinuteStr = dateStr.substring(0, dateStr.length() - 3);// 年月日 时分 String dateMinuteStr = dateStr.substring(0, dateStr.length() - 3);// 年月日 时分
if (realRsvrMap.containsKey(dateMinuteStr)) { if (realRsvrMap.containsKey(dateMinuteStr)) {
BigDecimal realSwHValue = new BigDecimal(realRsvrMap.get(dateMinuteStr));// 根据时间取更准确 BigDecimal realSwHValue = new BigDecimal(realRsvrMap.get(dateMinuteStr));// 根据时间取更准确
resultVo.setRealSwHValue(realSwHValue);// 真实水库水位 resultVo.setRealSwHValue(realSwHValue);// 真实水库水位
calculateCap(zvarlBS, resultVo, realSwHValue);// 有真实水位就用真实水位算(作为实测库容)
resultVo.setSwHDValue(resultVo.getYcSwHValue().subtract(resultVo.getRealSwHValue()));// 预测与真实水位差 resultVo.setSwHDValue(resultVo.getYcSwHValue().subtract(resultVo.getRealSwHValue()));// 预测与真实水位差
H1 = realSwHValue.doubleValue();// 如果有真实水位,将最后一条的真实水位作为下一次预测段的初始水位 // 注释修复跨8点时的陡升陡降
// H1 = realSwHValue.doubleValue();// 如果有真实水位,将最后一条的真实水位作为下一次预测段的初始水位
// 真实出库流量=真实水库水位与泄流量曲线差值法 // 真实出库流量=真实水库水位与泄流量曲线差值法
if (realSwHValue != null && CollectionUtils.isNotEmpty(stZqrlBList)) { if (realSwHValue != null && CollectionUtils.isNotEmpty(stZqrlBList)) {
BigDecimal maxZ = stZqrlBList.stream().max(Comparator.comparing(StZqrlB::getZ)).get().getZ(); BigDecimal maxZ = stZqrlBList.stream().max(Comparator.comparing(StZqrlB::getZ)).get().getZ();
@ -310,6 +322,9 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
resultVo.setRealCkQValue(DataHandleUtil.calcData(realSwHValue, stZvalMap, list));// 真实出库流量 resultVo.setRealCkQValue(DataHandleUtil.calcData(realSwHValue, stZvalMap, list));// 真实出库流量
} }
} }
} else {
// 没有真实水位就用预测水位算(作为预测库容)
calculateCap(zvarlBS, resultVo, resultVo.getYcSwHValue());
} }
BigDecimal drp = new BigDecimal(pRealMap.get(dateMinuteStr));// 根据时间取更准确 BigDecimal drp = new BigDecimal(pRealMap.get(dateMinuteStr));// 根据时间取更准确
if (drp.compareTo(BigDecimal.ZERO) < 0) { if (drp.compareTo(BigDecimal.ZERO) < 0) {
@ -330,6 +345,28 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
return voList; return voList;
} }
/**
* @description:
* @param zvarlBS 线
* @param resultVo vo
* @param rz
* @return: void
* @auther: cxw
* @date: 2024-10-14, , 09:36:13
*/
private void calculateCap(List<StZvarlB> zvarlBS, ForecastResultVo resultVo, BigDecimal rz){
if(CollectionUtils.isNotEmpty(zvarlBS)){
BigDecimal maxRz = zvarlBS.stream().max(Comparator.comparing(StZvarlB::getRz)).get().getRz();
BigDecimal minRz = zvarlBS.stream().min(Comparator.comparing(StZvarlB::getRz)).get().getRz();
if(rz.compareTo(minRz) < 0 || rz.compareTo(maxRz) > 0){
return;
}
Map<BigDecimal, BigDecimal> stZvalMap = zvarlBS.stream().collect(Collectors.toMap(StZvarlB::getRz, StZvarlB::getW));
List<BigDecimal> list = zvarlBS.stream().map(StZvarlB::getRz).sorted().collect(Collectors.toList());
resultVo.setNowCap(DataHandleUtil.calcData(rz,stZvalMap,list));
}
}
/** /**
* *
*/ */