1
13693261870
2024-09-30 6827092435f97dcd7bf557eb01711d24f437ce55
1
已修改2个文件
114 ■■■■■ 文件已修改
src/main/java/com/se/simu/helper/GdalHelper.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/ResultService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/GdalHelper.java
@@ -5,10 +5,7 @@
import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.ogr.DataSource;
import org.gdal.ogr.Driver;
import org.gdal.ogr.Layer;
import org.gdal.ogr.ogr;
import org.gdal.ogr.*;
import org.gdal.osr.SpatialReference;
import org.gdal.osr.osr;
@@ -143,4 +140,63 @@
            log.error(ex.getMessage(), ex);
        }
    }
    public static Geometry getMinPoint(Dataset ds)
    {
        double[] transform = new double[6];
        ds.GetGeoTransform(transform);
        double xMin = transform[0];
        double yMin = transform[3] - ds.getRasterYSize() * transform[1];
        Geometry point = new Geometry(ogr.wkbPoint);
        point.AddPoint(xMin, yMin, 0);
        return Transform(ds, point);
    }
    public static Geometry getMaxPoint(Dataset ds)
    {
        /*
         * transform[0] 左上角x坐标
         * transform[1] 东西方向分辨率
         * transform[2] 旋转角度, 0表示图像 "北方朝上"
         *
         * transform[3] 左上角y坐标
         * transform[4] 旋转角度, 0表示图像 "北方朝上"
         * transform[5] 南北方向分辨率
         */
        double[] transform = new double[6];
        ds.GetGeoTransform(transform);
        double xMax = transform[0] + (ds.getRasterYSize() * transform[1]);
        double yMax = transform[3];
        Geometry point = new Geometry(ogr.wkbPoint);
        point.AddPoint(xMax, yMax, 0);
        return Transform(ds, point);
    }
    public static Geometry Transform(Dataset ds, Geometry point)
    {
        point.AssignSpatialReference(ds.GetSpatialRef());
        if (ds.GetSpatialRef().IsGeographic() > 0)
        {
            return point;
        }
        String srsName = ds.GetSpatialRef().GetName();
        //if (srsName.Contains(CGCS2000))
        //{
        //    point.TransformTo(sr4490);
        //}
        //else
        //{
        point.TransformTo(SR4326);
        //}
        point.SwapXY();
        return point;
    }
}
src/main/java/com/se/simu/service/ResultService.java
@@ -3,9 +3,16 @@
import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONUtil;
import com.se.simu.config.PropertiesConfig;
import com.se.simu.domain.dto.ExtensionDto;
import com.se.simu.domain.dto.LayerDto;
import com.se.simu.domain.dto.ResultDto;
import com.se.simu.helper.GdalHelper;
import lombok.extern.slf4j.Slf4j;
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.ogr.Geometry;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -47,7 +54,48 @@
    }
    private void copeTerrain(ResultDto dto, LayerDto layer) {
        //
        Dataset ds = null;
        try {
            ds = gdal.Open(dto.getTerrainFile(), gdalconst.GA_ReadOnly);
            if (null == ds || 0 == ds.getRasterCount() || null == ds.GetSpatialRef()) return;
            setTerrainInfo(ds, layer);
            setWaterInfo(dto, layer);
            createTerrainPng(dto, ds, layer);
        } finally {
            if (null != ds) ds.delete();
        }
    }
    private void setTerrainInfo(Dataset ds, LayerDto layer) {
        Geometry minPoint = GdalHelper.getMinPoint(ds);
        Geometry maxPoint = GdalHelper.getMaxPoint(ds);
        double minx = getMinVal(minPoint.GetX(0), 10000000);
        double miny = getMinVal(minPoint.GetY(0), 10000000);
        double maxx = getMaxVal(maxPoint.GetX(0) + MAX_X_OFFSET, 10000000);
        double maxy = getMaxVal(maxPoint.GetY(0), 10000000);
        layer.setExtension(new ExtensionDto(minx, miny, maxx, maxy, Double.MAX_VALUE, Double.MIN_VALUE));
        Band band = ds.GetRasterBand(1);
        double[] mm = new double[2];
        band.ComputeRasterMinMax(mm, 0);
        layer.getTerrain().setHeight(getMinVal(mm[0], 1000), getMaxVal(mm[1], 1000));
    }
    private static double getMinVal(double val, double radix) {
        return ((long) Math.floor(val * radix)) / radix;
    }
    private static double getMaxVal(double val, double radix) {
        return ((long) Math.ceil(val * radix)) / radix;
    }
    private void setWaterInfo(ResultDto dto, LayerDto layer) {
    }
    private void createTerrainPng(ResultDto dto, Dataset ds, LayerDto layer) {
    }
    private void copeBuilding(ResultDto dto, LayerDto layer) {