管道基础大数据平台系统开发-【后端】-Server
11
13693261870
2022-11-21 425f3bd6fbfc7e48e6c734fbae5ab38a55f20702
11
已修改2个文件
124 ■■■■■ 文件已修改
src/main/java/com/lf/server/helper/GdalHelper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lf/server/helper/GdbHelper.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lf/server/helper/GdalHelper.java
@@ -242,7 +242,7 @@
        }
    }
    private static Object getProperty(Feature feature, int index) {
    public static Object getProperty(Feature feature, int index) {
        int type = feature.GetFieldType(index);
        PropertyGetter propertyGetter;
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());
        }
    }
}