SundaySee
2025-05-15 e040d561d798536f666fffbe33f9b43ecbed5bba
修复设置layer的extension的问题
已修改2个文件
67 ■■■■ 文件已修改
src/main/java/com/se/nsl/helper/ComHelper.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/nsl/service/TestService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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. 解析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);
src/main/java/com/se/nsl/service/TestService.java
@@ -99,10 +99,14 @@
    public void setTerrainInfo(Dataset ds, LayerDto layer) {
        Geometry minPoint = GdalHelper.getMinPoint(ds);
        Geometry maxPoint = GdalHelper.getMaxPoint(ds);
        double minx = ComHelper.getMinVal(minPoint.GetX(0), 10000000);
        double miny = ComHelper.getMinVal(minPoint.GetY(0), 10000000);
        double maxx = ComHelper.getMaxVal(maxPoint.GetX(0) + MAX_X_OFFSET, 10000000);
        double maxy = ComHelper.getMaxVal(maxPoint.GetY(0), 10000000);
//        double minx = ComHelper.getMinVal(minPoint.GetX(0), 10000000);
//        double miny = ComHelper.getMinVal(minPoint.GetY(0), 10000000);
//        double maxx = ComHelper.getMaxVal(maxPoint.GetX(0) + MAX_X_OFFSET, 10000000);
//        double maxy = ComHelper.getMaxVal(maxPoint.GetY(0), 10000000);
        double minx = Double.MAX_VALUE;
        double miny = Double.MAX_VALUE;
        double maxx = Double.MIN_VALUE;
        double maxy = Double.MIN_VALUE;
        //layer.setExtension(new ExtensionDto(minx, miny, maxx, maxy, Double.MAX_VALUE, Double.MIN_VALUE));
        Band band = ds.GetRasterBand(1);
@@ -222,10 +226,6 @@
    public void setWaterHeight(LayerDto layer, List<String> files) {
        int c = files.size(), step = files.size() / 10;
        if (step < 1) step = 1;
        double minx = Double.MAX_VALUE;
        double miny = Double.MAX_VALUE;
        double maxx = Double.MIN_VALUE;
        double maxy = Double.MIN_VALUE;
        for (int i = 0; i < c; i += step) {
            Dataset ds = null;
            try {
@@ -235,16 +235,6 @@
                double[] mm = new double[2];
                ds.GetRasterBand(1).ComputeRasterMinMax(mm, 0);
                layer.getWaters().setHeight(mm[0], mm[1]);
                double[] bbox = readTifBbox(ds);
                double minLon = bbox[0];
                double maxLon = bbox[1];
                double minLat = bbox[2];
                double maxLat = bbox[3];
                if (minx > minLon) minx = minLon;
                if (miny > minLat) miny = minLat;
                if (maxx < maxLon) maxx = maxLon;
                if (maxy < maxLat) maxy = maxLat;
            } finally {
                if (null != ds) ds.delete();
            }