From 50155d2d6da56ac59a672755a704ed1503ffe3f6 Mon Sep 17 00:00:00 2001
From: dcb <xgybdcb@163.com>
Date: 星期四, 19 六月 2025 10:07:18 +0800
Subject: [PATCH] 修复返回的模拟结果中最大最小水深问题

---
 src/main/java/com/se/nsl/helper/ComHelper.java |  106 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 101 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/se/nsl/helper/ComHelper.java b/src/main/java/com/se/nsl/helper/ComHelper.java
index ee09a54..fe10817 100644
--- a/src/main/java/com/se/nsl/helper/ComHelper.java
+++ b/src/main/java/com/se/nsl/helper/ComHelper.java
@@ -2,10 +2,7 @@
 
 import com.se.nsl.domain.dto.*;
 import lombok.extern.slf4j.Slf4j;
-import org.gdal.gdal.Band;
-import org.gdal.gdal.Dataset;
-import org.gdal.gdal.WarpOptions;
-import org.gdal.gdal.gdal;
+import org.gdal.gdal.*;
 import org.gdal.gdalconst.gdalconst;
 import org.gdal.ogr.Geometry;
 import org.gdal.ogr.ogr;
@@ -61,7 +58,7 @@
         //vector.add("-te_srs");
         //vector.add("EPSG:" + 4326);
         vector.add("-r");
-        vector.add("bilinear");
+        vector.add("bilinear"); // 鍙岀嚎鎬ф彃鍊�
         vector.add("-of");
         vector.add("GTiff");
         WarpOptions warpOptions = new WarpOptions(vector);
@@ -70,6 +67,105 @@
         destDs.delete();
     }
 
+    public static void Resample(Dataset ds, Integer targetEpsg, String dest, Double destNoData, 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 (destNoData != null) {
+        //    vector.add("-dstnodata");
+        //    vector.add("" + destNoData);
+        //}
+        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));
+        if (null != destDs) 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");
+        vector.add("EPSG:" + 4548);
+        vector.add("-t_srs");
+        vector.add("EPSG:" + 4326);
+        vector.add("-ts");
+        vector.add("" + width);
+        vector.add("" + height);
+        //vector.add("-te");
+        //vector.add("" + layer.getExtension().getMinx());
+        //vector.add("" + layer.getExtension().getMiny());
+        //vector.add("" + layer.getExtension().getMaxx());
+        //vector.add("" + layer.getExtension().getMaxy());
+        //vector.add("-te_srs");
+        //vector.add("EPSG:" + 4326);
+        vector.add("-r");
+//        vector.add("average");
+        vector.add("cubic");
+        vector.add("-of");
+        vector.add("GTiff");
+        WarpOptions warpOptions = new WarpOptions(vector);
+
+        Dataset destDs = gdal.Warp(dest, new Dataset[]{ds}, warpOptions);
+        updateLayerExtension(destDs, layer);
+        destDs.delete();
+    }
+
+    private static void updateLayerExtension(Dataset ds, LayerDto layer) {
+        double[] bbox = readTifBbox(ds);
+        double minLon = bbox[0];
+        double maxLon = bbox[1];
+        double minLat = bbox[2];
+        double maxLat = bbox[3];
+        ExtensionDto extension = layer.getExtension();
+        double minx = extension.getMinx();
+        double miny = extension.getMiny();
+        double maxx = extension.getMaxx();
+        double maxy = extension.getMaxy();
+        if (minx > minLon) extension.setMinx(minLon);
+        if (miny > minLat) extension.setMiny(minLat);
+        if (maxx < maxLon) extension.setMaxx(maxLon);
+        if (maxy < maxLat) extension.setMaxy(maxLat);
+    }
+
+    private static double[] readTifBbox(Dataset ds) {
+        // 1. 鑾峰彇鍥惧儚灏哄
+        int width = ds.getRasterXSize();
+        int height = ds.getRasterYSize();
+
+        // 2. 鑾峰彇GeoTransform鍙傛暟
+        double[] geoTransform = new double[6];
+        ds.GetGeoTransform(geoTransform);
+
+        // 3. 瑙f瀽GeoTransform鍙傛暟锛堢粡绾害鍧愭爣锛�
+        double originLon = geoTransform[0];  // 宸︿笂瑙掔粡搴�
+        double originLat = geoTransform[3];  // 宸︿笂瑙掔含搴�
+        double pixelWidth = geoTransform[1];  // 缁忓害鏂瑰悜鍒嗚鲸鐜囷紙搴�/鍍忕礌锛�
+        double pixelHeight = geoTransform[5]; // 绾害鏂瑰悜鍒嗚鲸鐜囷紙搴�/鍍忕礌锛岄�氬父涓鸿礋锛�
+
+        // 4. 璁$畻鍥涜嚦鑼冨洿锛堢粡绾害锛�
+        double minLon = Math.min(originLon, originLon + width * pixelWidth);
+        double maxLon = Math.max(originLon, originLon + width * pixelWidth);
+        double minLat = Math.min(originLat, originLat + height * pixelHeight);
+        double maxLat = Math.max(originLat, originLat + height * pixelHeight);
+        return new double[] {minLon, maxLon, minLat, maxLat};
+    }
+
     public static BuildingDto intersects(ResultDto dto, double x, double y) {
         Geometry p = new Geometry(ogr.wkbPoint);
         p.AddPoint_2D(x, y);

--
Gitblit v1.9.3