From e0ee9dab23f25421f8f8f6bfb58f9fec7d58978f Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 19 十二月 2022 16:26:03 +0800 Subject: [PATCH] 1 --- src/main/java/com/lf/server/helper/GdbHelper.java | 204 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 186 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 115776a..979f070 100644 --- a/src/main/java/com/lf/server/helper/GdbHelper.java +++ b/src/main/java/com/lf/server/helper/GdbHelper.java @@ -1,8 +1,13 @@ package com.lf.server.helper; +import com.lf.server.entity.all.BaseGeoEntity; +import com.lf.server.entity.all.StaticData; +import com.lf.server.mapper.all.GeomBaseMapper; +import com.lf.server.service.all.BaseQueryService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.gdal.ogr.*; +import org.gdal.osr.SpatialReference; import java.lang.reflect.Field; import java.sql.Timestamp; @@ -18,7 +23,7 @@ public class GdbHelper { private final static Log log = LogFactory.getLog(GdbHelper.class); - public static List<String> excludeFields = new ArrayList<>(Arrays.asList("gid", "shape_leng")); + private final static String OBJECT ="java.lang.Object"; /** * 閿�姣佽祫婧� @@ -73,11 +78,13 @@ try { driver = ogr.GetDriverByName("OpenFileGDB"); if (null == driver) { + log.error("GdbHelper.getTabNames: OpenFileGDB is null"); return list; } dataSource = driver.Open(filePath, 0); if (null == dataSource) { + log.error("GdbHelper.getTabNames.dataSource is null. " + filePath); return list; } @@ -139,11 +146,10 @@ 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; - } - if (1 > layer.GetFeatureCount()) { + + Map<Integer, Field> map = new HashMap<>(3); + getFieldMapper(clazz, layer, map); + if (map.isEmpty() || 0 == layer.GetFeatureCount()) { return; } @@ -182,16 +188,14 @@ /** * 鑾峰彇瀛楁鏄犲皠 */ - private static <T> Map<Integer, Field> getFieldMapper(Class clazz, Layer layer) { - Map<Integer, Field> map = new HashMap<>(3); - + 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++) { FieldDefn fieldDefn = fd.GetFieldDefn(i); try { String name = fieldDefn.GetName().toLowerCase(); - if (excludeFields.contains(name)){ + if (StaticData.READ_EXCLUDE_FIELDS.contains(name)) { continue; } @@ -203,11 +207,13 @@ // } } + + if (!OBJECT.equals(clazz.getSuperclass().getName())) { + getFieldMapper(clazz.getSuperclass(), layer, map); + } } catch (Exception ex) { // } - - return map; } /** @@ -234,21 +240,21 @@ * 璁剧疆鍊� */ private static <T> void setValue(T t, Feature f, Field field, Integer i) throws Exception { - switch (field.getType().toString()) { - case "class java.math.BigDecimal": - case "class java.lang.Double": + switch (field.getType().getName()) { + case "java.math.BigDecimal": + case "java.lang.Double": case "double": field.set(t, f.GetFieldAsDouble(i)); break; - case "class java.lang.Long": + case "java.lang.Long": case "long": field.set(t, f.GetFieldAsInteger64(i)); break; - case "class java.lang.Integer": + case "java.lang.Integer": case "int": field.set(t, f.GetFieldAsInteger(i)); break; - case "class java.sql.Timestamp": + case "java.sql.Timestamp": field.set(t, getTimestamp(f, i)); break; default: @@ -316,4 +322,166 @@ return Timestamp.valueOf(localDateTime); } + + /** + * 鍒涘缓GDB + */ + public static void createGdb(String filePath, Map<String, List<?>> map) { + Driver driver = null; + DataSource dataSource = null; + try { + driver = ogr.GetDriverByName("OpenFileGDB"); + if (null == driver) { + return; + } + + dataSource = driver.CreateDataSource(filePath); + if (null == dataSource) { + return; + } + + for (String key : map.keySet()) { + GeomBaseMapper baseMapper = ClassHelper.getGeoBaseMapper(key); + if (null == baseMapper) { + continue; + } + Layer layer = createLayer(dataSource, baseMapper); + if (null == layer) { + continue; + } + + String className = ClassHelper.getClassName(baseMapper); + Class clazz = ClassHelper.getEntityClass(className); + List<Field> fields = new ArrayList<>(); + getFields(clazz, fields); + + Field gField = getGeomField(clazz); + if (null == gField) { + continue; + } + + List<?> list = map.get(key); + } + } catch (Exception ex) { + log.error(ex.getMessage(), ex); + } finally { + GdbHelper.delete(dataSource, driver); + } + } + + /** + * 鍒涘缓鍥惧眰 + */ + private static Layer createLayer(DataSource dataSource, GeomBaseMapper baseMapper ) { + String tab = BaseQueryService.getTabName(baseMapper); + if (StringHelper.isNull(tab)) { + return null; + } + + String geomType = baseMapper.selectGeometryType(tab); + if (StringHelper.isEmpty(geomType)) { + return null; + } + + Integer srid = baseMapper.selectSrid(tab); + SpatialReference sr = new SpatialReference(); + sr.ImportFromEPSG(null == srid ? 4326 : srid); + + return dataSource.CreateLayer(tab, sr, getGeomType(geomType), null); + } + + /** + * 鑾峰彇Geom绫诲埆 + */ + private static Integer getGeomType(String geomType) { + if (StringHelper.isEmpty(geomType)) { + return ogr.wkbUnknown; + } + + switch (geomType) { + case "ST_Point": + return ogr.wkbPoint; + case "ST_LineString": + return ogr.wkbLineString; + case "ST_MultiLineString": + return ogr.wkbMultiLineString; + case "ST_Polygon": + return ogr.wkbPolygon; + case "ST_MultiPolygon": + return ogr.wkbMultiPolygon; + default: + return ogr.wkbUnknown; + } + } + + /** + * 鑾峰彇瀛楁 + */ + private static void getFields(Class clazz, List<Field> list) { + try { + Field[] fields = clazz.getDeclaredFields(); + for (Field f : fields) { +// if ("geom".equals(f.getName())) { +// continue; +// } + + if (StaticData.READ_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) { + + } + + 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; + } + } } -- Gitblit v1.9.3