Ver código fonte

自定义统计规则模型相关接口提交

wanger 7 meses atrás
pai
commit
361195a254
28 arquivos alterados com 500 adições e 26 exclusões
  1. BIN
      onemap-modules/onemap-spotoverlap/lib/ejml-core-0.39.jar
  2. BIN
      onemap-modules/onemap-spotoverlap/lib/ejml-ddense-0.32.jar
  3. BIN
      onemap-modules/onemap-spotoverlap/lib/gdal.jar
  4. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-api-19.2.jar
  5. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-data-19.2.jar
  6. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-epsg-hsql-2.6.0.jar
  7. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-geojson-19.2.jar
  8. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-main-19.2.jar
  9. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-metadata-19.2.jar
  10. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-opengis-19.2.jar
  11. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-referencing-19.2.jar
  12. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-render-19.2.jar
  13. BIN
      onemap-modules/onemap-spotoverlap/lib/gt-shapefile-19.2.jar
  14. BIN
      onemap-modules/onemap-spotoverlap/lib/json-simple-1.1.1.jar
  15. BIN
      onemap-modules/onemap-spotoverlap/lib/json-simple-1.1.jar
  16. BIN
      onemap-modules/onemap-spotoverlap/lib/jsr-275-1.0-beta-2.jar
  17. BIN
      onemap-modules/onemap-spotoverlap/lib/jts-1.13.jar
  18. BIN
      onemap-modules/onemap-spotoverlap/lib/spire.doc.free-5.2.0.jar
  19. 7 0
      onemap-modules/onemap-spotoverlap/pom.xml
  20. 2 0
      onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/OneMapSpotOverlapApplication.java
  21. 49 4
      onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/controller/yzt/YztController.java
  22. 9 0
      onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/domain/yzt/ModelDetails.java
  23. 15 0
      onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/domain/yzt/tReport.java
  24. 2 0
      onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/mapper/yzt/YztMapper.java
  25. 103 14
      onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/service/impl/yzt/YztServiceImpl.java
  26. 8 2
      onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/service/yzt/IYztService.java
  27. 295 0
      onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/utils/GdbToPostgisImporter.java
  28. 10 6
      onemap-modules/onemap-spotoverlap/src/main/resources/mapper/postgresql/yzt/YztMapper.xml

BIN
onemap-modules/onemap-spotoverlap/lib/ejml-core-0.39.jar


BIN
onemap-modules/onemap-spotoverlap/lib/ejml-ddense-0.32.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gdal.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-api-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-data-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-epsg-hsql-2.6.0.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-geojson-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-main-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-metadata-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-opengis-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-referencing-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-render-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/gt-shapefile-19.2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/json-simple-1.1.1.jar


BIN
onemap-modules/onemap-spotoverlap/lib/json-simple-1.1.jar


BIN
onemap-modules/onemap-spotoverlap/lib/jsr-275-1.0-beta-2.jar


BIN
onemap-modules/onemap-spotoverlap/lib/jts-1.13.jar


BIN
onemap-modules/onemap-spotoverlap/lib/spire.doc.free-5.2.0.jar


+ 7 - 0
onemap-modules/onemap-spotoverlap/pom.xml

@@ -233,6 +233,13 @@
             <artifactId>sqlite-jdbc</artifactId>
             <version>3.47.1.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.gdal.jni</groupId>
+            <version>3.1.0</version>
+            <artifactId>gdal-jni</artifactId>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/gdal.jar</systemPath>
+        </dependency>
     </dependencies>
 
     <repositories>

+ 2 - 0
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/OneMapSpotOverlapApplication.java

@@ -1,5 +1,6 @@
 package com.onemap.spotoverlap;
 
+import org.gdal.gdal.gdal;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import com.onemap.common.security.annotation.EnableCustomConfig;
@@ -19,6 +20,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @SpringBootApplication
 public class OneMapSpotOverlapApplication {
     public static void main(String[] args) {
+        gdal.AllRegister();
         SpringApplication.run(OneMapSpotOverlapApplication.class, args);
         System.out.println("(♥◠‿◠)ノ゙  套合分析模块启动成功   ლ(´ڡ`ლ)゙ ");
     }

+ 49 - 4
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/controller/yzt/YztController.java

@@ -31,9 +31,39 @@ public class YztController extends BaseController {
      * @return
      */
     @PostMapping("/upload")
-    public RequestResult upload(MultipartFile file) {
+    public RequestResult upload(MultipartFile file, String type) {
         try {
-            return yztService.upload(file);
+            return yztService.upload(file, type);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return RequestResult.error("失败", null);
+        }
+    }
+
+    /**
+     * 获取Gdb里面的图层名称列表
+     *
+     * @return
+     */
+    @PostMapping("/getGdbLayers")
+    public RequestResult getGdbLayers(String filepath) {
+        try {
+            return yztService.getGdbLayers(filepath);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return RequestResult.error("失败", null);
+        }
+    }
+
+    /**
+     * 获取Gdb里面的图层字段列表
+     *
+     * @return
+     */
+    @PostMapping("/getGdbLayerFields")
+    public RequestResult getGdbLayerFields(String filepath, String layername) {
+        try {
+            return yztService.getGdbLayerFields(filepath, layername);
         } catch (Exception e) {
             e.printStackTrace();
             return RequestResult.error("失败", null);
@@ -48,9 +78,9 @@ public class YztController extends BaseController {
      * @return
      */
     @PostMapping("/import")
-    public RequestResult importIn(MultipartFile file, String path, String type, String name, String ufield, String style, String cfield, String servertype) {
+    public RequestResult importIn(MultipartFile file, String path, String type, String name, String ufield, String style, String cfield, String servertype, String layername) {
         try {
-            return yztService.importIn(file, path, type, name, ufield, style, cfield, servertype);
+            return yztService.importIn(file, path, type, name, ufield, style, cfield, servertype, layername);
         } catch (Exception e) {
             e.printStackTrace();
             return RequestResult.error("失败", null);
@@ -223,6 +253,21 @@ public class YztController extends BaseController {
         }
     }
 
+    /**
+     * 设置情形是否可用
+     *
+     * @return
+     */
+    @RequestMapping("/modeldetailisvalid")
+    public RequestResult modeldetailisvalid(String situationid, String isvalid) {
+        try {
+            return yztService.modeldetailisvalid(situationid, isvalid);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return RequestResult.error("失败", null);
+        }
+    }
+
     /**
      * 查询所有管控数据
      *

+ 9 - 0
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/domain/yzt/ModelDetails.java

@@ -6,9 +6,18 @@ import java.util.List;
 public class ModelDetails {
     private String name ;
     private String situationid ;
+    private String isvalid ;
     private String situationrelationship;
     private List<tModelDetail> details = new ArrayList<>();
 
+    public String getIsvalid() {
+        return isvalid;
+    }
+
+    public void setIsvalid(String isvalid) {
+        this.isvalid = isvalid;
+    }
+
     public String getName() {
         return name;
     }

+ 15 - 0
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/domain/yzt/tReport.java

@@ -1,6 +1,10 @@
 package com.onemap.spotoverlap.domain.yzt;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
 
 @TableName("t_report")
 public class tReport {
@@ -9,6 +13,17 @@ public class tReport {
     private String groupsub;
     private String calctotal;
     private String rowsub;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date cjsj;
+
+    public Date getCjsj() {
+        return cjsj;
+    }
+
+    public void setCjsj(Date cjsj) {
+        this.cjsj = cjsj;
+    }
 
     public String getId() {
         return id;

+ 2 - 0
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/mapper/yzt/YztMapper.java

@@ -114,4 +114,6 @@ public interface YztMapper {
     List<Map> getTableReport(@Param("tablename") String tablename, @Param("sqlwhere") String sqlwhere, @Param("groupwhere") String groupwhere);
 
     List<String> getLayerNameByModelId(String modelid);
+
+    void modeldetailisvalid(@Param("situationid") String situationid, @Param("isvalid") String isvalid);
 }

+ 103 - 14
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/service/impl/yzt/YztServiceImpl.java

@@ -12,6 +12,7 @@ import com.onemap.common.security.utils.SecurityUtils;
 import com.onemap.spotoverlap.utils.*;
 import org.apache.ibatis.annotations.Param;
 import org.bouncycastle.cert.ocsp.Req;
+import org.gdal.ogr.*;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -120,7 +121,10 @@ public class YztServiceImpl implements IYztService {
     private Integer wmtszoomend;
 
     @Override
-    public RequestResult upload(MultipartFile file) {
+    public RequestResult upload(MultipartFile file, String type) {
+        if (StringUtils.isEmpty(type)) {
+            type = "shp";
+        }
         if (file == null) {
             return RequestResult.error("未上传文件!");
         }
@@ -151,9 +155,10 @@ public class YztServiceImpl implements IYztService {
             } else {
                 new UnPackageUtils().unPackRar(dest, unzippath);
             }
+            dest.delete();
             File[] files = new File(unzippath).listFiles();
             for (File file1 : files) {
-                if (file1.getAbsolutePath().substring(file1.getAbsolutePath().lastIndexOf(".") + 1).equals("shp")) {
+                if (file1.getAbsolutePath().substring(file1.getAbsolutePath().lastIndexOf(".") + 1).equals(type)) {
                     shpPath = file1.getAbsolutePath();
                     shpPath = shpPath.replaceAll("\\\\", "/");
                     break;
@@ -162,7 +167,7 @@ public class YztServiceImpl implements IYztService {
             if (!"".equals(shpPath)) {
 
             } else {
-                return RequestResult.error("未检索到shp文件");
+                return RequestResult.error("未检索到矢量数据文件");
             }
         } catch (IOException e) {
             e.printStackTrace();
@@ -172,7 +177,7 @@ public class YztServiceImpl implements IYztService {
     }
 
     @Override
-    public RequestResult importIn(MultipartFile file, String path, String type, String name, String ufield, String style, String cfield, String servertype) {
+    public RequestResult importIn(MultipartFile file, String path, String type, String name, String ufield, String style, String cfield, String servertype, String gdblayername) {
         if (StringUtils.isEmpty(style)) {
             style = spotstyle;
         }
@@ -231,7 +236,7 @@ public class YztServiceImpl implements IYztService {
         String tablename = "";
         String folderpath = "";
         if (StringUtils.isEmpty(shpPath)) {
-            return RequestResult.error("未检索到shp文件!");
+            return RequestResult.error("未检索到矢量数据文件!");
         } else {
             File currentfile = new File(shpPath);
             String fileName = currentfile.getName();
@@ -240,8 +245,12 @@ public class YztServiceImpl implements IYztService {
             String filename = fileName.replace(filetype, "").replace(".", "");
             tablename = prefix + filename + "_" + currentTime;
             try {
-                //TODO wanger 第一步:指定坐标系将本地shp文件导入到postgis
-                ShpToPostGISWithReproject.importShpToPostGISWithReproject(shpPath, tablename, "EPSG:" + shpWkid, false);
+                if ("shp".equals(filetype)) {
+                    //TODO wanger 第一步:指定坐标系将本地shp文件导入到postgis
+                    ShpToPostGISWithReproject.importShpToPostGISWithReproject(shpPath, tablename, "EPSG:" + shpWkid, false);
+                } else if ("gdb".equals(filetype)) {
+                    shpPath = GdbToPostgisImporter.importToPostgis(shpPath, gdblayername, tablename);
+                }
                 //TODO wanger 第二步:指定的空间数据库表的geom字段
                 Integer count = yztMapper.getTheGeomCount(dbschema, tablename);
                 if (count > 0) {
@@ -522,18 +531,46 @@ public class YztServiceImpl implements IYztService {
     @Override
     public RequestResult modeldetailupdate(tModelDetail modeldetail) {
         try {
+            //TODO 删除之前的情形数据
+//            QueryWrapper<tModelDetail> detailwrapper = new QueryWrapper();
+//            detailwrapper.eq("situationid", modeldetail.getSituationid());
+//            tModelDetailMapper.delete(detailwrapper);
+            String relationship = modeldetail.getRelationship();
+            String relationshipkey = modeldetail.getRelationshipkey();
+            String relationshipvalue = modeldetail.getRelationshipvalue();
             QueryWrapper<tAnalyseType> typewrapper = new QueryWrapper();
-            typewrapper.eq("name", modeldetail.getRelationship());
+            typewrapper.eq("name", relationship);
             tAnalyseType typeDto = tAnalyseTypeMapper.selectOne(typewrapper);
             if (typeDto != null) {
                 //TODO wanger 根据类型生成查询语句
-                //TODO wanger  待完善那个 between and 介于之间的情况
                 String querywhere = typeDto.getQuerywhere();
-                modeldetail.setRelationshipwhere(String.format("%s %s %s ", querywhere,
-                        modeldetail.getRelationshipkey(),
-                        modeldetail.getRelationshipvalue()));
+                if ("tbbhlx".equals(relationship)) {//TODO wanger 处理图斑变化类型过滤
+                    String where = " " +querywhere + " ";
+                    if ("=".equals(relationshipkey)) {
+                        where += " in (";
+                    } else if ("!=".equals(relationshipkey)) {
+                        where += " not in (";
+                    }
+                    String[] values = relationshipvalue.split(",");
+                    for (String cur : values) {
+                        where += "'" + cur + "',";
+                    }
+                    where = where.substring(0, where.length() - 1) + ") ";
+                    modeldetail.setRelationshipwhere(where);
+                } else {
+                    //TODO wanger  待完善那个 between and 介于之间的情况
+                    if ("∈".equals(relationshipkey)) {
+                        String[] sss = relationshipvalue.split("-");
+                        modeldetail.setRelationshipwhere(String.format("%s between %s and %s ", querywhere,
+                                sss[0],
+                                sss[1]));
+                    } else {
+                        modeldetail.setRelationshipwhere(String.format("%s %s %s ", querywhere,
+                                relationshipkey,
+                                relationshipvalue));
+                    }
+                }
             }
-
             if (StringUtils.isNotEmpty(modeldetail.getId())) {
                 QueryWrapper<tModelDetail> wrapper = new QueryWrapper();
                 wrapper.eq("id", modeldetail.getId());
@@ -554,7 +591,7 @@ public class YztServiceImpl implements IYztService {
     public RequestResult modeldetaildelete(String id) {
         try {
             QueryWrapper<tModelDetail> detailwrapper = new QueryWrapper();
-            detailwrapper.eq("id", id);
+            detailwrapper.eq("situationid", id);
             tModelDetailMapper.delete(detailwrapper);
             return RequestResult.success("删除成功!", 1);
         } catch (Exception e) {
@@ -563,6 +600,17 @@ public class YztServiceImpl implements IYztService {
         return RequestResult.error("删除失败!", null);
     }
 
+    @Override
+    public RequestResult modeldetailisvalid(String situationid, String isvalid) {
+        try {
+            yztMapper.modeldetailisvalid(situationid, isvalid);
+            return RequestResult.success("修改成功!", 1);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return RequestResult.error("修改失败!", null);
+    }
+
     @Override
     public RequestResult basevectordelete(String tablename) {
         try {
@@ -1138,6 +1186,7 @@ public class YztServiceImpl implements IYztService {
     @Override
     public RequestResult updateReport(tReport report) {
         try {
+            report.setCjsj(new Date());
             if (StringUtils.isNotEmpty(report.getId())) {
                 QueryWrapper<tReport> wrapper = new QueryWrapper();
                 wrapper.eq("id", report.getId());
@@ -1160,6 +1209,7 @@ public class YztServiceImpl implements IYztService {
             if (StringUtils.isNotEmpty(name)) {
                 wrapper.like("name", name);
             }
+            wrapper.orderByDesc("cjsj");
             return RequestResult.success("查询成功!", tReportMapper.selectList(wrapper));
         } catch (Exception e) {
             e.printStackTrace();
@@ -1258,6 +1308,45 @@ public class YztServiceImpl implements IYztService {
         return RequestResult.error("查询失败!", null);
     }
 
+    @Override
+    public RequestResult getGdbLayers(String filepath) {
+        // 打开GDB数据源
+        DataSource gdbDataSource = ogr.Open(filepath);
+        if (gdbDataSource == null) {
+            System.err.println("无法打开GDB文件: " + filepath);
+            return RequestResult.error("无法打开GDB文件: " + filepath);
+        }
+        List<String> res = new ArrayList<>();
+        for (int i = 0; i < gdbDataSource.GetLayerCount(); i++) {
+            Layer layer = gdbDataSource.GetLayerByIndex(i);
+            String layerName = layer.GetName();
+            res.add(layerName);
+        }
+        return RequestResult.success("查询成功!", res);
+    }
+
+    @Override
+    public RequestResult getGdbLayerFields(String filepath, String layername) {
+        // 打开GDB数据源
+        DataSource gdbDataSource = ogr.Open(filepath);
+        if (gdbDataSource == null) {
+            System.err.println("无法打开GDB文件: " + filepath);
+            return RequestResult.error("无法打开GDB文件: " + filepath);
+        }
+        List<String> res = new ArrayList<>();
+        Layer layer = gdbDataSource.GetLayer(layername);
+        FeatureDefn defn = layer.GetLayerDefn();
+        // 添加属性字段
+        for (int i = 0; i < defn.GetFieldCount(); i++) {
+            FieldDefn fieldDefn = defn.GetFieldDefn(i);
+            String fieldName = fieldDefn.GetName();
+            if (!fieldName.toLowerCase().contains("shape")) {
+                res.add(fieldName);
+            }
+        }
+        return RequestResult.success("查询成功!", res);
+    }
+
     @Override
     public RequestResult basemap(MultipartFile file, String name, String invalid, String serviceuri, String id, String image, String indexnum) {
         String imageuri = "";

+ 8 - 2
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/service/yzt/IYztService.java

@@ -14,7 +14,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.util.Map;
 
 public interface IYztService {
-    RequestResult importIn(MultipartFile file, String path, String type, String name, String ufield, String style, String cfield, String servertype);
+    RequestResult importIn(MultipartFile file, String path, String type, String name, String ufield, String style, String cfield, String servertype, String layername);
 
     RequestResult modellist();
 
@@ -62,7 +62,7 @@ public interface IYztService {
 
     RequestResult getAnalyseResult(String tablename);
 
-    RequestResult upload(MultipartFile file);
+    RequestResult upload(MultipartFile file, String type);
 
     RequestResult basemap(MultipartFile file, String name, String invalid, String serviceuri, String id, String image, String indexnum);
 
@@ -111,4 +111,10 @@ public interface IYztService {
     RequestResult makeReport(String tablename, String reportid);
 
     RequestResult getLayerNameByModelId(String modelid);
+
+    RequestResult getGdbLayers(String filepath);
+
+    RequestResult getGdbLayerFields(String filepath, String layername);
+
+    RequestResult modeldetailisvalid(String situationid, String isvalid);
 }

+ 295 - 0
onemap-modules/onemap-spotoverlap/src/main/java/com/onemap/spotoverlap/utils/GdbToPostgisImporter.java

@@ -0,0 +1,295 @@
+package com.onemap.spotoverlap.utils;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.onemap.common.core.utils.StringUtils;
+import org.gdal.ogr.*;
+import org.gdal.gdal.gdal;
+import org.gdal.ogr.Driver;
+import org.gdal.osr.SpatialReference;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.lang.reflect.Type;
+import java.sql.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+@Component
+public class GdbToPostgisImporter {
+    private static final Gson gson = new Gson();
+    private static final Type mapType =
+            new TypeToken<Map<String, Object>>() {
+            }.getType();
+    public static String dbconnection;
+
+    @Value("${dbconnection}")
+    public void setDbconnection(String dbconnection) {
+        GdbToPostgisImporter.dbconnection = dbconnection;
+    }
+
+    // 配置参数
+    private static String GDB_PATH = "E:\\projects\\甘肃一张图\\测试数据\\WP15012520240705\\WP15012520240705.gdb";
+    private static String GDB_LAYER = "T15012520240705tb";
+    private static String PG_HOST = "localhost";
+    private static String PG_PORT = "5432";
+    private static String PG_DB = "spot";
+    private static String PG_USER = "postgres";
+    private static String PG_PASSWORD = "postgres";
+    private static String PG_SCHEMA = "public";
+
+    public static void main(String[] args) {
+        // 初始化GDAL
+        gdal.AllRegister();
+        // 打开GDB数据源
+        DataSource gdbDataSource = ogr.Open(GDB_PATH);
+        if (gdbDataSource == null) {
+            System.err.println("无法打开GDB文件: " + GDB_PATH);
+            return;
+        }
+        // 获取PostgreSQL连接
+        try (Connection conn = getPostgresConnection()) {
+            // 遍历GDB中的所有图层
+            for (int i = 0; i < gdbDataSource.GetLayerCount(); i++) {
+                Layer layer = gdbDataSource.GetLayerByIndex(i);
+                String layerName = layer.GetName();
+                System.out.println("正在处理图层: " + layerName);
+                // 在PostGIS中创建表
+                String srid = createPostgisTable(conn, layer, layerName);
+                // 导入数据
+                importDataToPostgis(conn, layer, layerName, srid);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 清理GDAL资源
+            gdbDataSource.delete();
+        }
+    }
+
+    public static void exportLayerToShapefile(Layer srcLayer, String shpPath) {
+        // 获取驱动
+        Driver shpDriver = ogr.GetDriverByName("ESRI Shapefile");
+        // 创建输出数据源
+        DataSource shpDataSource = shpDriver.CreateDataSource(shpPath);
+        if (shpDataSource == null) {
+            throw new RuntimeException("无法创建Shapefile: " + shpPath);
+        }
+        try {
+            Vector<String> options = new Vector<>();
+            options.add("ENCODING=UTF-8");
+            // 创建输出图层(使用相同的空间参考)
+            Layer dstLayer = shpDataSource.CreateLayer(
+                    srcLayer.GetName(),
+                    srcLayer.GetSpatialRef(),
+                    srcLayer.GetGeomType(),
+                    options
+            );
+            // 复制字段定义
+            FeatureDefn srcDefn = srcLayer.GetLayerDefn();
+            for (int i = 0; i < srcDefn.GetFieldCount(); i++) {
+                dstLayer.CreateField(srcDefn.GetFieldDefn(i));
+            }
+            // 复制所有要素
+            srcLayer.ResetReading();
+            Feature feature;
+            while ((feature = srcLayer.GetNextFeature()) != null) {
+                dstLayer.CreateFeature(feature);
+                feature.delete();
+            }
+        } finally {
+            // 确保资源释放
+            shpDataSource.delete();
+        }
+    }
+
+    public static String importToPostgis(String filepath, String layername, String tablename) {
+        initDbConfig();
+        File file = new File(filepath);
+        String shppath = "";
+        DataSource gdbDataSource = ogr.Open(filepath);
+        if (gdbDataSource == null) {
+            System.err.println("无法打开GDB文件: " + filepath);
+            return null;
+        }
+        try (Connection conn = getPostgresConnection()) {
+            Layer layer = gdbDataSource.GetLayer(layername);
+            System.out.println("正在处理图层: " + layername);
+            //TODO 先导出一份shape
+            shppath = file.getParent() + "\\" + tablename + ".shp";
+            exportLayerToShapefile(layer, shppath);
+            layer.ResetReading();
+            //TODO 在PostGIS中创建表
+            String srid = createPostgisTable(conn, layer, tablename);
+            //关掉数据
+            // 导入数据
+            importDataToPostgis(conn, layer, tablename, srid);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            gdbDataSource.delete();
+        }
+        return shppath;
+    }
+
+    public static void initDbConfig() {
+        Map<String, Object> dbconn = new HashMap<>();
+        try {
+            dbconn = gson.fromJson(dbconnection, mapType);
+            dbconn.put("port", Integer.valueOf(String.valueOf(dbconn.get("port")).replaceAll(".0", "")));
+            PG_HOST = String.valueOf(dbconn.get("host"));
+            PG_PORT = String.valueOf(dbconn.get("port"));
+            PG_DB = String.valueOf(dbconn.get("database"));
+            PG_USER = String.valueOf(dbconn.get("user"));
+            PG_PASSWORD = String.valueOf(dbconn.get("passwd"));
+            PG_SCHEMA = String.valueOf(dbconn.get("schema"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static Connection getPostgresConnection() throws SQLException {
+        String url = String.format("jdbc:postgresql://%s:%s/%s",
+                PG_HOST, PG_PORT, PG_DB);
+        return DriverManager.getConnection(url, PG_USER, PG_PASSWORD);
+    }
+
+    public static String createPostgisTable(Connection conn, Layer layer, String layername) throws SQLException {
+        // 获取图层定义
+        FeatureDefn defn = layer.GetLayerDefn();
+        // 构建CREATE TABLE SQL
+        StringBuilder sql = new StringBuilder();
+        sql.append(String.format("CREATE TABLE IF NOT EXISTS %s.%s (", PG_SCHEMA, layername));
+        sql.append("gid SERIAL PRIMARY KEY, ");
+        // 添加属性字段
+        for (int i = 0; i < defn.GetFieldCount(); i++) {
+            FieldDefn fieldDefn = defn.GetFieldDefn(i);
+            String fieldName = fieldDefn.GetName();
+            String fieldType = getPgFieldType(fieldDefn.GetFieldType());
+            sql.append(String.format("%s %s, ", fieldName, fieldType));
+        }
+        // 添加几何字段
+        sql.append("geom geometry");
+        // 添加空间参考信息
+        SpatialReference srs = layer.GetSpatialRef();
+        String srid = srs.GetAuthorityCode(null);
+        if (srs != null) {
+            if (StringUtils.isNotEmpty(srid)) {
+                sql.append(String.format(", CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = %d)", Integer.valueOf(srid)));
+            }
+        }
+        sql.append(")");
+        // 执行创建表
+        try (Statement stmt = conn.createStatement()) {
+            stmt.execute(sql.toString());
+            System.out.println("表创建成功: " + layername);
+        }
+        return srid;
+    }
+
+    public static String getPgFieldType(int ogrFieldType) {
+        switch (ogrFieldType) {
+            case ogr.OFTInteger:
+                return "integer";
+            case ogr.OFTReal:
+                return "double precision";
+            case ogr.OFTString:
+                return "text";
+            case ogr.OFTDate:
+                return "date";
+            case ogr.OFTDateTime:
+                return "timestamp";
+            default:
+                return "text";
+        }
+    }
+
+    public static void importDataToPostgis(Connection conn, Layer layer, String tableName, String srid) throws SQLException {
+        // 准备插入语句
+        FeatureDefn defn = layer.GetLayerDefn();
+        StringBuilder insertSql = new StringBuilder();
+        insertSql.append(String.format("INSERT INTO %s.%s (", PG_SCHEMA, tableName));
+        // 添加属性字段名
+        for (int i = 0; i < defn.GetFieldCount(); i++) {
+            insertSql.append(defn.GetFieldDefn(i).GetName()).append(", ");
+        }
+        // 添加几何字段
+        insertSql.append("geom) VALUES (");
+        // 添加参数占位符
+        for (int i = 0; i < defn.GetFieldCount(); i++) {
+            insertSql.append("?, ");
+        }
+        insertSql.setLength(insertSql.length() - 2); // 移除最后的逗号和空格
+        insertSql.append(", st_setsrid(?::geometry, " + srid + "))");
+        // 准备批处理
+        conn.setAutoCommit(false);
+        try (PreparedStatement pstmt = conn.prepareStatement(insertSql.toString())) {
+            int batchCount = 0;
+            // 遍历所有要素
+            Feature feature;
+            Integer count = Math.toIntExact(layer.GetFeatureCount(1));
+            while ((feature = layer.GetNextFeature()) != null)  {
+//                feature = layer.GetFeature(j);
+                // 设置属性值
+                for (int i = 0; i < defn.GetFieldCount(); i++) {
+                    setPreparedStatementValue(pstmt, i + 1, feature, i);
+                }
+                // 设置几何值
+                Geometry geom = feature.GetGeometryRef();
+                if (geom != null) {
+                    pstmt.setString(defn.GetFieldCount() + 1, geom.ExportToWkt() + "");
+                } else {
+                    pstmt.setNull(defn.GetFieldCount() + 1, Types.OTHER);
+                }
+                pstmt.addBatch();
+                batchCount++;
+                // 每1000条提交一次
+                if (batchCount % 1000 == 0) {
+                    pstmt.executeBatch();
+                    conn.commit();
+                    System.out.println("已导入 " + batchCount + " 条记录");
+                }
+                feature.delete();
+            }
+            // 提交剩余记录
+            pstmt.executeBatch();
+            conn.commit();
+            System.out.println("导入完成,共导入 " + batchCount + " 条记录");
+        } finally {
+            conn.setAutoCommit(true);
+        }
+    }
+
+    public static void setPreparedStatementValue(PreparedStatement pstmt, int index, Feature feature, int fieldIndex) throws SQLException {
+        if (feature.IsFieldSet(fieldIndex)) {
+            FieldDefn fieldDefn = feature.GetFieldDefnRef(fieldIndex);
+            switch (fieldDefn.GetFieldType()) {
+                case ogr.OFTInteger:
+                    pstmt.setInt(index, feature.GetFieldAsInteger(fieldIndex));
+                    break;
+                case ogr.OFTReal:
+                    pstmt.setDouble(index, feature.GetFieldAsDouble(fieldIndex));
+                    break;
+                case ogr.OFTString:
+                    pstmt.setString(index, feature.GetFieldAsString(fieldIndex));
+                    break;
+                case ogr.OFTDate:
+                    pstmt.setString(index, feature.GetFieldAsString(fieldIndex));
+//                    pstmt.setDate(index, new java.sql.Date(
+//                            feature.GetFieldAsDateTime(fieldIndex).toCalendar().getTimeInMillis()));
+                    break;
+                case ogr.OFTDateTime:
+                    pstmt.setString(index, feature.GetFieldAsString(fieldIndex));
+//                    pstmt.setTimestamp(index, new java.sql.Timestamp(
+//                            feature.GetFieldAsDateTime(fieldIndex).toCalendar().getTimeInMillis()));
+                    break;
+                default:
+                    pstmt.setString(index, feature.GetFieldAsString(fieldIndex));
+            }
+        } else {
+            pstmt.setNull(index, Types.NULL);
+        }
+    }
+}

+ 10 - 6
onemap-modules/onemap-spotoverlap/src/main/resources/mapper/postgresql/yzt/YztMapper.xml

@@ -217,7 +217,7 @@ WHERE
 
     <select id="getDetailsParent" resultType="com.onemap.spotoverlap.domain.yzt.ModelDetails"
             parameterType="java.lang.String">
-        select distinct("situationid") "situationid", "name" ,
+        select distinct("situationid") "situationid", "isvalid", "name" ,
         case when situationrelationship = 'and' then '且' else '或' end as "situationrelationship"
         from t_model_detail d where subid = #{subid}
         <if test="type != null and type != ''">
@@ -230,13 +230,13 @@ WHERE
         UPDATE ${tablename} AS C
         SET 合法性说明 = ( CASE WHEN (1 = 1
         <if test="relationshipwhere != null and relationshipwhere != ''">
-            and ${relationshipwhere}
+            and (${relationshipwhere})
         </if>
         <if test="selfwhere != null and selfwhere != ''">
-            and ${selfwhere}
+            and (${selfwhere})
         </if>
         <if test="subwhere != null and subwhere != ''">
-            and ${subwhere}
+            and (${subwhere})
         </if>
         ) THEN #{situationtype}||'' ELSE '' END ),
         面积 = eee.totalarea ,
@@ -256,7 +256,7 @@ WHERE
         FROM ${tablename} A JOIN
         (select * from ${sourcelayer} where 1 = 1
         <if test="sourcewhere != null and sourcewhere != ''">
-            and ${sourcewhere}
+            and (${sourcewhere})
         </if>
         )
         b ON st_intersects ( A.geom, b.geom )
@@ -331,7 +331,7 @@ WHERE
         else '疑似违法' end)
         from (
         select swid, (select STRING_AGG(distinct("type"),';') as str from t_assessment_config where "name" =  (SELECT unnest(string_to_array("合法性说明", ';')) FROM
-        ${tablename} where swid = rr.swid) ) as str from ${tablename} rr) aaa
+        ${tablename} where swid = rr.swid limit 1) ) as str from ${tablename} rr) aaa
         where aaa.swid = C.swid
     </update>
 
@@ -382,4 +382,8 @@ FROM
 GROUP BY
 	T.swtype ) ss order by count desc
     </select>
+
+    <update id="modeldetailisvalid">
+        update t_model_detail set isvalid = #{isvalid} where situationid = #{situationid}
+    </update>
 </mapper>