From ee26ff7331614b14c9f156c5590724e29e99dc06 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期六, 02 十一月 2024 17:08:05 +0800
Subject: [PATCH] 1

---
 src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java |   16 ++++----
 src/main/java/com/se/simu/service/ResultService.java     |   70 ++++++++++++++++++++++++++++++++--
 src/main/java/com/se/simu/service/WaterService.java      |    3 -
 3 files changed, 74 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java b/src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java
index 21280a9..6ccfea1 100644
--- a/src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java
+++ b/src/main/java/com/se/simu/domain/vo/BuildingDepthVo.java
@@ -19,14 +19,14 @@
     public BuildingDepthVo() {
     }
 
-    public BuildingDepthVo(String seid, Long timestamp, Double depth) {
-        this.seid = seid;
+    public BuildingDepthVo(String id, Long timestamp, Double depth) {
+        this.id = id;
         this.timestamp = timestamp;
         this.depth = depth;
     }
 
-    @ApiModelProperty("SE涓婚敭")
-    private String seid;
+    @ApiModelProperty("涓婚敭ID")
+    private String id;
 
     @ApiModelProperty("鏃堕棿鎴�")
     private Long timestamp;
@@ -34,12 +34,12 @@
     @ApiModelProperty("娑夋按灏濊瘯")
     private Double depth;
 
-    public String getSeid() {
-        return seid;
+    public String getId() {
+        return id;
     }
 
-    public void setSeid(String seid) {
-        this.seid = seid;
+    public void setId(String id) {
+        this.id = id;
     }
 
     public Long getTimestamp() {
diff --git a/src/main/java/com/se/simu/service/ResultService.java b/src/main/java/com/se/simu/service/ResultService.java
index 2a58383..8cb6be8 100644
--- a/src/main/java/com/se/simu/service/ResultService.java
+++ b/src/main/java/com/se/simu/service/ResultService.java
@@ -31,6 +31,8 @@
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.DoubleStream;
 
 /**
  * 澶勭悊缁撴灉鏈嶅姟绫�
@@ -67,10 +69,11 @@
         try {
             copeTerrain(dto, layer);
             copeBuilding(dto, layer);
-            copeWater(dto, layer);
+            List<BuildingDepthVo> buildings = copeWater(dto, layer);
             copeFlow(dto, layer);
             copeLayerJson(dto, layer);
             copeRainFallJson(dto, layer);
+            copeBuildingDepthJson(dto, buildings);
         } finally {
             File dir = new File(dto.getTemp());
             if (dir.exists()) {
@@ -264,11 +267,13 @@
         setWaterHeight(layer, files);
     }
 
-    private void copeWater(ResultDto dto, LayerDto layer) {
+    private List<BuildingDepthVo> copeWater(ResultDto dto, LayerDto layer) {
         List<String> files = layer.getWaters().getFiles();
-        if (files.size() == 0 || files.size() != layer.getWaters().getData().size()) return;
+        if (files.size() == 0 || files.size() != layer.getWaters().getData().size()) return null;
 
         processWaters(dto, files, layer);
+        
+        return processBuilding(dto, files, layer);
     }
 
     private static List<String> getFiles(String path, String suffix) {
@@ -405,8 +410,8 @@
                     int offset = x + y * width;
                     if (Float.isNaN(buffer[offset]) || buffer[offset] < -999 || buffer[offset] < minHeight) continue;
 
-                    double X = transform[0] + x * transform[1] + y * transform[2];
-                    double Y = transform[3] + x * transform[4] + y * transform[5];
+                    //double X = transform[0] + x * transform[1] + y * transform[2];
+                    //double Y = transform[3] + x * transform[4] + y * transform[5];
                     //BuildingDto building = intersects(dto, X, Y);
                     //if (null != building) continue;
 
@@ -441,6 +446,61 @@
         return dto.getBuildingList().parallelStream().filter(b -> b.getGeom().Intersects(p)).findFirst().orElse(null);
     }
 
+    private List<BuildingDepthVo> processBuilding(ResultDto dto, List<String> files, LayerDto layer) {
+        List<BuildingDepthVo> list = new CopyOnWriteArrayList<>();
+        for (int i = 0, c = files.size(); i < c; i++) {
+            Dataset ds = null;
+            try {
+                ds = gdal.Open(files.get(i), gdalconst.GA_ReadOnly);
+                if (null == ds || 0 == ds.getRasterCount()) continue;
+                if (null == ds.GetSpatialRef()) ds.SetSpatialRef(dto.getSpatialReference());
+
+                copeBuildingDepth(dto, ds, layer.getWaters().getData().get(i), list);
+            } finally {
+                if (null != ds) ds.delete();
+            }
+        }
+
+        return list;
+    }
+
+    private void copeBuildingDepth(ResultDto dto, Dataset ds, long ticks, List<BuildingDepthVo> list) {
+        double[] transform = ds.GetGeoTransform();
+        int xSize = ds.getRasterXSize(), ySize = ds.getRasterYSize();
+        double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = Math.abs(transform[5]);
+
+        for (BuildingDto building : dto.getBuildingList()) {
+            Double val = getValue(ds, building, xSize, ySize, minX, maxY, pixelWidth, pixelHeight);
+            list.add(new BuildingDepthVo(building.getId(), ticks, null));
+        }
+    }
+
+    private Double getValue(Dataset ds, BuildingDto building, int xSize, int ySize, double minX, double maxY, double pixelWidth, double pixelHeight) {
+        double[] env = new double[4];
+        building.getGeom().GetEnvelope(env);
+
+        int xMinPixel = Math.max((int) Math.floor((env[0] - minX) / pixelWidth), 1);
+        int yMinPixel = Math.max((int) Math.floor((maxY - env[3]) / pixelHeight), 1);
+        int xMaxPixel = Math.min((int) Math.floor((env[1] - minX) / pixelWidth), xSize);
+        int yMaxPixel = Math.min((int) Math.floor((maxY - env[2]) / pixelHeight), ySize);
+        if (xMaxPixel < 1 || yMaxPixel < 1 || xMaxPixel - xMinPixel < 0 || yMaxPixel - yMinPixel < 0) {
+            return null;
+        }
+
+        int width = xMaxPixel - xMinPixel;
+        int height = yMaxPixel - yMinPixel;
+        double[] pixelValues = new double[width * height];
+        ds.GetRasterBand(1).ReadRaster(xMinPixel, yMinPixel, width, height, pixelValues);
+
+        Double val = Arrays.stream(pixelValues).max().getAsDouble();
+
+        return isValid(val) ? val : null;
+    }
+
+    public static boolean isValid(Double val) {
+        return !Double.isNaN(val) && val > Integer.MIN_VALUE;
+    }
+
     private void copeFlow(ResultDto dto, LayerDto layer) {
         List<String> files = getFiles(dto.getFlowPath(), ".tif");
         if (null == files || files.size() != layer.getWaters().getData().size()) return;
diff --git a/src/main/java/com/se/simu/service/WaterService.java b/src/main/java/com/se/simu/service/WaterService.java
index b781db1..3f38e8d 100644
--- a/src/main/java/com/se/simu/service/WaterService.java
+++ b/src/main/java/com/se/simu/service/WaterService.java
@@ -13,7 +13,6 @@
 import org.gdal.gdal.gdal;
 import org.gdal.gdalconst.gdalconst;
 import org.gdal.osr.SpatialReference;
-import org.gdal.osr.osr;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -177,7 +176,7 @@
         if (CollectionUtils.isEmpty(list)) return null;
 
         return list.parallelStream()
-                .filter(b -> seid.equals(b.getSeid()))
+                .filter(b -> seid.equals(b.getId()))
                 .sorted((a, b) -> a.getTimestamp().compareTo(b.getTimestamp()))
                 .collect(Collectors.toList());
     }

--
Gitblit v1.9.3