From 425f3bd6fbfc7e48e6c734fbae5ab38a55f20702 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期一, 21 十一月 2022 21:20:59 +0800
Subject: [PATCH] 11

---
 src/main/java/com/lf/server/helper/GdbHelper.java |  122 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 118 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/lf/server/helper/GdbHelper.java b/src/main/java/com/lf/server/helper/GdbHelper.java
index 7d56898..91f476d 100644
--- a/src/main/java/com/lf/server/helper/GdbHelper.java
+++ b/src/main/java/com/lf/server/helper/GdbHelper.java
@@ -2,12 +2,13 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.gdal.ogr.DataSource;
-import org.gdal.ogr.Layer;
-import org.gdal.ogr.ogr;
+import org.gdal.ogr.*;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * GDB甯姪绫�
@@ -76,7 +77,23 @@
      */
     public static <T> void readLayer(Class clazz, Layer layer, List<T> list) {
         try {
-            //
+            Field gField = getGeomField(clazz);
+            Map<Integer, Field> map = getFieldMapper(clazz, layer);
+            if (map.size() == 0) {
+                return;
+            }
+
+            do {
+                Feature f = layer.GetNextFeature();
+                if (null == f) {
+                    break;
+                }
+
+                T t = (T) clazz.newInstance();
+                if (readFeature(t, f, map, gField)) {
+                    list.add(t);
+                }
+            } while (true);
         } catch (Exception ex) {
             log.error(ex.getMessage(), ex);
         } finally {
@@ -85,4 +102,101 @@
             }
         }
     }
+
+    /**
+     * 鑾峰彇 geom 瀛楁
+     */
+    private static Field getGeomField(Class clazz) {
+        try {
+            Field gField = clazz.getDeclaredField("geom");
+            gField.setAccessible(true);
+
+            return gField;
+        } catch (Exception ex) {
+            return null;
+        }
+    }
+
+    /**
+     * 鑾峰彇瀛楁鏄犲皠
+     */
+    private static <T> Map<Integer, Field> getFieldMapper(Class clazz, Layer layer) {
+        Map<Integer, Field> map = new HashMap<>(3);
+
+        try {
+            FeatureDefn fd = layer.GetLayerDefn();
+            for (int i = 0, count = fd.GetFieldCount(); i < count; i++) {
+                FieldDefn fieldDefn = fd.GetFieldDefn(i);
+                try {
+                    Field field = clazz.getDeclaredField(fieldDefn.GetName().toLowerCase());
+                    field.setAccessible(true);
+
+                    map.put(i, field);
+                } catch (Exception e) {
+                    //
+                }
+            }
+        } catch (Exception ex) {
+            //
+        }
+
+        return map;
+    }
+
+    /**
+     * 璇诲彇Feature
+     */
+    private static <T> boolean readFeature(T t, Feature f, Map<Integer, Field> map, Field gField) {
+        try {
+            for (Integer i : map.keySet()) {
+                Field field = map.get(i);
+                setValue(t, f, field, i);
+            }
+
+            if (null != gField) {
+                setGeom(t, f, gField);
+            }
+
+            return true;
+        } catch (Exception ex) {
+            return false;
+        }
+    }
+
+    /**
+     * 璁剧疆鍊�
+     */
+    private static <T> void setValue(T t, Feature f, Field field, Integer i) throws Exception {
+        switch (field.getType().toString()) {
+            case "java.math.BigDecimal":
+            case "java.lang.Double":
+            case "double":
+                field.set(t, f.GetFieldAsDouble(i));
+                break;
+            case "java.lang.Long":
+            case "long":
+                field.set(t, f.GetFieldAsInteger64(i));
+                break;
+            case "java.lang.Integer":
+            case "int":
+                field.set(t, f.GetFieldAsInteger(i));
+                break;
+            case "java.sql.Timestamp":
+                field.set(t, GdalHelper.getProperty(f, i));
+                break;
+            default:
+                field.set(t, f.GetFieldAsString(i));
+                break;
+        }
+    }
+
+    /**
+     * 璁剧疆 geom 瀛楁鍊�
+     */
+    private static <T> void setGeom(T t, Feature f, Field gField) throws Exception {
+        Geometry geometry = f.GetGeometryRef();
+        if (null != geometry) {
+            gField.set(t, geometry.ExportToWkt());
+        }
+    }
 }

--
Gitblit v1.9.3