From a6fe405947004d6571806edabd8f14357e144cfa Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期一, 14 十月 2024 17:31:31 +0800
Subject: [PATCH] 1

---
 src/main/java/com/se/simu/service/ResultService.java |  122 +++++++++++++++++++++++++++-------------
 1 files changed, 81 insertions(+), 41 deletions(-)

diff --git a/src/main/java/com/se/simu/service/ResultService.java b/src/main/java/com/se/simu/service/ResultService.java
index b40b757..772ec93 100644
--- a/src/main/java/com/se/simu/service/ResultService.java
+++ b/src/main/java/com/se/simu/service/ResultService.java
@@ -1,14 +1,14 @@
 package com.se.simu.service;
 
 import cn.hutool.core.io.FileUtil;
-import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.se.simu.config.PropertiesConfig;
 import com.se.simu.domain.dto.ExtensionDto;
 import com.se.simu.domain.dto.LayerDto;
 import com.se.simu.domain.dto.ResultDto;
+import com.se.simu.domain.po.DataPo;
 import com.se.simu.helper.GdalHelper;
 import lombok.extern.slf4j.Slf4j;
-import nonapi.io.github.classgraph.utils.FileUtils;
 import org.gdal.gdal.Band;
 import org.gdal.gdal.Dataset;
 import org.gdal.gdal.WarpOptions;
@@ -40,7 +40,7 @@
 
     public final static double MAX_X_OFFSET = 0.002;
 
-    public String test() throws Exception {
+    public String testResuslt() throws Exception {
         ResultDto dto = new ResultDto(
                 "202409",
                 "D:\\simu\\input\\tongzhou-local-mesh2-terrain.tif",
@@ -49,15 +49,28 @@
                 "D:\\simu\\input\\flows",
                 "D:\\simu\\out",
                 "");
-        process(dto);
+        LayerDto layer = new LayerDto(config.getVer(), 4528, config.getSizes());
+        process(dto, layer);
 
         return "OK";
     }
 
-    public void process(ResultDto dto) throws Exception {
-        try {
-            LayerDto layer = new LayerDto(config.getVer());
+    public void process(DataPo 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.getOutPath(),
+                "");
+        LayerDto layer = new LayerDto(config.getVer(), data.getEpsg(), config.getSizes());
+        process(dto, layer);
+    }
 
+    private void process(ResultDto dto, LayerDto layer) throws Exception {
+        try {
             copeTerrain(dto, layer);
             copeBuilding(dto, layer);
             copeWater(dto, layer);
@@ -128,14 +141,11 @@
 
     private static void Resample(Dataset ds, String dest, int width, int height, LayerDto layer) {
         Vector<String> vector = new Vector<>();
-        //vector.add("-s_srs");
-        //vector.add("EPSG:" + 4326);
         vector.add("-t_srs");
         vector.add("EPSG:" + 4326);
-        vector.add("-r");
-        vector.add("bilinear");
-        vector.add("-of");
-        vector.add("GTiff");
+        vector.add("-ts");
+        vector.add("" + width);
+        vector.add("" + height);
         vector.add("-te");
         vector.add("" + layer.getExtension().getMinx());
         vector.add("" + layer.getExtension().getMiny());
@@ -143,6 +153,10 @@
         vector.add("" + layer.getExtension().getMaxy());
         vector.add("-te_srs");
         vector.add("EPSG:" + 4326);
+        vector.add("-r");
+        vector.add("bilinear");
+        vector.add("-of");
+        vector.add("GTiff");
         WarpOptions warpOptions = new WarpOptions(vector);
 
         Dataset destDs = gdal.Warp(dest, new Dataset[]{ds}, warpOptions);
@@ -161,11 +175,6 @@
             band.ReadRaster(0, 0, width, height, buffer);
 
             BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-            Graphics2D graphic = image.createGraphics();
-            Color transparent = new Color(0, 0, 0, 0);
-            graphic.setColor(transparent);
-            graphic.clearRect(0, 0, width, height);
-
             double differ = layer.getExtension().getMaxHeight() - layer.getExtension().getMinHeight(), minHeight = layer.getExtension().getMinHeight();
             for (int x = 0; x < width; x++) {
                 for (int y = 0; y < height; y++) {
@@ -182,15 +191,25 @@
                     }
 
                     Color color = new Color(r, g, b, 127);
-                    //image.setRGB(x, y, color.getRGB());
-                    graphic.drawImage(image, x, y, 1, 1, color, null);
+                    //graphic.drawImage(image, x, y, 1, 1, color, null);
+                    image.setRGB(x, y, color.getRGB());
                 }
             }
-            graphic.dispose();
             savePng(image, png);
         } finally {
             if (null != ds) ds.delete();
         }
+    }
+
+    private static BufferedImage createImage(int width, int height) {
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D graphic = image.createGraphics();
+        Color transparent = new Color(0, 0, 0, 0);
+        graphic.setColor(transparent);
+        graphic.clearRect(0, 0, width, height);
+        graphic.dispose();
+
+        return image;
     }
 
     private static void savePng(BufferedImage image, String png) {
@@ -250,9 +269,9 @@
     }
 
     private static List<String> getFiles(String path, String suffix) {
-
         List<String> files = new ArrayList<>();
         getFiles(files, new File(path), suffix);
+        files.sort((a, b) -> a.compareToIgnoreCase(b));
 
         return files;
     }
@@ -281,11 +300,13 @@
     private static void setWaterData(LayerDto layer, List<String> files) {
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(new Date());
+        calendar.set(Calendar.MILLISECOND, 0);
+
         for (String file : files) {
-            String fileName = new File(file).getName();
+            String fileName = getNameWithExt(file);
             int hour = Integer.parseInt(fileName.substring(0, 2));
-            int minute = Integer.parseInt(fileName.substring(2, 2));
-            int second = Integer.parseInt(fileName.substring(4, 2));
+            int minute = Integer.parseInt(fileName.substring(2, 4));
+            int second = Integer.parseInt(fileName.substring(4, 6));
 
             calendar.set(Calendar.HOUR_OF_DAY, hour);
             calendar.set(Calendar.MINUTE, minute);
@@ -298,10 +319,10 @@
     }
 
     private static void setWaterHeight(LayerDto layer, List<String> files) {
-        for (int i = 0, c = files.size(); i < c; i++) {
+        files.parallelStream().forEach(file -> {
             Dataset ds = null;
             try {
-                ds = gdal.Open(files.get(i), gdalconst.GA_ReadOnly);
+                ds = gdal.Open(file, gdalconst.GA_ReadOnly);
                 if (null == ds || 0 == ds.getRasterCount() || null == ds.GetSpatialRef()) return;
 
                 double[] mm = new double[2];
@@ -310,7 +331,7 @@
             } finally {
                 if (null != ds) ds.delete();
             }
-        }
+        });
         layer.getExtension().setMinHeight(getMinVal(layer.getExtension().getMinHeight() - 1, 1000));
         layer.getExtension().setMaxHeight(getMaxVal(layer.getExtension().getMaxHeight() + 1, 1000));
     }
@@ -346,7 +367,7 @@
     }
 
     private static String getNameWithExt(String file) {
-        return file.substring(file.lastIndexOf(File.separator), file.lastIndexOf("."));
+        return file.substring(file.lastIndexOf(File.separator) + 1, file.lastIndexOf("."));
     }
 
     private static void water2Png(ResultDto dto, LayerDto layer, String tif, String png, int width, int height) {
@@ -362,11 +383,6 @@
             float[] building = dto.getBuildings().get(width + "_" + height);
 
             BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-            Graphics2D graphic = image.createGraphics();
-            Color transparent = new Color(0, 0, 0, 0);
-            graphic.setColor(transparent);
-            graphic.clearRect(0, 0, width, height);
-
             double differ = layer.getExtension().getMaxHeight() - layer.getExtension().getMinHeight(), minHeight = layer.getExtension().getMinHeight();
             for (int x = 0; x < width; x++) {
                 for (int y = 0; y < height; y++) {
@@ -384,11 +400,9 @@
                     }
 
                     Color color = new Color(r, g, b, 127);
-                    //image.setRGB(x, y, color.getRGB());
-                    graphic.drawImage(image, x, y, 1, 1, color, null);
+                    image.setRGB(x, y, color.getRGB());
                 }
             }
-            graphic.dispose();
             savePng(image, png);
         } finally {
             if (null != ds) ds.delete();
@@ -400,8 +414,8 @@
         List<String> vyFiles = new ArrayList<>();
         List<String> files = getFiles(dto.getFlowPath(), ".tif");
         for (String file : files) {
-            if (file.startsWith("vx")) vxFiles.add(file);
-            if (file.startsWith("vy")) vyFiles.add(file);
+            if (file.contains(File.separator + "vx")) vxFiles.add(file);
+            if (file.contains(File.separator + "vy")) vyFiles.add(file);
         }
         if (null == vxFiles || null == vyFiles || vxFiles.size() != vyFiles.size() || vxFiles.size() != layer.getWaters().getData().size())
             return;
@@ -461,7 +475,28 @@
     }
 
     private static void createFlowPng(float[] vxBuffer, float[] vyBuffer, String png, int width, int height) {
-        //
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+        // 鐢� R閫氶亾琛ㄧず锛屾祦鍚戜负褰掍竴鍖栫殑浜岀淮鍚戦噺锛坸,y锛夛紝G閫氶亾琛ㄧず涓� x *255 , B閫氶亾琛ㄧず涓� y * 255
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                int offset = x + y * width;
+                float fx = getFloatValue(vxBuffer[offset]);
+                float fy = getFloatValue(vyBuffer[offset]);
+                if (Float.isNaN(fx) && Float.isNaN(fy) || (fx == 0 && fy == 0)) continue;
+
+                fx = Float.isNaN(fx) ? 0 : fx;
+                fy = Float.isNaN(fy) ? 0 : fy;
+                double dr = Math.sqrt(Math.pow(fx, 2) + Math.pow(fy, 2));
+
+                int r = (int) (dr / 4 * 255);
+                int g = (int) ((fx / dr * 0.5 + 0.5) * 255);
+                int b = (int) ((fy / dr * 0.5 + 0.5) * 255);
+
+                Color color = new Color(getSafeValue(r), getSafeValue(g), getSafeValue(b), 127);
+                image.setRGB(x, y, color.getRGB());
+            }
+        }
+        savePng(image, png);
     }
 
     private static float getFloatValue(float val) {
@@ -475,8 +510,13 @@
         return val;
     }
 
+    /**
+     * 鍏冩暟鎹�
+     */
     private void copeLayerJson(ResultDto dto, LayerDto layer) throws IOException {
-        String json = JSONUtil.toJsonPrettyStr(layer);
+        layer.getWaters().setFiles(null);
+        //String json = JSONUtil.toJsonPrettyStr(layer);
+        String json = JSON.toJSONString(layer);
         String filePath = dto.getOutPath() + File.separator + "layer.json";
 
         FileWriter fw = new FileWriter(filePath);

--
Gitblit v1.9.3