wuww
2025-05-16 7b2459ba1c1f14c06f17914f3d53ebcd6e2641a3
解决土地利用裁剪后使用异常
已修改2个文件
48 ■■■■ 文件已修改
src/main/java/com/se/nsl/helper/ComHelper.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/nsl/service/ResolveService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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) {
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(注意Java的byte是有符号的,需处理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);  // 设置新Nodata值
        band.FlushCache(); // 强制写入更改
        ds.delete();
    }
    private void createDir(String path) {
        File f = new File(path);
        if (f.exists() && f.isDirectory()) {