小玉潭洪水预报模型优化
(cherry picked from commit 06d10a70865c7561888e7e0d9f24598e298a9c9e)master
parent
fd0238ba1c
commit
f2d432d1ee
|
|
@ -99,4 +99,10 @@ public class ForecastResultVo {
|
|||
*/
|
||||
@Schema(description="土壤含水量")
|
||||
private BigDecimal pa;
|
||||
|
||||
/**
|
||||
* 水库当前库容
|
||||
*/
|
||||
@Schema(description = "水库当前库容")
|
||||
private BigDecimal nowCap;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import com.gunshi.project.xyt.model.StPptnRAverage;
|
|||
import com.gunshi.project.xyt.model.StRsvrR;
|
||||
import com.gunshi.project.xyt.model.StStbprpB;
|
||||
import com.gunshi.project.xyt.model.StZqrlB;
|
||||
import com.gunshi.project.xyt.model.StZvarlB;
|
||||
import com.gunshi.project.xyt.util.DataHandleUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
|
@ -92,6 +93,9 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
|
|||
@Autowired
|
||||
private AttResBaseService attResBaseService;
|
||||
|
||||
@Autowired
|
||||
private StZvarlBService stZvarlBService;
|
||||
|
||||
|
||||
/**
|
||||
* @description: 自动洪水预测
|
||||
|
|
@ -200,6 +204,7 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
|
|||
.collect(Collectors.toList());
|
||||
double dt = 0.0;
|
||||
double Wm = 0.0;
|
||||
double qOther = 0.0;
|
||||
Map<String, String> paramMap = paramList.stream().collect(Collectors.toMap(ForecastUseparam::getParamCode, ForecastUseparam::getParamValue));
|
||||
if (paramMap.get("dt").isEmpty()) {
|
||||
throw new IllegalArgumentException("温馨提示:当前洪水预报所依赖的数据尚不完整,请检查时间单元△T是否缺失。");
|
||||
|
|
@ -207,6 +212,9 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
|
|||
if (paramMap.get("Im").isEmpty()) {
|
||||
throw new IllegalArgumentException("温馨提示:当前洪水预报所依赖的数据尚不完整,请检查最大初损值Im是否缺失。");
|
||||
}
|
||||
if (!paramMap.get("qOther").isEmpty()) {
|
||||
qOther = Double.parseDouble(paramMap.get("qOther"));
|
||||
}
|
||||
dt = Double.parseDouble(paramMap.get("dt"));
|
||||
Wm = Double.parseDouble(paramMap.get("Im"));
|
||||
List<ForecastU> uList = forecastUService.list();
|
||||
|
|
@ -234,6 +242,8 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
|
|||
H1 = Double.parseDouble(rsvrR.getRz());
|
||||
// 泄流量
|
||||
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> resultList = reorganizeRsvrRData(rsvrRRealList, dt);
|
||||
|
|
@ -272,7 +282,7 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
|
|||
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,
|
||||
forecastPa.getPa().doubleValue(), PList, u, attResBase.getStcd());
|
||||
forecastPa.getPa().doubleValue(), PList, u, attResBase.getStcd(), qOther);
|
||||
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());
|
||||
|
|
@ -291,13 +301,15 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
|
|||
// resultVo.setRealRkQValue();// 暂无真实入库流量
|
||||
resultVo.setYcCkQValue(floodAlgorithemVo.getCq());// 预测出库流量
|
||||
resultVo.setYcSwHValue(floodAlgorithemVo.getKh());// 预测水库水位
|
||||
H1 = resultVo.getYcSwHValue().doubleValue();// 先以预测水位作为下一次预测段起始值
|
||||
H1 = resultVo.getYcSwHValue().doubleValue();// 以预测水位作为下一次预测段起始值
|
||||
String dateMinuteStr = dateStr.substring(0, dateStr.length() - 3);// 年月日 时分
|
||||
if (realRsvrMap.containsKey(dateMinuteStr)) {
|
||||
BigDecimal realSwHValue = new BigDecimal(realRsvrMap.get(dateMinuteStr));// 根据时间取更准确
|
||||
resultVo.setRealSwHValue(realSwHValue);// 真实水库水位
|
||||
calculateCap(zvarlBS, resultVo, realSwHValue);// 有真实水位就用真实水位算(作为实测库容)
|
||||
resultVo.setSwHDValue(resultVo.getYcSwHValue().subtract(resultVo.getRealSwHValue()));// 预测与真实水位差
|
||||
H1 = realSwHValue.doubleValue();// 如果有真实水位,将最后一条的真实水位作为下一次预测段的初始水位
|
||||
// 注释:修复跨8点时的陡升陡降
|
||||
// H1 = realSwHValue.doubleValue();// 如果有真实水位,将最后一条的真实水位作为下一次预测段的初始水位
|
||||
// 真实出库流量=真实水库水位与泄流量曲线差值法
|
||||
if (realSwHValue != null && CollectionUtils.isNotEmpty(stZqrlBList)) {
|
||||
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));// 真实出库流量
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 没有真实水位就用预测水位算(作为预测库容)
|
||||
calculateCap(zvarlBS, resultVo, resultVo.getYcSwHValue());
|
||||
}
|
||||
BigDecimal drp = new BigDecimal(pRealMap.get(dateMinuteStr));// 根据时间取更准确
|
||||
if (drp.compareTo(BigDecimal.ZERO) < 0) {
|
||||
|
|
@ -330,6 +345,28 @@ public class ForecastResultsService extends ServiceImpl<ForecastResultsMapper, F
|
|||
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));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算时间的小时差值
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue