小玉潭洪水预报模型优化
(cherry picked from commit 06d10a70865c7561888e7e0d9f24598e298a9c9e)master
parent
fd0238ba1c
commit
f2d432d1ee
|
|
@ -99,4 +99,10 @@ public class ForecastResultVo {
|
||||||
*/
|
*/
|
||||||
@Schema(description="土壤含水量")
|
@Schema(description="土壤含水量")
|
||||||
private BigDecimal pa;
|
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.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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算时间的小时差值
|
* 计算时间的小时差值
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue