| | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | |
| | | |
| | | @Resource |
| | | TestService testService; |
| | | |
| | | Integer DIGIT = 1000000; |
| | | |
| | | SimpleDateFormat YYYYMDHM = new SimpleDateFormat("yyyy M d H m "); |
| | | |
| | | public int start(Simu simu) { |
| | | Date now = new Date(); |
| | |
| | | |
| | | 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) { |
| | |
| | | /** |
| | | * 初始化参数 |
| | | */ |
| | | 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"); |
| | |
| | | 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)); |
| | | |
| | |
| | | /** |
| | | * 调用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(); |
| | |
| | | } |
| | | } |
| | | |
| | | 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()); |
| | | |