From c63f5c032bee42eb339cbbd95c8cee4f7132cf7e Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期四, 07 十一月 2024 09:58:17 +0800
Subject: [PATCH] 添加数据校验功能

---
 src/main/java/com/se/simu/helper/ShpHelper.java    |    6 +++---
 src/main/java/com/se/simu/service/GedbService.java |   25 +++++++++++++++++++++++--
 src/main/java/com/se/simu/helper/GdalHelper.java   |   17 +++++++++++++++++
 pom.xml                                            |    6 ++++++
 4 files changed, 49 insertions(+), 5 deletions(-)

diff --git a/pom.xml b/pom.xml
index 0ed76d3..0b437c4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -141,6 +141,12 @@
             <artifactId>caffeine</artifactId>
             <version>2.9.3</version>
         </dependency>
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+            <version>1.0.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/se/simu/helper/GdalHelper.java b/src/main/java/com/se/simu/helper/GdalHelper.java
index 857bbf1..536b226 100644
--- a/src/main/java/com/se/simu/helper/GdalHelper.java
+++ b/src/main/java/com/se/simu/helper/GdalHelper.java
@@ -248,4 +248,21 @@
 
         return g.TransformTo(sr);
     }
+
+    public static Geometry createPolygon(SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) {
+        Geometry ring = new Geometry(ogr.wkbLinearRing);
+        ring.AddPoint_2D(minx, maxy);
+        ring.AddPoint_2D(maxx, maxy);
+        ring.AddPoint_2D(maxx, miny);
+        ring.AddPoint_2D(minx, miny);
+        ring.AddPoint_2D(minx, maxy);
+
+        Geometry poly = new Geometry(ogr.wkbPolygon);
+        poly.AddGeometry(ring);
+        if (null != sr) {
+            poly.AssignSpatialReference(sr);
+        }
+
+        return poly;
+    }
 }
diff --git a/src/main/java/com/se/simu/helper/ShpHelper.java b/src/main/java/com/se/simu/helper/ShpHelper.java
index c3031a2..391d1d0 100644
--- a/src/main/java/com/se/simu/helper/ShpHelper.java
+++ b/src/main/java/com/se/simu/helper/ShpHelper.java
@@ -6,7 +6,6 @@
 import com.se.simu.domain.dto.GeField;
 import com.se.simu.domain.dto.GeLayer;
 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;
@@ -122,7 +121,7 @@
         }
     }
 
-    private static Geometry createPolygon(SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) {
+    public static Geometry createPolygon(SpatialReference sr, Double minx, Double miny, Double maxx, Double maxy) {
         String epsg = sr.GetAuthorityCode(null);
         if (!("4326".equals(epsg) || "4490".equals(epsg))) {
             double[] dmin = GdalHelper.fromWgs84(sr, minx, miny);
@@ -142,6 +141,7 @@
 
         Geometry poly = new Geometry(ogr.wkbPolygon);
         poly.AddGeometry(ring);
+        poly.AssignSpatialReference(sr);
 
         return poly;
     }
@@ -220,7 +220,7 @@
     /**
      * 鍒涘缓Geometry瀵硅薄
      */
-    private static Geometry createGeometry(GeLayer geLayer, JSONObject geom) {
+    public static Geometry createGeometry(GeLayer geLayer, JSONObject geom) {
         String type = geom.getStr("type");
         JSONArray cs = geom.getJSONArray("coordinates");
 
diff --git a/src/main/java/com/se/simu/service/GedbService.java b/src/main/java/com/se/simu/service/GedbService.java
index c13f549..35e5d3c 100644
--- a/src/main/java/com/se/simu/service/GedbService.java
+++ b/src/main/java/com/se/simu/service/GedbService.java
@@ -19,6 +19,7 @@
 import org.gdal.gdal.WarpOptions;
 import org.gdal.gdal.gdal;
 import org.gdal.gdalconst.gdalconst;
+import org.gdal.ogr.Geometry;
 import org.gdal.osr.SpatialReference;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -244,7 +245,7 @@
 
         List<GeLayer> layers = getLayers(token, db);
         queryData(token, db, layers);
-        checkData(layers);
+        checkData(data, db, layers);
         createShps(basePath, layers);
         createZoneShp(basePath, data, db.getSpatialReference());
         if (data.getPid() > 0) {
@@ -252,9 +253,14 @@
         }
     }
 
-    private void checkData(List<GeLayer> layers) {
+    private void checkData(DataPo data, GeDb db, List<GeLayer> layers) {
         GeLayer point = getLayerByName(layers, config.getLayerNames().get(0));
         GeLayer line = getLayerByName(layers, config.getLayerNames().get(1));
+        GeLayer build = getLayerByName(layers, config.getLayerNames().get(2));
+
+        Geometry extent = ShpHelper.createPolygon(db.getSpatialReference(), data.getMinx(), data.getMiny(), data.getMaxx(), data.getMaxy());
+        checkSpatialRange(extent, point);
+        checkSpatialRange(extent, build);
 
         List<String> bsm = getValues(point, "bsm");
         List<String> bsm2 = new ArrayList<>(bsm);
@@ -280,6 +286,21 @@
         layers.add(juncLayer);
     }
 
+    private void checkSpatialRange(Geometry extent, GeLayer geLayer) {
+        int i = 0;
+        while (i < geLayer.getData().size()) {
+            JSONObject geom = geLayer.getData().getJSONObject(i).getJSONObject("geometry");
+            Geometry g = ShpHelper.createGeometry(geLayer, geom);
+            g.AssignSpatialReference(extent.GetSpatialReference());
+
+            if (!extent.Intersects(g)) {
+                geLayer.getData().remove(i);
+                continue;
+            }
+            i++;
+        }
+    }
+
     private GeLayer getLayerByName(List<GeLayer> layers, String name) {
         return layers.stream().filter(a -> a.getName().equals(name)).findFirst().orElse(null);
     }

--
Gitblit v1.9.3