From 378a66a369b27ba35dc1d4d1cbddd90b626d7046 Mon Sep 17 00:00:00 2001 From: wuww <252740454@qq.com> Date: 星期二, 06 五月 2025 16:29:03 +0800 Subject: [PATCH] 生成降雨文件 --- src/main/java/com/se/nsl/domain/po/SimuData.java | 11 +++ src/main/java/com/se/nsl/service/ResolveService.java | 83 ++++++++++++++++++++++----- src/main/java/com/se/nsl/config/PropertiesConfig.java | 20 ++++++ src/main/java/com/se/nsl/service/TestService.java | 16 +++++ src/main/resources/application-dev.yml | 2 src/test/java/com/se/nsl/AppTest.java | 10 ++ src/main/java/com/se/nsl/domain/vo/ConfigVo.java | 9 +- 7 files changed, 129 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/se/nsl/config/PropertiesConfig.java b/src/main/java/com/se/nsl/config/PropertiesConfig.java index 5f47732..86ec0da 100644 --- a/src/main/java/com/se/nsl/config/PropertiesConfig.java +++ b/src/main/java/com/se/nsl/config/PropertiesConfig.java @@ -80,6 +80,10 @@ private String tifPath; + private String rainfallTitle; + + private String rainfallSite; + public String getVer() { return ver; } @@ -363,4 +367,20 @@ public void setTifPath(String tifPath) { this.tifPath = tifPath; } + + public String getRainfallTitle() { + return rainfallTitle; + } + + public void setRainfallTitle(String rainfallTitle) { + this.rainfallTitle = rainfallTitle; + } + + public String getRainfallSite() { + return rainfallSite; + } + + public void setRainfallSite(String rainfallSite) { + this.rainfallSite = rainfallSite; + } } diff --git a/src/main/java/com/se/nsl/domain/po/SimuData.java b/src/main/java/com/se/nsl/domain/po/SimuData.java index f727183..69282da 100644 --- a/src/main/java/com/se/nsl/domain/po/SimuData.java +++ b/src/main/java/com/se/nsl/domain/po/SimuData.java @@ -68,6 +68,9 @@ @ApiModelProperty("闄嶉洦鍒楄〃") private List<Rainfall> rainfalls; + @ApiModelProperty("闆ㄥ己鍗曚綅锛歮m/h銆乵m/5min") + private String intensityUnit; + public SimuData() { gauges = new ArrayList<>(); rainfalls = new ArrayList<>(); @@ -253,4 +256,12 @@ public void setRainfalls(List<Rainfall> rainfalls) { this.rainfalls = rainfalls; } + + public String getIntensityUnit() { + return intensityUnit; + } + + public void setIntensityUnit(String intensityUnit) { + this.intensityUnit = intensityUnit; + } } diff --git a/src/main/java/com/se/nsl/domain/vo/ConfigVo.java b/src/main/java/com/se/nsl/domain/vo/ConfigVo.java index c945a9e..628d7fb 100644 --- a/src/main/java/com/se/nsl/domain/vo/ConfigVo.java +++ b/src/main/java/com/se/nsl/domain/vo/ConfigVo.java @@ -51,12 +51,13 @@ variable_dt = true; } - public ConfigVo(int hours, int frames) { + public ConfigVo(int duration, int frames, String raingage) { this(); - duration = 3600 * hours; - save_frames = frames; - save_interval = duration / frames; + this.duration = duration; + this.save_frames = frames; + this.raingage = raingage; + this.save_interval = this.duration / frames; } public List<Object> getTerrain() { diff --git a/src/main/java/com/se/nsl/service/ResolveService.java b/src/main/java/com/se/nsl/service/ResolveService.java index 462aae4..75c4e9a 100644 --- a/src/main/java/com/se/nsl/service/ResolveService.java +++ b/src/main/java/com/se/nsl/service/ResolveService.java @@ -1,10 +1,11 @@ package com.se.nsl.service; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.se.nsl.config.PropertiesConfig; -import com.se.nsl.domain.po.DataPo; +import com.se.nsl.domain.po.Rainfall; import com.se.nsl.domain.po.Simu; import com.se.nsl.domain.po.SimuData; import com.se.nsl.domain.vo.ConfigVo; @@ -13,24 +14,21 @@ import com.se.nsl.helper.WebHelper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.apache.axis.utils.StringUtils; import org.gdal.ogr.Geometry; import org.gdal.ogr.ogr; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import javax.annotation.Resource; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.sql.Timestamp; import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -49,6 +47,10 @@ @Resource TestService testService; + + Integer DIGIT = 1000000; + + SimpleDateFormat YYYYMDHM = new SimpleDateFormat("yyyy M d H m "); public int start(Simu simu) { Date now = new Date(); @@ -95,19 +97,20 @@ private void cope(Simu simu) { try { - DataPo data = JSONUtil.toBean(simu.getData(), DataPo.class); + SimuData data = JSONUtil.toBean(simu.getData(), SimuData.class); update(simu, 1, "鍒濆鍖栧弬鏁�"); initArgs(data); + createRainfallFile(data); - update(simu, 2, "璋冪敤姹傝В鍣�"); + /*update(simu, 2, "璋冪敤姹傝В鍣�"); callUwSolver(data); update(simu, 3, "璋冪敤Zarr杞琓if"); callZarr2tif(data); update(simu, 4, "瑙f瀽鏁版嵁"); - createNsl(data); + createNsl(data);*/ update(simu, 10, "瀹屾垚"); } catch (Exception ex) { @@ -127,7 +130,7 @@ /** * 鍒濆鍖栧弬鏁� */ - private void initArgs(DataPo data) throws IOException { + private void initArgs(SimuData data) throws IOException { String inPath = config.getInPath() + File.separator + data.getInPath(); createDir(inPath); createDir(inPath + File.separator + "depth"); @@ -149,14 +152,62 @@ f.mkdirs(); } + private void createRainfallFile(SimuData data) throws Exception { + List<Rainfall> rainfalls = data.getRainfalls(); + if (null == rainfalls || rainfalls.size() < 2) return; // CollUtil.isEmpty + + List<String> list = new ArrayList<>(); + list.add(config.getRainfallTitle()); + + double centerX = ComHelper.getMinVal((data.getMinx() + data.getMaxx()) / 2, DIGIT); + double centerY = ComHelper.getMinVal((data.getMiny() + data.getMaxy()) / 2, DIGIT); + String prefix = config.getRainfallSite() + " " + centerX + " " + centerY + " "; + int unit = StringUtils.isEmpty(data.getIntensityUnit()) || "mm/h".equals(data.getIntensityUnit()) ? 60 : 5; + + int c = rainfalls.size() - 1; + for (int i = 0; i < c; i++) { + Rainfall r1 = rainfalls.get(i); + Rainfall r2 = rainfalls.get(i + 1); + + list.addAll(calcRainfall(r1, r2, prefix, unit)); + } + list.add(prefix + YYYYMDHM.format(rainfalls.get(c).getTime()) + ComHelper.getMinVal(rainfalls.get(c).getIntensity() / unit, DIGIT)); + + String rainfallFile = config.getInPath() + File.separator + data.getInPath() + File.separator + "rainfall.dat"; + Files.write(Paths.get(rainfallFile), list, StandardCharsets.UTF_8); + } + + // beijing 116.0 40.0 2025 1 1 0 13 1.666666 + private List<String> calcRainfall(Rainfall r1, Rainfall r2, String prefix, int unit) { + long mins = Math.abs(r2.getTime().getTime() - r1.getTime().getTime()) / (1000 * 60); // 璁$畻鍒嗛挓鏁� + double diff = ComHelper.getMinVal((r1.getIntensity() - r2.getIntensity()) / mins / unit, DIGIT); + + Calendar cal = Calendar.getInstance(); + cal.setTime(r1.getTime()); + + List<String> list = new ArrayList<>(); + for (int i = 0; i < mins; i++) { + list.add(prefix + YYYYMDHM.format(cal.getTime()) + r1.getIntensity() + diff * i); + cal.add(Calendar.MINUTE, 1); + } + + return list; + } + /** * 璋冪敤UWSolver */ - private String callUwSolver(DataPo data) throws Exception { + private String callUwSolver(SimuData data) throws Exception { File uwBat = new File(config.getUwSolverBat()); - ConfigVo vo = new ConfigVo(data.getDuration(), config.getSaveFrames()); - //String configFile = uwBat.getParent() + File.separator + data.getInPath() + ".json"; + int duration = 3600 * data.getDuration(); // 绉掓暟 + if (null != data.getRainfalls() && data.getRainfalls().size() > 1) { + duration = (int) (Math.abs(data.getRainfalls().get(data.getRainfalls().size() - 1).getTime().getTime() - data.getRainfalls().get(0).getTime().getTime()) / 60); + } + + String rainfallFile = config.getInPath() + File.separator + data.getInPath() + File.separator + "rainfall.dat"; + ConfigVo vo = new ConfigVo(duration, config.getSaveFrames(), rainfallFile); + String configFile = config.getInPath() + File.separator + data.getInPath() + File.separator + data.getInPath() + ".json"; ComHelper.writeJson(configFile, JSON.toJSONString(vo)); @@ -168,7 +219,7 @@ /** * 璋冪敤zarr2tif */ - private String callZarr2tif(DataPo data) throws Exception { + private String callZarr2tif(SimuData data) throws Exception { File uwBat = new File(config.getUwSolverBat()); String zarrFile = uwBat.getParent() + File.separator + "result.zarr"; String inPath = config.getInPath() + File.separator + data.getInPath(); @@ -206,7 +257,7 @@ } } - private void createNsl(DataPo data) throws Exception { + private void createNsl(SimuData data) throws Exception { String inPath = config.getInPath() + File.separator + data.getInPath() + File.separator + "depth"; procTifs(inPath, inPath, data.getStartTime()); diff --git a/src/main/java/com/se/nsl/service/TestService.java b/src/main/java/com/se/nsl/service/TestService.java index 83c562e..32bb1bf 100644 --- a/src/main/java/com/se/nsl/service/TestService.java +++ b/src/main/java/com/se/nsl/service/TestService.java @@ -6,6 +6,7 @@ import com.se.nsl.domain.dto.*; import com.se.nsl.domain.po.DataPo; import com.se.nsl.domain.po.PondingPo; +import com.se.nsl.domain.po.SimuData; import com.se.nsl.domain.vo.BuildingDepthVo; import com.se.nsl.helper.ComHelper; import com.se.nsl.helper.GdalHelper; @@ -51,6 +52,21 @@ public final static SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + public void test(SimuData data) throws Exception { + String basePath = config.getInPath() + File.separator + data.getInPath() + File.separator; + ResultDto dto = new ResultDto( + data.getInPath(), + basePath + config.getTerrainFile(), + basePath + config.getBuildingFile(), + basePath + config.getWaterPath(), + basePath + config.getFlowPath(), + config.getInPath(), + config.getOutPath(), + data.getEpsg()); + LayerDto layer = new LayerDto(config.getVer(), data.getEpsg(), config.getSizes()); + process(dto, layer); + } + public void test(DataPo data) throws Exception { String basePath = config.getInPath() + File.separator + data.getInPath() + File.separator; ResultDto dto = new ResultDto( diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 5e15daf..016b1a0 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -143,6 +143,8 @@ sww2tifBat: D:\other\simu\uwsolver\sww2tif.bat uwSolverBat: D:\other\simu\uwsolver\CudaUWSolver.Demo.NoVis.20250430\start.bat zarr2tifBat: D:\other\simu\uwsolver\zarr2tif1.0\start.bat + rainfallTitle: Station Longitude Latitude Year Month Day Hour Minute Intensity + rainfallSite: beijing saveFrames: 10 #sizes: 64,128,256,512,1024,2048,4096 sizes: 1024 diff --git a/src/test/java/com/se/nsl/AppTest.java b/src/test/java/com/se/nsl/AppTest.java index c527930..8bafc75 100644 --- a/src/test/java/com/se/nsl/AppTest.java +++ b/src/test/java/com/se/nsl/AppTest.java @@ -39,10 +39,16 @@ @Test public void test() { - //procDepthFiles(); System.out.println("> test ----------------------"); - readZarr(); + //procDepthFiles(); + //readZarr(); //collectPngToList(); + + SimpleDateFormat YYYYMMDDHHMM = new SimpleDateFormat("yyyy MM dd HH mm "); + System.out.println(YYYYMMDDHHMM.format(new Date())); + + SimpleDateFormat YYYYMDHM = new SimpleDateFormat("yyyy M d H m "); + System.out.println(YYYYMDHM.format(new Date())); } private void procDepthFiles() { -- Gitblit v1.9.3