From 5c9f31377e3f4dbdb20a5f50f5aaf6fdbbfa87f5 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期一, 19 十二月 2022 17:21:15 +0800
Subject: [PATCH] 1

---
 src/main/java/com/lf/server/helper/GdbHelper.java |  158 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 140 insertions(+), 18 deletions(-)

diff --git a/src/main/java/com/lf/server/helper/GdbHelper.java b/src/main/java/com/lf/server/helper/GdbHelper.java
index 17ed1ba..048adc4 100644
--- a/src/main/java/com/lf/server/helper/GdbHelper.java
+++ b/src/main/java/com/lf/server/helper/GdbHelper.java
@@ -188,7 +188,7 @@
     /**
      * 鑾峰彇瀛楁鏄犲皠
      */
-    private static <T> void getFieldMapper(Class clazz, Layer layer, Map<Integer, Field> map) {
+    private static void getFieldMapper(Class clazz, Layer layer, Map<Integer, Field> map) {
         try {
             FeatureDefn fd = layer.GetLayerDefn();
             for (int i = 0, count = fd.GetFieldCount(); i < count; i++) {
@@ -208,7 +208,7 @@
                 }
             }
 
-            if (OBJECT != clazz.getSuperclass().getName()) {
+            if (!OBJECT.equals(clazz.getSuperclass().getName())) {
                 getFieldMapper(clazz.getSuperclass(), layer, map);
             }
         } catch (Exception ex) {
@@ -341,19 +341,36 @@
             }
 
             for (String key : map.keySet()) {
-                GeomBaseMapper baseMapper = ClassHelper.getGeoBaseMapper(key);
-                if (null == baseMapper) {
-                    continue;
-                }
-                Layer layer = createLayer(dataSource, baseMapper);
-                if(null == layer){
-                    continue;
-                }
+                Layer layer = null;
+                try {
+                    GeomBaseMapper baseMapper = ClassHelper.getGeoBaseMapper(key);
+                    if (null == baseMapper) {
+                        continue;
+                    }
+                    layer = createLayer(dataSource, baseMapper);
+                    if (null == layer) {
+                        continue;
+                    }
 
-                String className = ClassHelper.getClassName(baseMapper);
-                Class clazz = ClassHelper.getEntityClass(className);
+                    String className = ClassHelper.getClassName(baseMapper);
+                    Class clazz = ClassHelper.getEntityClass(className);
+                    Field gField = getGeomField(clazz);
+                    if (null == gField) {
+                        continue;
+                    }
 
-                List<?> list = map.get(key);
+                    List<Field> fields = new ArrayList<>();
+                    getFields(clazz, fields);
+                    addLayerField(layer, fields);
+
+                    setLayerData(layer, fields, map.get(key));
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                } finally {
+                    if (null != layer) {
+                        layer.delete();
+                    }
+                }
             }
         } catch (Exception ex) {
             log.error(ex.getMessage(), ex);
@@ -380,20 +397,18 @@
         SpatialReference sr = new SpatialReference();
         sr.ImportFromEPSG(null == srid ? 4326 : srid);
 
-        Layer layer = dataSource.CreateLayer(tab, sr, getGeomType(geomType), null);
-
-        return layer;
+        return dataSource.CreateLayer(tab, sr, getGeomType(geomType), null);
     }
 
     /**
      * 鑾峰彇Geom绫诲埆
      */
     private static Integer getGeomType(String geomType) {
-        if (StringHelper.isEmpty(geomType)){
+        if (StringHelper.isEmpty(geomType)) {
             return ogr.wkbUnknown;
         }
 
-        switch (geomType){
+        switch (geomType) {
             case "ST_Point":
                 return ogr.wkbPoint;
             case "ST_LineString":
@@ -408,4 +423,111 @@
                 return ogr.wkbUnknown;
         }
     }
+
+    /**
+     * 鑾峰彇瀛楁
+     */
+    private static void getFields(Class clazz, List<Field> list) {
+        try {
+            Field[] fields = clazz.getDeclaredFields();
+            for (Field f : fields) {
+                if (StaticData.GDB_EXCLUDE_FIELDS.contains(f.getName())) {
+                    continue;
+                }
+
+                f.setAccessible(true);
+                list.add(f);
+            }
+
+            if (!OBJECT.equals(clazz.getSuperclass().getName())) {
+                getFields(clazz.getSuperclass(), list);
+            }
+        } catch (Exception ex) {
+            //
+        }
+    }
+
+    /**
+     * 娣诲姞鍥惧眰瀛楁
+     */
+    private static void addLayerField(Layer layer, List<Field> list) {
+        for (int i = 0, c = list.size(); i < c; i++) {
+            Field f = list.get(i);
+            FieldDefn fd = getLayerField(f);
+            layer.CreateField(fd, i);
+        }
+    }
+
+    private static FieldDefn getLayerField(Field f ) {
+        int fieldType = getFieldType(f);
+        FieldDefn fd = new FieldDefn(f.getName(), fieldType);
+
+        if (fieldType == ogr.OFTString) {
+            // fd.SetWidth(100)
+        }
+
+        return fd;
+    }
+
+    /**
+     * 鑾峰彇瀛楁绫诲瀷
+     */
+    private static Integer getFieldType(Field f) {
+        switch (f.getType().getName()) {
+            case "java.math.BigDecimal":
+            case "java.lang.Double":
+            case "double":
+                return ogr.OFTReal;
+            case "java.lang.Long":
+            case "long":
+                return ogr.OFTInteger64;
+            case "java.lang.Integer":
+            case "int":
+                return ogr.OFTInteger;
+            case "java.sql.Timestamp":
+                return ogr.OFTDateTime;
+            default:
+                return ogr.OFTString;
+        }
+    }
+
+    /**
+     * 璁剧疆鍥惧眰鏁版嵁
+     */
+    private static <T> void setLayerData(Layer layer,  List<Field> fields, List<T> list) throws Exception {
+        for (T t : list) {
+            Feature f = new Feature(layer.GetLayerDefn());
+
+            BaseGeoEntity geoEntity = (BaseGeoEntity) t;
+            Geometry geom = Geometry.CreateFromWkt(geoEntity.getGeom());
+            f.SetGeometry(geom);
+
+            for (int i = 0, c = fields.size(); i < c; i++) {
+                Field field = fields.get(i);
+                switch (field.getType().getName()) {
+                    case "java.math.BigDecimal":
+                    case "java.lang.Double":
+                    case "double":
+                        Double d = field.getDouble(t);
+                        f.SetField(i, d);
+                    case "java.lang.Long":
+                    case "long":
+                        Long l = field.getLong(t);
+                        f.SetField(i, l);
+                    case "java.lang.Integer":
+                    case "int":
+                        Integer n = field.getInt(t);
+                        f.SetField(i, n);
+                    case "java.sql.Timestamp":
+                        //return ogr.OFTDateTime;
+                    default:
+                        String str = (String) field.get(t);
+                        f.SetField(i, str);
+                        break;
+                }
+            }
+
+            layer.CreateFeature(f);
+        }
+    }
 }

--
Gitblit v1.9.3