From 784d8511419029d78843d1c0d98bbb135788f4e1 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期一, 12 六月 2023 17:28:15 +0800 Subject: [PATCH] 读取GDB数据库的接口添加坐标转换功能 --- src/main/java/com/lf/server/entity/all/StaticData.java | 2 + src/main/java/com/lf/server/helper/GdbHelper.java | 83 +++++++++++++++++++++++++++++------------ 2 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/lf/server/entity/all/StaticData.java b/src/main/java/com/lf/server/entity/all/StaticData.java index fbde1e0..f40cd43 100644 --- a/src/main/java/com/lf/server/entity/all/StaticData.java +++ b/src/main/java/com/lf/server/entity/all/StaticData.java @@ -63,6 +63,8 @@ public static final int I2050 = 2050; + public static final int I4326 = 4326; + public static final int I4490 = 4490; /** diff --git a/src/main/java/com/lf/server/helper/GdbHelper.java b/src/main/java/com/lf/server/helper/GdbHelper.java index b6120b1..dd6f337 100644 --- a/src/main/java/com/lf/server/helper/GdbHelper.java +++ b/src/main/java/com/lf/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; @@ -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); } /** @@ -213,14 +244,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 +262,7 @@ } if (null != gField) { - setGeom(t, f, gField); + setGeom(t, gField, f.GetGeometryRef(), ct); } } @@ -288,30 +319,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)", ")"); - if (wkt.contains(StaticData.MULTICURVE)) { - wkt = wkt.replace("MULTICURVE (", "MULTILINESTRING (").replace("CIRCULARSTRING ", ""); - if (wkt.contains(StaticData.COMPOUNDCURVE)) { - wkt = wkt.replace("COMPOUNDCURVE (", "").replace(")))", "))"); - } - } - - 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