From e040d561d798536f666fffbe33f9b43ecbed5bba Mon Sep 17 00:00:00 2001
From: SundaySee <xgybdcb@163.com>
Date: 星期四, 15 五月 2025 18:44:35 +0800
Subject: [PATCH] 修复设置layer的extension的问题

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

diff --git a/src/main/java/com/se/nsl/helper/ComHelper.java b/src/main/java/com/se/nsl/helper/ComHelper.java
index 417ee73..9946591 100644
--- a/src/main/java/com/se/nsl/helper/ComHelper.java
+++ b/src/main/java/com/se/nsl/helper/ComHelper.java
@@ -93,9 +93,50 @@
         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