From ce6c5db45473661b6cf4c0825df8ddc2b62289ba Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期六, 16 九月 2023 17:40:43 +0800
Subject: [PATCH] 优化栅格分析-面分析的速度

---
 src/main/java/com/moon/server/service/data/RasterAnalysisService.java |   68 +++++++++++++++++++++++++++++++--
 1 files changed, 63 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java
index a2866b4..19f0b96 100644
--- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java
+++ b/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();

--
Gitblit v1.9.3