From e002c67732b571f0b20cca8321ca8ee1ddba2e05 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 14 八月 2023 17:05:23 +0800 Subject: [PATCH] 修改文件上传、GDB/Shp数据读取、数据入库、元数据管理等接口 --- src/main/java/com/moon/server/helper/GdbHelper.java | 88 +++++++++++++++++++++++++++++++------------ 1 files changed, 63 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/moon/server/helper/GdbHelper.java b/src/main/java/com/moon/server/helper/GdbHelper.java index fd780e8..4f2448d 100644 --- a/src/main/java/com/moon/server/helper/GdbHelper.java +++ b/src/main/java/com/moon/server/helper/GdbHelper.java @@ -8,7 +8,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.gdal.ogr.*; +import org.gdal.osr.CoordinateTransformation; import org.gdal.osr.SpatialReference; +import org.gdal.osr.osr; import java.lang.reflect.Field; import java.math.BigDecimal; @@ -107,7 +109,7 @@ /** * 璇诲彇鏁版嵁 */ - public static <T> List<T> readData(Class clazz, String filePath, String layerName) { + public static <T> List<T> readData(Class clazz, String filePath, String layerName, boolean isTransform) { List<T> list = new ArrayList<>(); Driver driver = null; @@ -127,7 +129,7 @@ for (int i = 0, count = dataSource.GetLayerCount(); i < count; i++) { Layer layer = dataSource.GetLayer(i); if (layer.GetName().equals(layerName)) { - GdbHelper.readLayer(clazz, layer, list); + GdbHelper.readLayer(clazz, layer, list, isTransform); break; } @@ -145,7 +147,7 @@ /** * 璇诲彇鍥惧眰 */ - public static <T> void readLayer(Class clazz, Layer layer, List<T> list) { + public static <T> void readLayer(Class clazz, Layer layer, List<T> list, boolean isTransform) { try { Field gField = getGeomField(clazz); @@ -155,6 +157,8 @@ return; } + CoordinateTransformation ct = getCoordinateTransformation(layer, isTransform); + do { Feature f = layer.GetNextFeature(); if (null == f) { @@ -162,7 +166,7 @@ } T t = (T) clazz.newInstance(); - readFeature(t, f, map, gField); + readFeature(t, f, map, gField, ct); list.add(t); } while (true); } catch (Exception ex) { @@ -170,6 +174,33 @@ } finally { GdbHelper.delete(layer); } + } + + /** + * 鑾峰彇鍧愭爣杞崲鍣� + */ + private static CoordinateTransformation getCoordinateTransformation(Layer layer, boolean isTransform) { + if (!isTransform) { + return null; + } + + String epsg = layer.GetSpatialRef().GetAttrValue("AUTHORITY", 1); + if (StringHelper.isEmpty(epsg)) { + return null; + } + + int epsgId = Integer.parseInt(epsg); + if (StaticData.I4326 == epsgId || StaticData.I4490 == epsgId) { + return null; + } + + SpatialReference srTarget = new SpatialReference(); + srTarget.ImportFromEPSG(StaticData.I4490); + + layer.GetSpatialRef().SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); + srTarget.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER); + + return CoordinateTransformation.CreateCoordinateTransformation(layer.GetSpatialRef(), srTarget); } /** @@ -193,14 +224,13 @@ 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(); + String name = fd.GetFieldDefn(i).GetName().toLowerCase(); if (StaticData.READ_EXCLUDE_FIELDS.contains(name)) { continue; } - Field field = clazz.getDeclaredField(name); + Field field = clazz.getDeclaredField("gbcode".equals(name) ? "gb" : name); field.setAccessible(true); map.put(i, field); @@ -213,14 +243,14 @@ getFieldMapper(clazz.getSuperclass(), layer, map); } } catch (Exception ex) { - // + log.error(ex); } } /** * 璇诲彇Feature */ - private static <T> void readFeature(T t, Feature f, Map<Integer, Field> map, Field gField) { + private static <T> void readFeature(T t, Feature f, Map<Integer, Field> map, Field gField, CoordinateTransformation ct) { for (Integer i : map.keySet()) { try { Field field = map.get(i); @@ -231,7 +261,7 @@ } if (null != gField) { - setGeom(t, f, gField); + setGeom(t, gField, f.GetGeometryRef(), ct); } } @@ -288,24 +318,32 @@ * wkbNone = 100, * wkbLinearRing = 101 */ - private static <T> void setGeom(T t, Feature f, Field gField) { + private static <T> void setGeom(T t, Field gField, Geometry geometry, CoordinateTransformation ct) { try { - String geo = "null"; - if (null != f.GetGeometryRef()) { - String wkt = f.GetGeometryRef().ExportToWkt(); - // f.GetGeometryRef().GetGeometryType() - if (wkt.contains(StaticData.LINESTRING) && !wkt.contains(StaticData.MULTILINESTRING)) { - wkt = wkt.replace("LINESTRING (", "MULTILINESTRING ((") + ")"; - } - if (wkt.contains(StaticData.POLYGON) && !wkt.contains(StaticData.MULTIPOLYGON)) { - wkt = wkt.replace("POLYGON (", "MULTIPOLYGON ((") + ")"; - } - wkt = wkt.replace(" 0,", ",").replace(" 0)", ")"); - - geo = String.format("ST_GeomFromText('%s')", wkt); + if (null == geometry) { + gField.set(t, "null"); + return; + } + if (null != ct) { + int flag = geometry.Transform(ct); } - gField.set(t, geo); + String wkt = geometry.ExportToWkt(); + if (wkt.contains(StaticData.LINESTRING) && !wkt.contains(StaticData.MULTILINESTRING)) { + wkt = wkt.replace("LINESTRING (", "MULTILINESTRING ((") + ")"; + } + if (wkt.contains(StaticData.POLYGON) && !wkt.contains(StaticData.MULTIPOLYGON)) { + wkt = wkt.replace("POLYGON (", "MULTIPOLYGON ((") + ")"; + } + wkt = wkt.replace(" 0,", ",").replace(" 0)", ")"); + if (wkt.contains(StaticData.MULTICURVE)) { + wkt = wkt.replace("MULTICURVE (", "MULTILINESTRING (").replace("CIRCULARSTRING ", ""); + if (wkt.contains(StaticData.COMPOUNDCURVE)) { + wkt = wkt.replace("COMPOUNDCURVE (", "").replace(")))", "))"); + } + } + + gField.set(t, String.format("ST_GeomFromText('%s')", wkt)); } catch (Exception ex) { log.error(ex.getMessage(), ex); } -- Gitblit v1.9.3