From 7b2459ba1c1f14c06f17914f3d53ebcd6e2641a3 Mon Sep 17 00:00:00 2001
From: wuww <252740454@qq.com>
Date: 星期五, 16 五月 2025 17:27:51 +0800
Subject: [PATCH] 解决土地利用裁剪后使用异常

---
 src/main/java/com/se/nsl/service/ResolveService.java |   35 +++++++++++++++++++++++++++++++++--
 src/main/java/com/se/nsl/helper/ComHelper.java       |   13 +++++++------
 2 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/se/nsl/helper/ComHelper.java b/src/main/java/com/se/nsl/helper/ComHelper.java
index 7988031..29cfbec 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;
@@ -70,7 +67,7 @@
         destDs.delete();
     }
 
-    public static void Resample(Dataset ds, Integer targetEpsg, String dest, String wkt, Integer width, Integer height) {
+    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");
@@ -78,6 +75,10 @@
             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);
@@ -94,7 +95,7 @@
         vector.add("GTiff");
 
         Dataset destDs = gdal.Warp(dest, new Dataset[]{ds}, new WarpOptions(vector));
-        destDs.delete();
+        if (null != destDs) destDs.delete();
     }
 
     public static void Resample2(Dataset ds, String dest, int width, int height, LayerDto layer) {
diff --git a/src/main/java/com/se/nsl/service/ResolveService.java b/src/main/java/com/se/nsl/service/ResolveService.java
index 8b10d9d..63b3fa5 100644
--- a/src/main/java/com/se/nsl/service/ResolveService.java
+++ b/src/main/java/com/se/nsl/service/ResolveService.java
@@ -16,6 +16,7 @@
 import com.se.nsl.helper.WebHelper;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.gdal.gdal.Band;
 import org.gdal.gdal.Dataset;
 import org.gdal.gdal.gdal;
 import org.gdal.gdalconst.gdalconstConstants;
@@ -161,15 +162,45 @@
 
         String terrainFile = inPath + File.separator + config.getTerrainFile();
         Dataset dsDem = gdal.Open(config.getSourceDem(), gdalconstConstants.GA_ReadOnly);
-        ComHelper.Resample(dsDem, null, terrainFile, wkt, null, null);
+        ComHelper.Resample(dsDem, null, terrainFile, null, wkt, null, null);
         dsDem.delete();
 
         String landuseFile = inPath + File.separator + config.getLanduseFile();
         Dataset dsLanduse = gdal.Open(config.getSourceLanduse(), gdalconstConstants.GA_ReadOnly);
-        ComHelper.Resample(dsLanduse, null, landuseFile, wkt, null, null);
+        ComHelper.Resample(dsLanduse, null, landuseFile, null, wkt, null, null);
         dsLanduse.delete();
     }
 
+    public void updateTif(Simu simu, SimuData data2) throws IOException {
+        Dataset ds = gdal.Open(config.getSourceLanduse(), gdalconstConstants.GA_Update); // 浠ヨ鍐欐ā寮忔墦寮�TIFF鏂囦欢
+
+        Band band = ds.GetRasterBand(1);
+        if (band.GetRasterDataType() != gdalconstConstants.GDT_Byte) {
+            System.err.println("閿欒锛氶潪Byte绫诲瀷鏁版嵁");
+            ds.delete();
+            return;
+        }
+
+        int width = band.getXSize();
+        int height = band.getYSize();
+
+        // 璇诲彇Byte绫诲瀷鏁版嵁
+        byte[] data = new byte[width * height];
+        band.ReadRaster(0, 0, width, height, data);
+
+        // 鏇挎崲0鍊间负8锛堟敞鎰廕ava鐨刡yte鏄湁绗﹀彿鐨勶紝闇�澶勭悊0-255鑼冨洿锛�
+        for (int i = 0; i < data.length; i++) {
+            if ((data[i] & 0xFF) == 0) {  // 鏃犵鍙锋瘮杈�
+                data[i] = (byte) 8;
+            }
+        }
+
+        band.WriteRaster(0, 0, width, height, data); // 鍐欏洖鏁版嵁骞朵繚瀛�
+        band.SetNoDataValue(8.0);  // 璁剧疆鏂癗odata鍊�
+        band.FlushCache(); // 寮哄埗鍐欏叆鏇存敼
+        ds.delete();
+    }
+
     private void createDir(String path) {
         File f = new File(path);
         if (f.exists() && f.isDirectory()) {

--
Gitblit v1.9.3