From b6b0cb226fcf184525ee7b36af3a09471e9c0057 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 25 三月 2024 11:29:33 +0800 Subject: [PATCH] 修改数据统计的查询条件 --- src/main/java/com/lf/server/helper/GdbHelper.java | 106 ++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 72 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/lf/server/helper/GdbHelper.java b/src/main/java/com/lf/server/helper/GdbHelper.java index 2483133..d11badd 100644 --- a/src/main/java/com/lf/server/helper/GdbHelper.java +++ b/src/main/java/com/lf/server/helper/GdbHelper.java @@ -1,6 +1,5 @@ package com.lf.server.helper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lf.server.entity.all.BaseGeoEntity; import com.lf.server.entity.all.StaticData; import com.lf.server.mapper.all.BasicMapper; @@ -9,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; @@ -108,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; @@ -128,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; } @@ -146,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); @@ -156,6 +157,8 @@ return; } + CoordinateTransformation ct = getCoordinateTransformation(layer, isTransform); + do { Feature f = layer.GetNextFeature(); if (null == f) { @@ -163,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) { @@ -171,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); } /** @@ -194,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); @@ -214,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); @@ -232,7 +261,7 @@ } if (null != gField) { - setGeom(t, f, gField); + setGeom(t, gField, f.GetGeometryRef(), ct); } } @@ -258,10 +287,16 @@ field.set(t, f.GetFieldAsInteger(i)); break; case "java.sql.Timestamp": - field.set(t, getTimestamp(f, i)); + Timestamp ts = getTimestamp(f, i); + if (null != ts) { + field.set(t, ts); + } break; case "java.time.LocalDate": - field.set(t, getLocalDate(f, i)); + LocalDate ld = getLocalDate(f, i); + if (null != ld) { + field.set(t, ld); + } break; default: field.set(t, f.GetFieldAsString(i)); @@ -283,29 +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(); - // noinspection AlibabaRemoveCommentedCode - switch (f.GetGeometryRef().GetGeometryType()) { - //case 1: - // wkt = wkt.replace("POINT", "MULTIPOINT"); - // break; - case 2: - wkt = wkt.replace("LINESTRING (", "MULTILINESTRING ((") + ")"; - break; - case 3: - wkt = wkt.replace("POLYGON (", "MULTIPOLYGON ((") + ")"; - break; - default: - break; - } - 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); } @@ -440,7 +478,7 @@ SpatialReference sr = new SpatialReference(); sr.ImportFromEPSG(null == srid ? 4490 : srid); - return dataSource.CreateLayer(tab, sr, getGeomType(geomType), null); + return dataSource.CreateLayer(tab.replace(".", "_"), sr, getGeomType(geomType), null); } /** -- Gitblit v1.9.3