wuww
2025-05-06 378a66a369b27ba35dc1d4d1cbddd90b626d7046
生成降雨文件
已修改7个文件
151 ■■■■ 文件已修改
src/main/java/com/se/nsl/config/PropertiesConfig.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/nsl/domain/po/SimuData.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/nsl/domain/vo/ConfigVo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/nsl/service/ResolveService.java 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/nsl/service/TestService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/se/nsl/AppTest.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
    }
}
src/main/java/com/se/nsl/domain/po/SimuData.java
@@ -68,6 +68,9 @@
    @ApiModelProperty("降雨列表")
    private List<Rainfall> rainfalls;
    @ApiModelProperty("雨强单位:mm/h、mm/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;
    }
}
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() {
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转Tif");
            callZarr2tif(data);
            update(simu, 4, "解析数据");
            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());
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(
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
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() {