From 64208929b109627e5563ddceecca17551998c4d3 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期一, 11 九月 2023 14:44:46 +0800
Subject: [PATCH] 修改栅格分析的点、线分析功能

---
 src/main/java/com/moon/server/service/data/RasterAnalysisService.java |  253 +++++++++++++++++++++++++++-----------------------
 src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java   |    1 
 2 files changed, 139 insertions(+), 115 deletions(-)

diff --git a/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java b/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java
index 0dd9399..ee0a1fd 100644
--- a/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java
+++ b/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java
@@ -11,6 +11,7 @@
     private static final long serialVersionUID = -1237623414044281355L;
 
     public AnalysisResultEntity() {
+        code = 200;
     }
 
     private String layerName;
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 9088003..33200a8 100644
--- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java
+++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java
@@ -17,9 +17,7 @@
 
 import javax.annotation.Resource;
 import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
+import java.util.*;
 
 /**
  * 鏍呮牸鍒嗘瀽鏈嶅姟
@@ -102,21 +100,20 @@
             // double rotationX = transform[2]; double rotationY = transform[4]
             double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = transform[5];
 
+            int bandCount = ds.getRasterCount();
             int xPixel = (int) Math.floor((x - minX) / pixelWidth);
             int yPixel = (int) Math.floor((maxY - y) / Math.abs(pixelHeight));
 
-            int bandCount = ds.getRasterCount();
-
-            List<double[]> sum = new ArrayList<>();
-            for (int bandIndex = 1; bandIndex <= bandCount; bandIndex++) {
+            List<double[]> list = new ArrayList<>();
+            for (int i = 1; i <= bandCount; i++) {
                 double[] pixelValues = new double[size * size];
-                Band band = ds.GetRasterBand(bandIndex);
+                Band band = ds.GetRasterBand(i);
                 band.ReadRaster(xPixel, yPixel, size, size, pixelValues);
 
-                sum.add(pixelValues);
+                list.add(pixelValues);
             }
 
-            //return average(calculateAverage(sum));
+            processResult(entity, list);
         } catch (Exception ex) {
             setError(entity, ex.getMessage());
             log.error(ex.getMessage(), ex);
@@ -129,13 +126,130 @@
     }
 
     /**
+     * 澶勭悊缁撴灉
+     */
+    private void processResult(AnalysisResultEntity entity, List<double[]> list) {
+        if (null == list || list.isEmpty()) {
+            return;
+        }
+
+        List<Double> rs = new ArrayList<>();
+        for (double[] ds : list) {
+            if (null != ds && ds.length > 0) {
+                for (double d : ds) {
+                    rs.add(d);
+                }
+            }
+        }
+
+        processResult(rs, entity);
+    }
+
+    /**
+     * 澶勭悊缁撴灉
+     */
+    private void processResult(List<Double> rs, AnalysisResultEntity entity) {
+        double min = Collections.min(rs);
+        double max = Collections.max(rs);
+        double avg = rs.stream().mapToDouble(Double::valueOf).average().getAsDouble();
+
+        entity.setMin(min);
+        entity.setMax(max);
+        entity.setAvg(avg);
+    }
+
+    /**
      * 鍒嗘瀽绾�
      */
     public List<AnalysisResultEntity> analysisPolyline(Geometry polyline) {
         List<AnalysisResultEntity> rs = new ArrayList<>();
-        //
+
+        List<PublishEntity> pubs = publishService.selectRaster();
+        if (null == pubs || pubs.isEmpty()) {
+            return rs;
+        }
+
+        for (PublishEntity pub : pubs) {
+            AnalysisResultEntity entity = new AnalysisResultEntity();
+            entity.setLayerName(pub.getName());
+
+            processPolyline(entity, pub, polyline);
+            rs.add(entity);
+        }
 
         return rs;
+    }
+
+    /**
+     * 澶勭悊绾�
+     */
+    private void processPolyline(AnalysisResultEntity entity, PublishEntity pub, Geometry polyline) {
+        List<MetaEntity> metas = publishService.selectMetasByPubid(pub.getId());
+        if (null == metas || metas.isEmpty()) {
+            setError(entity, "鎵句笉鍒板彂甯冩暟鎹�");
+            return;
+        }
+
+        String filePath = pathHelper.getConfig().getUploadPath() + File.separator + metas.get(0).getPath();
+        File file = new File(filePath);
+        if (!file.exists() || file.isDirectory()) {
+            setError(entity, "婧愭暟鎹笉瀛樺湪");
+            return;
+        }
+
+        processPolyline(entity, filePath, polyline);
+    }
+
+    /**
+     * 澶勭悊绾�
+     */
+    public void processPolyline(AnalysisResultEntity entity, String filePath, Geometry polyline) {
+        Dataset ds = null;
+        try {
+            ds = gdal.Open(filePath);
+            if (null == ds) {
+                throw new Exception("鎵撳紑鏍呮牸鏁版嵁澶辫触");
+            }
+
+            double[] transform = ds.GetGeoTransform();
+            // double rotationX = transform[2]; double rotationY = transform[4]
+            double minX = transform[0], pixelWidth = transform[1], maxY = transform[3], pixelHeight = transform[5];
+
+            double[] bounds = new double[6];
+            polyline.GetEnvelope(bounds);
+            double startX = bounds[0], endX = bounds[1], startY = bounds[2], endY = bounds[3];
+
+            int bandCount = ds.getRasterCount();
+            int xStartPixel = (int) Math.floor((startX - minX) / pixelWidth);
+            int yStartPixel = (int) Math.floor((maxY - startY) / Math.abs(pixelHeight));
+            int xEndPixel = (int) Math.floor((endX - minX) / pixelWidth);
+            int yEndPixel = (int) Math.floor((maxY - endY) / Math.abs(pixelHeight));
+
+            List<Double> list = new ArrayList<>();
+            for (int y = Math.min(yStartPixel, yEndPixel); y <= Math.max(yStartPixel, yEndPixel); y++) {
+                for (int x = Math.min(xStartPixel, xEndPixel); x <= Math.max(xStartPixel, xEndPixel); x++) {
+                    Geometry point = new Geometry(ogr.wkbPoint);
+                    point.AddPoint(minX + pixelWidth * x, maxY - pixelHeight * y);
+                    if (polyline.Contains(point)) {
+                        for (int i = 1; i <= bandCount; i++) {
+                            double[] values = new double[1];
+                            ds.GetRasterBand(i).ReadRaster(x, y, 1, 1, values);
+                            list.add(values[0]);
+                        }
+                    }
+                }
+            }
+
+            processResult(list, entity);
+        } catch (Exception ex) {
+            setError(entity, ex.getMessage());
+            log.error(ex.getMessage(), ex);
+        } finally {
+            //  gdal.GDALDestroyDriverManager()
+            if (null != ds) {
+                ds.delete();
+            }
+        }
     }
 
     /**
@@ -146,52 +260,6 @@
         //
 
         return rs;
-    }
-
-
-    public List<Double> processLine(String imagePath, String geometryString) {
-        // 鎵撳紑鏍呮牸鍥惧儚鏁版嵁闆�
-        Dataset dataset = gdal.Open(imagePath);
-        if (dataset == null) {
-            throw new RuntimeException("Failed to open raster dataset.");
-        }
-
-        Geometry geometry = Geometry.CreateFromWkt(geometryString);
-
-        // 鏍呮牸鍍忕礌鑼冨洿
-        double[] geoTransform = dataset.GetGeoTransform();
-        double minX = geoTransform[0];
-        double pixelWidth = geoTransform[1];
-        double rotationX = geoTransform[2];
-        double maxY = geoTransform[3];
-        double rotationY = geoTransform[4];
-        double pixelHeight = geoTransform[5];
-
-        // geometry鍍忕礌鑼冨洿
-        double[] bounds = new double[6];
-        geometry.GetEnvelope(bounds);
-        double startX = bounds[0];
-        double endX = bounds[1];
-        double startY = bounds[2];
-        double endY = bounds[3];
-
-        int xStartPixel = (int) Math.floor((startX - minX) / pixelWidth);
-        int ySstartPixel = (int) Math.floor((maxY - startY) / Math.abs(pixelHeight));
-        int xEndPixel = (int) Math.floor((endX - minX) / pixelWidth);
-        int yEndPixel = (int) Math.floor((maxY - endY) / Math.abs(pixelHeight));
-
-        List<Double> values = new ArrayList<>();
-        for (int y = Math.min(ySstartPixel, yEndPixel); y <= Math.max(ySstartPixel, yEndPixel); y++) {
-            for (int x = Math.min(xStartPixel, xEndPixel); x <= Math.max(xStartPixel, xEndPixel); x++) {
-                Geometry point = new Geometry(ogr.wkbPoint);
-                point.AddPoint(minX + pixelWidth * x, maxY - pixelHeight * y);
-                if (geometry.Contains(point)) {
-                    values.add(bandValueHandle(dataset, x, y));
-                }
-            }
-        }
-
-        return values;
     }
 
     public double processPolygon(String imagePath, String geometryString) {
@@ -236,20 +304,10 @@
             sum.add(pixelValues);
         }
 
-        return average(calculateAverage(sum));
+        return 0;
     }
 
-    public static Dataset clipRaster(Dataset dataset, Geometry geometry) {
-        Vector<String> warpOptions = new Vector<>();
-        warpOptions.add("-crop_to_cutline");
-        warpOptions.add("-cutline");
-        warpOptions.add(geometry.ExportToWkt());
-        warpOptions.add("-dstalpha");
-
-        return gdal.Warp("", new Dataset[]{dataset}, new WarpOptions(warpOptions));
-    }
-
-    public double[] processClippedDataByLine(String imagePath, String geometryString) {
+    public void processClippedDataByLine(String imagePath, String geometryString) {
         // 娉ㄥ唽GDAL椹卞姩
         gdal.AllRegister();
         // 鎵撳紑鏍呮牸鍥惧儚鏁版嵁闆�
@@ -275,11 +333,19 @@
 
             sum.add(pixelValues);
         }
-
-        return calculateAverage(sum);
     }
 
-    public double processClippedDataByPolygon(String imagePath, String geometryString) {
+    public static Dataset clipRaster(Dataset dataset, Geometry geometry) {
+        Vector<String> warpOptions = new Vector<>();
+        warpOptions.add("-crop_to_cutline");
+        warpOptions.add("-cutline");
+        warpOptions.add(geometry.ExportToWkt());
+        warpOptions.add("-dstalpha");
+
+        return gdal.Warp("", new Dataset[]{dataset}, new WarpOptions(warpOptions));
+    }
+
+    public void processClippedDataByPolygon(String imagePath, String geometryString) {
         // 娉ㄥ唽GDAL椹卞姩
         gdal.AllRegister();
         // 鎵撳紑鏍呮牸鍥惧儚鏁版嵁闆�
@@ -304,50 +370,7 @@
             band.ReadRaster(0, 0, width, height, pixelValues);
 
             // 澶氭尝娈靛綊涓�鍖栧鐞�
-            bandSum[bandIndex - 1] = average(pixelValues);
-        }
-        return average(bandSum);
-    }
-
-    public static double average(double[] values) {
-        double sum = 0;
-        for (double value : values) {
-            sum += value;
-        }
-        return sum / values.length;
-    }
-
-    public static double[] calculateAverage(List<double[]> list) {
-        if (list == null || list.isEmpty()) {
-            return new double[0];
-        }
-
-        int arrayLength = list.get(0).length;
-        double[] outArray = new double[arrayLength];
-
-        for (int i = 0; i < arrayLength; i++) {
-            double sum = 0;
-
-            for (double[] array : list) {
-                sum += array[i];
-            }
-
-            outArray[i] = sum / list.size();
-        }
-
-        return outArray;
-    }
-
-    public static double bandValueHandle(Dataset dataset, int x, int y) {
-        double[] bandSum = new double[dataset.getRasterCount()];
-        for (int bandIndex = 1; bandIndex <= dataset.getRasterCount(); bandIndex++) {
-            double[] pixelValues = new double[1];
-            Band band = dataset.GetRasterBand(bandIndex);
-            band.ReadRaster(x, y, 1, 1, pixelValues);
-
             bandSum[bandIndex - 1] = pixelValues[0];
         }
-
-        return average(bandSum);
     }
 }

--
Gitblit v1.9.3