dcb
2025-06-19 68372fd1905515c5c8dbb9e3b158241994439e06
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;
@@ -44,7 +41,8 @@
        }
    }
    public static void Resample(Dataset ds, String dest, int width, int height, LayerDto layer) {
    public static void cutAndResample(Dataset ds, String dest, int width, int height,
                                      LayerDto layer, boolean resample) {
        Vector<String> vector = new Vector<>();
        //vector.add("-s_srs");
        //vector.add("EPSG:" + 4548);
@@ -60,16 +58,120 @@
        //vector.add("" + layer.getExtension().getMaxy());
        //vector.add("-te_srs");
        //vector.add("EPSG:" + 4326);
        vector.add("-r");
        vector.add("bilinear");
        vector.add("-of");
        vector.add("GTiff");
        if (resample) {
            vector.add("-r");
            vector.add("bilinear"); // 双线性插值
            vector.add("-of");
            vector.add("GTiff");
        }
        WarpOptions warpOptions = new WarpOptions(vector);
        Dataset destDs = gdal.Warp(dest, new Dataset[]{ds}, warpOptions);
        destDs.delete();
    }
    public static void cutAndResample(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 coordinateTransformAndResample(Dataset ds, String dest, int width, int height,
                                                      LayerDto layer, boolean resample) {
        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);
        if (resample) {
            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. 解析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);