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