From cfdc569b6316ed2e44bc7fc85b785612262abe21 Mon Sep 17 00:00:00 2001
From: wuww <252740454@qq.com>
Date: 星期五, 16 五月 2025 14:41:42 +0800
Subject: [PATCH] 添加裁剪DEM、土地利用功能

---
 src/main/java/com/se/nsl/controller/TestController.java |    8 +++-
 src/main/java/com/se/nsl/service/ResolveService.java    |   41 +++++++++++++++-----
 src/main/java/com/se/nsl/config/PropertiesConfig.java   |   30 +++++++++++++++
 src/main/java/com/se/nsl/helper/ComHelper.java          |   27 +++++++++++++
 src/main/resources/application-prod.yml                 |    5 ++
 src/main/java/com/se/nsl/domain/vo/ConfigVo.java        |    6 +-
 6 files changed, 100 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/se/nsl/config/PropertiesConfig.java b/src/main/java/com/se/nsl/config/PropertiesConfig.java
index 3540064..6d19af8 100644
--- a/src/main/java/com/se/nsl/config/PropertiesConfig.java
+++ b/src/main/java/com/se/nsl/config/PropertiesConfig.java
@@ -78,6 +78,12 @@
 
     private String flowPath;
 
+    private String sourceDem;
+
+    private String sourceLanduse;
+
+    private String landuseFile;
+
     private boolean copyTif;
 
     private String tifPath;
@@ -413,4 +419,28 @@
     public void setEpsg(Integer epsg) {
         this.epsg = epsg;
     }
+
+    public String getSourceDem() {
+        return sourceDem;
+    }
+
+    public void setSourceDem(String sourceDem) {
+        this.sourceDem = sourceDem;
+    }
+
+    public String getSourceLanduse() {
+        return sourceLanduse;
+    }
+
+    public void setSourceLanduse(String sourceLanduse) {
+        this.sourceLanduse = sourceLanduse;
+    }
+
+    public String getLanduseFile() {
+        return landuseFile;
+    }
+
+    public void setLanduseFile(String landuseFile) {
+        this.landuseFile = landuseFile;
+    }
 }
diff --git a/src/main/java/com/se/nsl/controller/TestController.java b/src/main/java/com/se/nsl/controller/TestController.java
index 860970d..45418e8 100644
--- a/src/main/java/com/se/nsl/controller/TestController.java
+++ b/src/main/java/com/se/nsl/controller/TestController.java
@@ -336,12 +336,16 @@
         resolveService.createRainfallFile(simu, data);
         resolveService.callUwSolver(data);*/
 
-        SimuData data = new SimuData();
+        /*SimuData data = new SimuData();
         data.setStartTime(new Date(1748747454000L));
         data.setInPath("20250515143948");
         data.setOutPath(data.getInPath());
         data.setEpsg(4548);
-        testService.test(data);
+        testService.test(data);*/
+
+        Simu simu = simuService.selectById(17);
+        SimuData data = JSON.parseObject(simu.getData(), SimuData.class);
+        resolveService.initArgs(simu, data);
 
         return (Object) System.currentTimeMillis();
     }
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 3118f11..9a4e4ae 100644
--- a/src/main/java/com/se/nsl/domain/vo/ConfigVo.java
+++ b/src/main/java/com/se/nsl/domain/vo/ConfigVo.java
@@ -50,9 +50,9 @@
     public ConfigVo(String terrain, String landuse, String station, String raingage, String saveName, int duration, int frames) {
         this();
 
-        //this.terrain.set(0, terrain.replace("\\", "/")); // 鍦板舰楂樼▼鏁版嵁
-        //this.landuse.set(0, landuse.replace("\\", "/")); // 鍦熷湴鍒╃敤绫诲瀷
-        //this.station.set(0, station.replace("\\", "/")); // 闆ㄩ噺绔欑储寮�
+        this.terrain.set(0, terrain.replace("\\", "/")); // 鍦板舰楂樼▼鏁版嵁
+        this.landuse.set(0, landuse.replace("\\", "/")); // 鍦熷湴鍒╃敤绫诲瀷
+        this.station.set(0, station.replace("\\", "/")); // 闆ㄩ噺绔欑储寮�
         this.raingage = raingage.replace("\\", "/");
         this.duration = duration;
 
diff --git a/src/main/java/com/se/nsl/helper/ComHelper.java b/src/main/java/com/se/nsl/helper/ComHelper.java
index 9946591..7988031 100644
--- a/src/main/java/com/se/nsl/helper/ComHelper.java
+++ b/src/main/java/com/se/nsl/helper/ComHelper.java
@@ -70,6 +70,33 @@
         destDs.delete();
     }
 
+    public static void Resample(Dataset ds, Integer targetEpsg, String dest, String wkt, Integer width, Integer height) {
+        Vector<String> vector = new Vector<>();
+        if (targetEpsg != null) {
+            //vector.add("-s_srs");
+            //vector.add("EPSG:" + 4548);
+            vector.add("-t_srs");
+            vector.add("EPSG:" + targetEpsg);
+        }
+        if (wkt != null) {
+            vector.add("-cutline");
+            vector.add(wkt);
+            vector.add("-crop_to_cutline");
+        }
+        if (width != null && height != null) {
+            vector.add("-ts");
+            vector.add("" + width);
+            vector.add("" + height);
+        }
+        vector.add("-r");
+        vector.add("bilinear"); // 鍙岀嚎鎬ф彃鍊�
+        vector.add("-of");
+        vector.add("GTiff");
+
+        Dataset destDs = gdal.Warp(dest, new Dataset[]{ds}, new WarpOptions(vector));
+        destDs.delete();
+    }
+
     public static void Resample2(Dataset ds, String dest, int width, int height, LayerDto layer) {
         Vector<String> vector = new Vector<>();
         vector.add("-s_srs");
diff --git a/src/main/java/com/se/nsl/service/ResolveService.java b/src/main/java/com/se/nsl/service/ResolveService.java
index e9a9740..8b10d9d 100644
--- a/src/main/java/com/se/nsl/service/ResolveService.java
+++ b/src/main/java/com/se/nsl/service/ResolveService.java
@@ -11,12 +11,18 @@
 import com.se.nsl.domain.po.SimuData;
 import com.se.nsl.domain.vo.ConfigVo;
 import com.se.nsl.helper.ComHelper;
+import com.se.nsl.helper.GdalHelper;
 import com.se.nsl.helper.StringHelper;
 import com.se.nsl.helper.WebHelper;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.gdal.gdal.Dataset;
+import org.gdal.gdal.gdal;
+import org.gdal.gdalconst.gdalconstConstants;
 import org.gdal.ogr.Geometry;
 import org.gdal.ogr.ogr;
+import org.gdal.osr.CoordinateTransformation;
+import org.gdal.osr.SpatialReference;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -108,7 +114,7 @@
             SimuData data = JSONUtil.toBean(simu.getData(), SimuData.class);
 
             update(simu, 1, "鍒濆鍖栧弬鏁�");
-            initArgs(data);
+            initArgs(simu, data);
             createRainfallFile(simu, data);
 
             update(simu, 2, "璋冪敤姹傝В鍣�");
@@ -138,18 +144,30 @@
     /**
      * 鍒濆鍖栧弬鏁�
      */
-    public void initArgs(SimuData data) throws IOException {
+    public void initArgs(Simu simu, SimuData data) throws IOException {
         String inPath = config.getInPath() + File.separator + data.getInPath();
         createDir(inPath);
         createDir(inPath + File.separator + "depth");
         createDir(inPath + File.separator + "velocity");
         createDir(config.getOutPath() + File.separator + data.getOutPath());
 
-        // 涓存椂澶嶅埗楂樼▼tif锛屼互鍚庨渶瑕佽嚜琛屽垏鍓�
-        File uwBat = new File(config.getUwSolverBat());
-        String sourceTif = uwBat.getParent() + File.separator + "case1" + File.separator + "LiuLiMiaoZhen_5m_f32.tif";
-        String targetTif = inPath + File.separator + config.getDemFile();
-        Files.copy(Paths.get(sourceTif), Paths.get(targetTif), StandardCopyOption.REPLACE_EXISTING);
+        Geometry geom = Geometry.CreateFromWkt(simu.getGeom());
+        if (geom.GetGeometryType() == ogr.wkbMultiPolygon) geom = geom.GetGeometryRef(0);
+        SpatialReference dstSR = GdalHelper.createSpatialReference(config.getEpsg());
+
+        CoordinateTransformation ct = CoordinateTransformation.CreateCoordinateTransformation(GdalHelper.SR4326, dstSR);
+        geom.Transform(ct);
+        String wkt = geom.ExportToWkt();
+
+        String terrainFile = inPath + File.separator + config.getTerrainFile();
+        Dataset dsDem = gdal.Open(config.getSourceDem(), gdalconstConstants.GA_ReadOnly);
+        ComHelper.Resample(dsDem, null, terrainFile, wkt, null, null);
+        dsDem.delete();
+
+        String landuseFile = inPath + File.separator + config.getLanduseFile();
+        Dataset dsLanduse = gdal.Open(config.getSourceLanduse(), gdalconstConstants.GA_ReadOnly);
+        ComHelper.Resample(dsLanduse, null, landuseFile, wkt, null, null);
+        dsLanduse.delete();
     }
 
     private void createDir(String path) {
@@ -228,10 +246,11 @@
         }
 
         String inPath = config.getInPath() + File.separator + data.getInPath();
-        String terrainFile = (inPath + File.separator + config.getDemFile());
+        String terrainFile = inPath + File.separator + config.getTerrainFile();
+        String landuseFile = inPath + File.separator + config.getLanduseFile();
         String rainfallFile = (inPath + File.separator + "rainfall.dat");
         String saveName = inPath + File.separator + "result.zarr";
-        ConfigVo vo = new ConfigVo(terrainFile, terrainFile, terrainFile, rainfallFile, saveName, duration, config.getSaveFrames());
+        ConfigVo vo = new ConfigVo(terrainFile, landuseFile, terrainFile, rainfallFile, saveName, duration, config.getSaveFrames());
 
         String configFile = config.getInPath() + File.separator + data.getInPath() + File.separator + data.getInPath() + ".json";
         ComHelper.writeJson(configFile, JSON.toJSONString(vo));
@@ -248,7 +267,7 @@
         String inPath = config.getInPath() + File.separator + data.getInPath();
         String zarrFile = inPath + File.separator + "result.zarr";
         String geotiffDir = inPath + File.separator + "depth";
-        String terrainFile = inPath + File.separator + config.getDemFile();
+        String terrainFile = inPath + File.separator + config.getTerrainFile();
         String jsonPath = inPath + File.separator + "zarr2tif.json";
 
         Zarr2Tif zarr2Tif = new Zarr2Tif(zarrFile, geotiffDir, terrainFile, data.getStartTime());
@@ -289,7 +308,7 @@
         File uwBat = new File(config.getUwSolverBat());
         String zarrFile = uwBat.getParent() + File.separator + "result.zarr";
         String inPath = config.getInPath() + File.separator + data.getInPath();
-        String terrainFile = inPath + File.separator + config.getDemFile();
+        String terrainFile = inPath + File.separator + config.getTerrainFile();
         String waterPath = inPath + File.separator + "depth";
 
         String cmd = String.format("%s \"%s\" \"%s\" \"%s\" \"%s\"", config.getZarr2tifBat(), "depth", zarrFile, terrainFile, waterPath);
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 76c0de3..a430f8d 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -150,7 +150,7 @@
   rainfallTitle: Station Longitude Latitude Year Month Day Hour Minute Intensity
   rainfallSite: beijing
   epsg: 4548
-  saveFrames: 6
+  saveFrames: 3
   # 鍦熷湴鍒╃敤锛�1-Cropland,2-Forest,3-Shrub,4-Grassland,5-Water,6-Snow/Ice,7-Barren,8-Impervious,9-Wetland
   landuse: 2
   #sizes: 64,128,256,512,1024,2048,4096
@@ -162,5 +162,8 @@
   buildingKey: KJSFBM
   waterPath: depth
   flowPath: velocity
+  landuseFile: Landuse.tif
+  sourceDem: D:\other\simu\CudaUWSolver-2.0\Beijing-Data-10m\Beijing-4548-ASTERDEMV3-10m.tif
+  sourceLanduse: D:\other\simu\CudaUWSolver-2.0\Beijing-Data-10m\Beijing-4548-Landuse-10m-Nonodata.tif
   copyTif: false
   tifPath: D:\other\simu\uwsolver\5ca43c87cd8e48c5a9c5399a5da46dbc\tongzhou_raster_4548_1m_clip_river_fill.tif

--
Gitblit v1.9.3