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