From 5296b04442d1c09bf55a8f5a556355788ee9f8ca Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期四, 14 十一月 2024 15:09:29 +0800
Subject: [PATCH] 1

---
 src/main/java/com/se/simu/service/ResultService.java |   50 +++++++++++++++++++++++++++++++++-----------------
 1 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/se/simu/service/ResultService.java b/src/main/java/com/se/simu/service/ResultService.java
index ef859a7..10d8bae 100644
--- a/src/main/java/com/se/simu/service/ResultService.java
+++ b/src/main/java/com/se/simu/service/ResultService.java
@@ -3,10 +3,7 @@
 import cn.hutool.core.io.FileUtil;
 import com.alibaba.fastjson.JSON;
 import com.se.simu.config.PropertiesConfig;
-import com.se.simu.domain.dto.BuildingDto;
-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.dto.*;
 import com.se.simu.domain.po.DataPo;
 import com.se.simu.domain.po.PondingPo;
 import com.se.simu.domain.vo.BuildingDepthVo;
@@ -532,36 +529,55 @@
     private List<PondingPo> copePonding(ResultDto dto, Dataset ds, LayerDto layer, List<Geometry> geometries) {
         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]);
 
         List<PondingPo> list = new ArrayList<>();
         for (Geometry geometry : geometries) {
-            double[] values = getValues(ds, geometry, xSize, ySize, minX, maxY, pixelWidth, pixelHeight);
+            List<PointDto> points = getValues(ds, geometry, transform, xSize, ySize);
+            if (CollectionUtils.isEmpty(points))continue;
+
+            PointDto point = Collections.max(points);
+            list.add(new PondingPo(geometry, point));
         }
 
         return list;
     }
 
-    private double[] getValues(Dataset ds, Geometry geometry, int xSize, int ySize, double minX, double maxY, double pixelWidth, double pixelHeight) {
+    private List<PointDto> getValues(Dataset ds, Geometry g,double[] transform, int xSize, int ySize) {
         double[] env = new double[4];
-        geometry.GetEnvelope(env);
+        g.GetEnvelope(env);
 
-        int startX = (int) Math.floor((env[0] - minX) / pixelWidth);
-        int endX = (int) Math.floor((env[1] - minX) / pixelWidth);
-        int startY = (int) Math.floor((maxY - env[3]) / Math.abs(pixelHeight));
-        int endY = (int) Math.floor((maxY - env[2]) / Math.abs(pixelHeight));
+        int startX = (int) Math.floor((env[0] - transform[0]) / transform[1]);
+        int endX = (int) Math.floor((env[1] - transform[0]) / transform[1]);
+        int startY = (int) Math.floor((transform[3] - env[3]) / Math.abs(transform[5]));
+        int endY = (int) Math.floor((transform[3] - env[2]) / Math.abs(transform[5]));
         if (startX < 0) startX = 0;
         if (startY < 0) startY = 0;
         if (endX > ds.getRasterXSize()) endX = ds.getRasterXSize();
         if (endY > ds.getRasterYSize()) endY = ds.getRasterYSize();
         if (endX - startX < 1 || endY - startY < 1) return null;
 
-        int width = endX - startX;
-        int height = endY - startY;
-        double[] pixelValues = new double[width * height];
-        ds.GetRasterBand(1).ReadRaster(startX, startY, width, height, pixelValues);
+        float[] values = new float[1];
+        List<PointDto> points = new ArrayList<>();
+        for (int x = startX; x <= endX; x++) {
+            for (int y = startY; y <= endY; y++) {
+                double X = transform[0] + x * transform[1] + y * transform[2];
+                double Y = transform[3] + x * transform[4] + y * transform[5];
+                ds.GetRasterBand(1).ReadRaster(startX, startY, 1, 1, values);
 
-        return pixelValues;
+                if (Float.isNaN(values[0]) || values[0] < -999 || !isContains(g, X, Y)) continue;
+                points.add(new PointDto(X, Y, values[0]));
+            }
+        }
+
+        return points;
+    }
+
+    private boolean isContains(Geometry g, double x, double y) {
+        Geometry p = new Geometry(ogr.wkbPoint);
+        p.AddPoint_2D(x, y);
+        p.AssignSpatialReference(g.GetSpatialReference());
+
+        return g.Contains(p);
     }
 
     private void copeFlow(ResultDto dto, LayerDto layer) {

--
Gitblit v1.9.3