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 +++++++++++-----
 src/main/java/com/se/simu/domain/dto/PointDto.java   |   48 ++++++++++++++++
 src/main/java/com/se/simu/domain/dto/XYDto.java      |   32 ++++++++++
 src/main/java/com/se/simu/domain/po/PondingPo.java   |   13 ++++
 4 files changed, 126 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/se/simu/domain/dto/PointDto.java b/src/main/java/com/se/simu/domain/dto/PointDto.java
new file mode 100644
index 0000000..c8afafa
--- /dev/null
+++ b/src/main/java/com/se/simu/domain/dto/PointDto.java
@@ -0,0 +1,48 @@
+package com.se.simu.domain.dto;
+
+@SuppressWarnings("ALL")
+public class PointDto implements Comparable<PointDto> {
+    private double x;
+
+    private double y;
+
+    private double val;
+
+    PointDto() {
+    }
+
+    public PointDto(double x, double y, double val) {
+        this.x = x;
+        this.y = y;
+        this.val = val;
+    }
+
+    public double getX() {
+        return x;
+    }
+
+    public void setX(double x) {
+        this.x = x;
+    }
+
+    public double getY() {
+        return y;
+    }
+
+    public void setY(double y) {
+        this.y = y;
+    }
+
+    public double getVal() {
+        return val;
+    }
+
+    public void setVal(double val) {
+        this.val = val;
+    }
+
+    @Override
+    public int compareTo(PointDto other) {
+        return Double.compare(this.getVal(), other.getVal());
+    }
+}
diff --git a/src/main/java/com/se/simu/domain/dto/XYDto.java b/src/main/java/com/se/simu/domain/dto/XYDto.java
new file mode 100644
index 0000000..adbf9dd
--- /dev/null
+++ b/src/main/java/com/se/simu/domain/dto/XYDto.java
@@ -0,0 +1,32 @@
+package com.se.simu.domain.dto;
+
+@SuppressWarnings("ALL")
+public class XYDto {
+    private int x;
+
+    private int y;
+
+    public XYDto() {
+    }
+
+    public XYDto(int x, int y) {
+        this.x = x;
+        this.y = y;
+    }
+
+    public int getX() {
+        return x;
+    }
+
+    public void setX(int x) {
+        this.x = x;
+    }
+
+    public int getY() {
+        return y;
+    }
+
+    public void setY(int y) {
+        this.y = y;
+    }
+}
diff --git a/src/main/java/com/se/simu/domain/po/PondingPo.java b/src/main/java/com/se/simu/domain/po/PondingPo.java
index afd78fc..b44ba90 100644
--- a/src/main/java/com/se/simu/domain/po/PondingPo.java
+++ b/src/main/java/com/se/simu/domain/po/PondingPo.java
@@ -1,6 +1,9 @@
 package com.se.simu.domain.po;
 
+import com.se.simu.domain.dto.PointDto;
 import io.swagger.annotations.ApiModelProperty;
+import org.gdal.ogr.Geometry;
+import org.gdal.ogr.ogr;
 
 @SuppressWarnings("ALL")
 public class PondingPo {
@@ -16,6 +19,16 @@
     public PondingPo() {
     }
 
+    public PondingPo(Geometry polygon, PointDto dto) {
+        Geometry point = new Geometry(ogr.wkbPoint);
+        point.AddPoint_2D(dto.getX(), dto.getY());
+        point.AssignSpatialReference(polygon.GetSpatialReference());
+
+        this.polygon = polygon.ExportToWkt();
+        this.point = point.ExportToWkt();
+        this.depth = dto.getVal();
+    }
+
     public PondingPo(String polygon, String point, Double depth) {
         this.polygon = polygon;
         this.point = point;
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