月球大数据地理空间分析展示平台-【后端】-月球后台服务
13693261870
2023-09-16 ce6c5db45473661b6cf4c0825df8ddc2b62289ba
优化栅格分析-面分析的速度
已修改2个文件
70 ■■■■■ 文件已修改
src/main/java/com/moon/server/entity/all/StaticData.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/moon/server/service/data/RasterAnalysisService.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/moon/server/entity/all/StaticData.java
@@ -62,6 +62,8 @@
    public static final int I60 = 60;
    public static final int I64 = 64;
    public static final int I90 = 90;
    public static final int I90_NEG = -90;
src/main/java/com/moon/server/service/data/RasterAnalysisService.java
@@ -37,6 +37,20 @@
    private final static Log log = LogFactory.getLog(RasterAnalysisService.class);
    /**
     * 测试
     */
    public List<AnalysisResultEntity> test(Geometry geo, Integer size) {
        List<AnalysisResultEntity> rs = new ArrayList<>();
        AnalysisResultEntity entity = new AnalysisResultEntity();
        entity.setLayerName("Test");
        openRaster(entity, "D:\\Moon\\data\\DOM\\Lunar_LRO_LOLA_ClrShade_Global_128ppd_v04_2.tif", geo, size);
        rs.add(entity);
        return rs;
    }
    /**
     * 分析方法
     */
    public List<AnalysisResultEntity> analysis(Geometry geo, Integer size) {
@@ -227,15 +241,53 @@
        int yMaxPixel = (int) Math.floor((maxY - env[2]) / pixelHeight);
        int bandCount = ds.getRasterCount();
        int geoWidth = Math.abs(xMaxPixel - xMinPixel);
        int geoHeight = Math.abs(yMaxPixel - yMinPixel);
        int width = Math.abs(xMaxPixel - xMinPixel);
        int height = Math.abs(yMaxPixel - yMinPixel);
        if (width * height > StaticData.I64 * StaticData.I64) {
            readRasterForBlocks(entity, ds, bandCount, xMinPixel, yMinPixel, width, height);
            return;
        }
        for (int i = 1; i <= bandCount; i++) {
            double[] pixelValues = new double[geoWidth * geoHeight];
            ds.GetRasterBand(i).ReadRaster(xMinPixel, yMinPixel, geoWidth, geoHeight, pixelValues);
            double[] pixelValues = new double[width * height];
            ds.GetRasterBand(i).ReadRaster(xMinPixel, yMinPixel, width, height, pixelValues);
            setBandVals(entity, pixelValues);
        }
    }
    /**
     * 按照块读取栅格数据
     */
    private void readRasterForBlocks(AnalysisResultEntity entity, Dataset ds, int bandCount, int xMinPixel, int yMinPixel, int width, int height) {
        List<Integer> xList = getSamples(xMinPixel, width);
        List<Integer> yList = getSamples(yMinPixel, height);
        double[] pixelValues = new double[1];
        for (int i = 1; i <= bandCount; i++) {
            List<Double> list = new ArrayList<>();
            for (Integer x : xList) {
                for (Integer y : yList) {
                    ds.GetRasterBand(i).ReadRaster(x, y, 1, 1, pixelValues);
                    list.add(pixelValues[0]);
                }
            }
            setBandVals(entity, list);
        }
    }
    /**
     * 获取抽样列表
     */
    private List<Integer> getSamples(int start, int strip) {
        List<Integer> list = new ArrayList<>();
        double avg = 1.0 * strip / StaticData.I64;
        for (int i = 0; i <= StaticData.I64; i++) {
            list.add(start + (int) Math.ceil(avg * i));
        }
        return list;
    }
    /**
@@ -258,7 +310,13 @@
        for (double val : pixelValues) {
            list.add(val);
        }
        setBandVals(entity, list);
    }
    /**
     * 设置Band值
     */
    private void setBandVals(AnalysisResultEntity entity, List<Double> list) {
        double min = Collections.min(list);
        double max = Collections.max(list);
        double avg = list.stream().mapToDouble(Double::valueOf).average().getAsDouble();