From 9ba86955948dff0655ce7f028beddfdce2bad0b4 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期一, 11 九月 2023 12:12:41 +0800
Subject: [PATCH] 栅格分析-分析点数据

---
 src/main/java/com/moon/server/entity/all/StaticData.java                    |    4 +
 src/main/java/com/moon/server/service/data/RasterAnalysisService.java       |  172 ++++++++++++++++++++++++++++++-------------
 src/main/java/com/moon/server/service/data/PublishService.java              |    5 +
 src/main/java/com/moon/server/mapper/data/PublishMapper.java                |    7 +
 src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java         |   20 +++++
 src/main/java/com/moon/server/controller/data/RasterAnalysisController.java |   12 +-
 src/main/resources/mapper/data/PublishMapper.xml                            |    4 +
 7 files changed, 166 insertions(+), 58 deletions(-)

diff --git a/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java b/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java
index 1d213f0..2939ae2 100644
--- a/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java
+++ b/src/main/java/com/moon/server/controller/data/RasterAnalysisController.java
@@ -30,7 +30,7 @@
     @Resource
     RasterAnalysisService rasterService;
 
-    private final static List<Integer> pixels = new ArrayList<>(Arrays.asList(1, 2, 4, 8, 16, 32, 64, 128, 256));
+    private final static List<Integer> PIXELS = new ArrayList<>(Arrays.asList(1, 2, 4, 8, 16, 32, 64, 128, 256));
 
     @SysLog()
     @ApiOperation(value = "鏌ヨ鐐瑰垎鏋�")
@@ -49,11 +49,11 @@
             if (null == geo || geo.GetGeometryType() != ogr.wkbPoint) {
                 return fail("WKT瀛楃涓蹭笉姝g‘");
             }
-            if (null == pixel || !pixels.contains(pixel)) {
-                return fail("鍍忕偣鍊煎彧鑳戒负锛�" + StringHelper.join(pixels, ", "));
+            if (null == pixel || !PIXELS.contains(pixel)) {
+                return fail("鍍忕偣鍊煎彧鑳戒负锛�" + StringHelper.join(PIXELS, ", "));
             }
 
-            List<?> rs = rasterService.analysisPoint(wkt, pixel);
+            List<?> rs = rasterService.analysisPoint(geo, pixel);
 
             return success(rs.size(), rs);
         } catch (Exception ex) {
@@ -77,7 +77,7 @@
                 return fail("WKT瀛楃涓蹭笉姝g‘");
             }
 
-            List<?> rs = rasterService.analysisPolyline(wkt);
+            List<?> rs = rasterService.analysisPolyline(geo);
 
             return success(rs.size(), rs);
         } catch (Exception ex) {
@@ -101,7 +101,7 @@
                 return fail("WKT瀛楃涓蹭笉姝g‘");
             }
 
-            List<?> rs = rasterService.analysisPolygon(wkt);
+            List<?> rs = rasterService.analysisPolygon(geo);
 
             return success(rs.size(), rs);
         } catch (Exception ex) {
diff --git a/src/main/java/com/moon/server/entity/all/StaticData.java b/src/main/java/com/moon/server/entity/all/StaticData.java
index 20857a6..8b6e619 100644
--- a/src/main/java/com/moon/server/entity/all/StaticData.java
+++ b/src/main/java/com/moon/server/entity/all/StaticData.java
@@ -72,6 +72,10 @@
 
     public static final int I180_NEG = -180;
 
+    public static final int I200 = 200;
+
+    public static final int I500 = 500;
+
     public static final int I1000 = 1000;
 
     public static final int I2050 = 2050;
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 b5da1e1..0dd9399 100644
--- a/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java
+++ b/src/main/java/com/moon/server/entity/data/AnalysisResultEntity.java
@@ -21,6 +21,10 @@
 
     private Double max;
 
+    private int code;
+
+    private String info;
+
     public String getLayerName() {
         return layerName;
     }
@@ -52,4 +56,20 @@
     public void setMax(Double max) {
         this.max = max;
     }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+
+    public void setInfo(String info) {
+        this.info = info;
+    }
 }
diff --git a/src/main/java/com/moon/server/mapper/data/PublishMapper.java b/src/main/java/com/moon/server/mapper/data/PublishMapper.java
index a1b8a43..0febf31 100644
--- a/src/main/java/com/moon/server/mapper/data/PublishMapper.java
+++ b/src/main/java/com/moon/server/mapper/data/PublishMapper.java
@@ -69,6 +69,13 @@
     public List<MetaEntity> selectMetasByPubid(Integer pubid);
 
     /**
+     * 鏌ヨ鏍呮牸鏁版嵁鍙戝竷
+     *
+     * @return 鍙戝竷瀹炰綋绫�
+     */
+    public List<PublishEntity> selectRaster();
+
+    /**
      * 鏍规嵁鐩綍鏌ヨDOM鍜孌EM鐨勭紪鐮�
      *
      * @param dircode 鐩綍
diff --git a/src/main/java/com/moon/server/service/data/PublishService.java b/src/main/java/com/moon/server/service/data/PublishService.java
index 91a86bc..10c11ed 100644
--- a/src/main/java/com/moon/server/service/data/PublishService.java
+++ b/src/main/java/com/moon/server/service/data/PublishService.java
@@ -73,6 +73,11 @@
     }
 
     @Override
+    public List<PublishEntity> selectRaster() {
+        return publishMapper.selectRaster();
+    }
+
+    @Override
     public List<String> selectCodesForDir(String dircode, Integer isDom) {
         return publishMapper.selectCodesForDir(dircode, isDom);
     }
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 fcd5f35..9088003 100644
--- a/src/main/java/com/moon/server/service/data/RasterAnalysisService.java
+++ b/src/main/java/com/moon/server/service/data/RasterAnalysisService.java
@@ -1,6 +1,12 @@
 package com.moon.server.service.data;
 
+import com.moon.server.entity.all.StaticData;
 import com.moon.server.entity.data.AnalysisResultEntity;
+import com.moon.server.entity.data.MetaEntity;
+import com.moon.server.entity.data.PublishEntity;
+import com.moon.server.helper.PathHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.gdal.gdal.Band;
 import org.gdal.gdal.Dataset;
 import org.gdal.gdal.WarpOptions;
@@ -9,6 +15,8 @@
 import org.gdal.ogr.ogr;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Vector;
@@ -20,67 +28,127 @@
  */
 @Service
 public class RasterAnalysisService {
-    public List<AnalysisResultEntity> analysisPoint(String wkt, Integer pixel) {
+    @Resource
+    PathHelper pathHelper;
+
+    @Resource
+    PublishService publishService;
+
+    private final static Log log = LogFactory.getLog(RasterAnalysisService.class);
+
+    /**
+     * 鍒嗘瀽鐐�
+     */
+    public List<AnalysisResultEntity> analysisPoint(Geometry point, int size) {
         List<AnalysisResultEntity> rs = new ArrayList<>();
-        //
 
-        return rs;
-    }
-
-    public List<AnalysisResultEntity> analysisPolyline(String wkt) {
-        List<AnalysisResultEntity> rs = new ArrayList<>();
-        //
-
-        return rs;
-    }
-    public List<AnalysisResultEntity> analysisPolygon(String wkt) {
-        List<AnalysisResultEntity> rs = new ArrayList<>();
-        //
-
-        return rs;
-    }
-
-
-    public double processPoint(String imagePath, String geometryString, int size) {
-        // 鎵撳紑鏍呮牸鍥惧儚鏁版嵁闆�
-        Dataset dataset = gdal.Open(imagePath);
-        if (dataset == null) {
-            throw new RuntimeException("Failed to open raster dataset.");
+        List<PublishEntity> pubs = publishService.selectRaster();
+        if (null == pubs || pubs.isEmpty()) {
+            return rs;
         }
 
-        Geometry geometry = Geometry.CreateFromWkt(geometryString);
+        for (PublishEntity pub : pubs) {
+            AnalysisResultEntity entity = new AnalysisResultEntity();
+            entity.setLayerName(pub.getName());
 
-        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];
-
-        double x = geometry.GetX();
-        double y = geometry.GetY();
-
-        int xPixel = (int) Math.floor((x - minX) / pixelWidth);
-        int yPixel = (int) Math.floor((maxY - y) / Math.abs(pixelHeight));
-
-        int bandCount = dataset.getRasterCount();
-
-        List<double[]> sum = new ArrayList<>();
-        for (int bandIndex = 1; bandIndex <= bandCount; bandIndex++) {
-            double[] pixelValues = new double[size * size];
-            Band band = dataset.GetRasterBand(bandIndex);
-            band.ReadRaster(xPixel, yPixel, size, size, pixelValues);
-
-            sum.add(pixelValues);
+            processPoint(entity, pub, point, size);
+            rs.add(entity);
         }
 
-        // 閲婃斁璧勬簮
-        gdal.GDALDestroyDriverManager();
-
-        return average(calculateAverage(sum));
+        return rs;
     }
 
+    /**
+     * 璁剧疆閿欒
+     */
+    private void setError(AnalysisResultEntity entity, String info) {
+        entity.setCode(StaticData.I500);
+        entity.setInfo(info);
+    }
+
+    /**
+     * 澶勭悊鐐�
+     */
+    private void processPoint(AnalysisResultEntity entity, PublishEntity pub, Geometry point, int size) {
+        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;
+        }
+
+        processPoint(entity, filePath, point, size);
+    }
+
+    /**
+     * 澶勭悊鐐�
+     */
+    public void processPoint(AnalysisResultEntity entity, String filePath, Geometry point, int size) {
+        Dataset ds = null;
+        try {
+            ds = gdal.Open(filePath);
+            if (null == ds) {
+                throw new Exception("鎵撳紑鏍呮牸鏁版嵁澶辫触");
+            }
+
+            double x = point.GetX(), y = point.GetY();
+            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];
+
+            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++) {
+                double[] pixelValues = new double[size * size];
+                Band band = ds.GetRasterBand(bandIndex);
+                band.ReadRaster(xPixel, yPixel, size, size, pixelValues);
+
+                sum.add(pixelValues);
+            }
+
+            //return average(calculateAverage(sum));
+        } catch (Exception ex) {
+            setError(entity, ex.getMessage());
+            log.error(ex.getMessage(), ex);
+        } finally {
+            //  gdal.GDALDestroyDriverManager()
+            if (null != ds) {
+                ds.delete();
+            }
+        }
+    }
+
+    /**
+     * 鍒嗘瀽绾�
+     */
+    public List<AnalysisResultEntity> analysisPolyline(Geometry polyline) {
+        List<AnalysisResultEntity> rs = new ArrayList<>();
+        //
+
+        return rs;
+    }
+
+    /**
+     * 鍒嗘瀽闈�
+     */
+    public List<AnalysisResultEntity> analysisPolygon(Geometry polygon) {
+        List<AnalysisResultEntity> rs = new ArrayList<>();
+        //
+
+        return rs;
+    }
+
+
     public List<Double> processLine(String imagePath, String geometryString) {
         // 鎵撳紑鏍呮牸鍥惧儚鏁版嵁闆�
         Dataset dataset = gdal.Open(imagePath);
diff --git a/src/main/resources/mapper/data/PublishMapper.xml b/src/main/resources/mapper/data/PublishMapper.xml
index c7371af..507ace3 100644
--- a/src/main/resources/mapper/data/PublishMapper.xml
+++ b/src/main/resources/mapper/data/PublishMapper.xml
@@ -102,6 +102,10 @@
         where b.pubid = #{pubid};
     </select>
 
+    <select id="selectRaster" resultType="com.moon.server.entity.data.PublishEntity">
+        select * from lf.sys_publish where status = 3 and type in ('DOM', 'DEM');
+    </select>
+
     <select id="selectCodesForDir" resultType="java.lang.String">
         select code
         from lf.sys_dir

--
Gitblit v1.9.3