From c139cd7c7621d2665cdeb046ebd50aa13279c756 Mon Sep 17 00:00:00 2001 From: Zhao Date: Mon, 15 Sep 2025 13:44:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ ruoyi-admin/src/test/java/GeoTest.java | 18 +++-- .../ruoyi/business/constants/TaskEnums.java | 10 +++ .../geo/framework/GeoCjqyExportTask.java | 4 +- .../geo/framework/GeoCjqyImportTask.java | 2 +- .../ruoyi/geo/framework/GeoExportTask.java | 19 ++++- .../ruoyi/geo/framework/GeoImportTask.java | 25 ++++++ .../geo/framework/GeoJtzyExportTask.java | 5 +- .../geo/framework/GeoJtzyImportTask.java | 2 +- .../geo/framework/GeoZyhycgExportTask.java | 7 +- .../geo/framework/GeoZyhycgImportTask.java | 2 +- ruoyi-common/pom.xml | 5 ++ .../{GeoCreator.java => GeoConverter.java} | 80 ++++++++++++++++++- .../java/com/ruoyi/common/geo/GeoParser.java | 48 ++++++++++- .../java/com/ruoyi/common/geo/GeoWriter.java | 24 +++--- 15 files changed, 214 insertions(+), 43 deletions(-) rename ruoyi-common/src/main/java/com/ruoyi/common/geo/{GeoCreator.java => GeoConverter.java} (65%) diff --git a/pom.xml b/pom.xml index bdebf63..9d5cda9 100644 --- a/pom.xml +++ b/pom.xml @@ -258,6 +258,12 @@ ${geotools.version} + + org.geotools + gt-epsg-hsql + ${geotools.version} + + diff --git a/ruoyi-admin/src/test/java/GeoTest.java b/ruoyi-admin/src/test/java/GeoTest.java index 3f3969a..2cd5c93 100644 --- a/ruoyi-admin/src/test/java/GeoTest.java +++ b/ruoyi-admin/src/test/java/GeoTest.java @@ -2,6 +2,7 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.thread.ThreadUtil; import com.alibaba.fastjson2.JSON; import com.ruoyi.RuoYiApplication; +import com.ruoyi.common.geo.GeoConverter; import com.ruoyi.common.geo.GeoParser; import com.ruoyi.common.geo.GeoWriter; import com.ruoyi.geo.service.GeoExportHandlerService; @@ -40,11 +41,14 @@ public final class GeoTest public static void main(String[] args) { + String COORD = "3857"; + COORD = "4326"; + String DIR = "D:/m/胜利村_shp_" + COORD + "/"; String PATH; - PATH = "D:/m/胜利村_shp_3857/cjqy.shp"; // cjqy - PATH = "D:/m/胜利村_shp_3857/dk.shp"; // dk - PATH = "D:/m/胜利村_shp_3857/zyhycg.shp"; // zyhycg - PATH = "D:/m/胜利村_shp_3857/jtzy.shp"; // jtzy + PATH = DIR + "cjqy.shp"; // cjqy + PATH = DIR + "dk.shp"; // dk + PATH = DIR + "zyhycg.shp"; // zyhycg + PATH = DIR + "jtzy.shp"; // jtzy String OUT; OUT = "D:/m/output_胜利村_shp_3857/jtzyxx.shp"; @@ -56,7 +60,7 @@ public final class GeoTest parser.Open(PATH, "UTF-8"); System.out.println(parser.GetTypeNames()); parser.SetSource(0); - List> cjqies = parser.GetMapList(); + List> cjqies = parser.GetMapList(GeoConverter.EPSG_3857); //List cjqies = parser.GetList(GeoCJQY.class); //List cjqies = parser.GetList(GeoJTZY.class); //List cjqies = parser.GetList(GeoZYHYCG.class); @@ -65,7 +69,7 @@ public final class GeoTest System.out.println(JSON.toJSONString(cjqies)); System.out.println("-------------------------"); - try(GeoWriter writer = new GeoWriter()) + /*try(GeoWriter writer = new GeoWriter()) { writer.Open(OUT, "UTF-8"); Map> classes = new LinkedHashMap<>(); @@ -77,7 +81,7 @@ public final class GeoTest System.out.println(writer.GetTypeNames()); writer.SetSource(0, false); writer.WriteMapList(cjqies); - } + }*/ } } } diff --git a/ruoyi-business/src/main/java/com/ruoyi/business/constants/TaskEnums.java b/ruoyi-business/src/main/java/com/ruoyi/business/constants/TaskEnums.java index fe7b171..5190e78 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/business/constants/TaskEnums.java +++ b/ruoyi-business/src/main/java/com/ruoyi/business/constants/TaskEnums.java @@ -13,6 +13,7 @@ public final class TaskEnums private TaskStatus() {} } + public static final class ImportType { public static final String IT_OVERRIDE = "1"; // 覆盖导入 @@ -21,5 +22,14 @@ public final class TaskEnums private ImportType() {} } + public static final class CoordinateSystem + { + public static final String CS_3857 = "1"; // 3857 + public static final String CS_4326 = "2"; // 4326 + public static final String CS_DEFAULT = CS_3857; // 3857 + + private CoordinateSystem() {} + } + private TaskEnums() {} } diff --git a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyExportTask.java b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyExportTask.java index 2773a08..0bfaa54 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyExportTask.java +++ b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyExportTask.java @@ -1,7 +1,7 @@ package com.ruoyi.geo.framework; import com.ruoyi.business.domain.TGisCjqy; -import com.ruoyi.common.geo.GeoCreator; +import com.ruoyi.common.geo.GeoConverter; import com.ruoyi.geo.service.GeoMapperService; import com.ruoyi.geo.structs.GeoCJQY; import org.locationtech.jts.geom.MultiPolygon; @@ -55,7 +55,7 @@ public class GeoCjqyExportTask implements GeoDBExportTaskInterface public Map> GetTypes() { - Map> types = GeoCreator.GetClassTypes(GeoCJQY.class); + Map> types = GeoConverter.GetClassTypes(GeoCJQY.class); types.put("the_geom", MultiPolygon.class); return types; } diff --git a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyImportTask.java b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyImportTask.java index e52e638..9913fe5 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyImportTask.java +++ b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyImportTask.java @@ -30,7 +30,7 @@ public class GeoCjqyImportTask implements GeoDBImportTaskInterface public int LoadDataList() { - list = importTask.parser.GetList(GeoCJQY.class); + list = importTask.parser.GetList(GeoCJQY.class, GeoImportTask.DefaultCS); importTask.logFile.WriteLine(TYPE_NAME + "shp读取数据条数: " + list.size()); return list.size(); diff --git a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoExportTask.java b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoExportTask.java index 12907f1..236c03e 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoExportTask.java +++ b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoExportTask.java @@ -4,9 +4,11 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ZipUtil; +import com.ruoyi.business.constants.TaskEnums; import com.ruoyi.business.domain.TTaskExport; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.geo.GeoConverter; import com.ruoyi.common.geo.GeoWriter; import com.ruoyi.common.utils.ExceptionUtil; import com.ruoyi.common.utils.StringUtils; @@ -144,6 +146,18 @@ public class GeoExportTask implements Runnable taskExport.setFileUrl("/profile" + GeoSysDir.TrimNormalized(zipFile)); } + private String GetEPSGName() + { + switch(taskExport.getCoordinateSystem()) + { + case TaskEnums.CoordinateSystem.CS_4326: + return GeoConverter.EPSG_4326; + case TaskEnums.CoordinateSystem.CS_3857: + default: + return GeoConverter.EPSG_3857; + } + } + private void CreateShp() { writer = new GeoWriter(); @@ -153,9 +167,12 @@ public class GeoExportTask implements Runnable logFile.ErrorLine("打开shp文件错误: " + shpFile); } + String dbCrsName = GetEPSGName(); + logFile.WriteLine("任务的坐标系: " + dbCrsName); + logFile.WriteLine("数据库的坐标系: " + GeoConverter.EPSG_3857); try { - writer.AddSchema(type, typeClasses); + writer.AddSchema(type + ".shp", dbCrsName, typeClasses); System.out.println(writer.GetTypeNames()); if(!writer.SetSource(type, false)) diff --git a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoImportTask.java b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoImportTask.java index 798aee3..653bb41 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoImportTask.java +++ b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoImportTask.java @@ -4,9 +4,11 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ZipUtil; +import com.ruoyi.business.constants.TaskEnums; import com.ruoyi.business.domain.TTaskImport; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.geo.GeoConverter; import com.ruoyi.common.geo.GeoParser; import com.ruoyi.common.utils.ExceptionUtil; import com.ruoyi.common.utils.spring.SpringUtils; @@ -17,7 +19,10 @@ import com.ruoyi.geo.service.GeoImportHandlerService; import com.ruoyi.geo.service.GeoMapperService; import com.ruoyi.system.mapper.SysDeptMapper; import lombok.extern.slf4j.Slf4j; +import org.locationtech.jts.geom.Geometry; + import static com.ruoyi.business.constants.TaskEnums.TaskStatus; +import static com.ruoyi.business.constants.TaskEnums.CoordinateSystem; import java.io.File; import java.util.Date; @@ -40,6 +45,7 @@ public class GeoImportTask implements Runnable private String type; String username; Date now; + static final String DefaultCS = GeoConverter.EPSG_3857; private GeoDBImportTaskInterface task; @@ -136,6 +142,18 @@ public class GeoImportTask implements Runnable } } + private String GetEPSGName() + { + switch(taskImport.getCoordinateSystem()) + { + case CoordinateSystem.CS_4326: + return GeoConverter.EPSG_4326; + case CoordinateSystem.CS_3857: + default: + return GeoConverter.EPSG_3857; + } + } + private boolean LoadDataList() { if(!parser.SetSource(type)) @@ -144,6 +162,13 @@ public class GeoImportTask implements Runnable return false; } + String crsName = parser.GetEPSGName(); + String dbCrsName = GetEPSGName(); + logFile.WriteLine("任务的坐标系: " + dbCrsName); + logFile.WriteLine("shp文件的坐标系: " + crsName); + if(!crsName.equalsIgnoreCase(dbCrsName)) + logFile.WriteLine("任务的坐标类型与shp文件不同: {} != {}", dbCrsName, crsName); + int num = task.LoadDataList(); if(num == 0) { diff --git a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyExportTask.java b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyExportTask.java index 82d5ac0..af5d5fc 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyExportTask.java +++ b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyExportTask.java @@ -1,7 +1,6 @@ package com.ruoyi.geo.framework; -import com.ruoyi.common.geo.GeoCreator; -import com.ruoyi.geo.service.GeoExportHandlerService; +import com.ruoyi.common.geo.GeoConverter; import com.ruoyi.geo.service.GeoMapperService; import com.ruoyi.geo.structs.GeoJTZY; import com.ruoyi.resource.domain.TResourceLand; @@ -72,7 +71,7 @@ public class GeoJtzyExportTask implements GeoDBExportTaskInterface public Map> GetTypes() { - Map> types = GeoCreator.GetClassTypes(GeoJTZY.class); + Map> types = GeoConverter.GetClassTypes(GeoJTZY.class); types.put("the_geom", MultiPolygon.class); return types; } diff --git a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyImportTask.java b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyImportTask.java index ab3a271..c32a67b 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyImportTask.java +++ b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyImportTask.java @@ -30,7 +30,7 @@ public class GeoJtzyImportTask implements GeoDBImportTaskInterface public int LoadDataList() { - list = importTask.parser.GetList(GeoJTZY.class); + list = importTask.parser.GetList(GeoJTZY.class, GeoImportTask.DefaultCS); importTask.logFile.WriteLine(TYPE_NAME + "shp读取数据条数: " + list.size()); return list.size(); diff --git a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgExportTask.java b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgExportTask.java index 3a0af17..7431700 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgExportTask.java +++ b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgExportTask.java @@ -1,12 +1,9 @@ package com.ruoyi.geo.framework; -import cn.hutool.core.util.StrUtil; -import com.ruoyi.common.geo.GeoCreator; -import com.ruoyi.common.utils.DecimalUtils; +import com.ruoyi.common.geo.GeoConverter; import com.ruoyi.geo.service.GeoMapperService; import com.ruoyi.geo.structs.GeoZYHYCG; import com.ruoyi.resource.domain.TResourceOperation; -import org.locationtech.jts.geom.MultiPolygon; import java.util.List; import java.util.Map; @@ -69,6 +66,6 @@ public class GeoZyhycgExportTask implements GeoDBExportTaskInterface public Map> GetTypes() { - return GeoCreator.GetClassTypes(GeoZYHYCG.class); + return GeoConverter.GetClassTypes(GeoZYHYCG.class); } } diff --git a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgImportTask.java b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgImportTask.java index 1724b8e..1ce5d9b 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgImportTask.java +++ b/ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgImportTask.java @@ -31,7 +31,7 @@ public class GeoZyhycgImportTask implements GeoDBImportTaskInterface public int LoadDataList() { - list = importTask.parser.GetList(GeoZYHYCG.class); + list = importTask.parser.GetList(GeoZYHYCG.class, GeoImportTask.DefaultCS); importTask.logFile.WriteLine(TYPE_NAME + "shp读取数据条数: " + list.size()); return list.size(); diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index e14f9b8..3224fd4 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -172,6 +172,11 @@ gt-geojson + + org.geotools + gt-epsg-hsql + + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoCreator.java b/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoConverter.java similarity index 65% rename from ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoCreator.java rename to ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoConverter.java index c2d1cb1..ee0e956 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoCreator.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoConverter.java @@ -1,6 +1,8 @@ package com.ruoyi.common.geo; -import cn.hutool.core.util.ClassUtil; +import org.geotools.geometry.jts.JTS; +import org.geotools.referencing.CRS; +import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.LineString; import org.locationtech.jts.geom.LinearRing; @@ -11,18 +13,22 @@ import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.WKTReader; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Map; -public final class GeoCreator +public final class GeoConverter { - private static GeoCreator geometryCreator = null; + private static GeoConverter geometryCreator = null; private static GeometryFactory geometryFactory = new GeometryFactory(); - private GeoCreator() { + private GeoConverter() { } /** @@ -157,4 +163,70 @@ public final class GeoCreator } return ret; } + + public static final String EPSG_4490 = "EPSG:4490"; + public static final String EPSG_3857 = "EPSG:3857"; + public static final String EPSG_4326 = "EPSG:4326"; + public static final String EPSG_4530 = "EPSG:4530"; + + + public static String EPSGName(CoordinateReferenceSystem a) + { + try + { + return CRS.lookupIdentifier(a, true); + } + catch(FactoryException e) + { + throw new RuntimeException(e); + } + } + + public static boolean CoordinateSystemEquals(CoordinateReferenceSystem a, CoordinateReferenceSystem b) + { + if(a == b) + return true; + if(a == null || b == null) + return false; + return CRS.equalsIgnoreMetadata(a, b); + } + + public static CoordinateReferenceSystem CoordinateSystem(String format) + { + try + { + CoordinateReferenceSystem coordinateReferenceSystem = CRS.decode(format, true); + return coordinateReferenceSystem; + } + catch(Exception e) + { + throw new RuntimeException(e); + } + } + + public static MathTransform Transformer(String srcFormat, String targetFormat) + { + try + { + MathTransform transform = CRS.findMathTransform(CRS.decode(srcFormat, true), CRS.decode(targetFormat, true), true); + return transform; + } + catch(Exception e) + { + throw new RuntimeException(e); + } + } + + public static Geometry Convert(Geometry resource, String srcFormat, String targetFormat) + { + try + { + Geometry transform = JTS.transform(resource, CRS.findMathTransform(CRS.decode(srcFormat, true), CRS.decode(targetFormat, true), true)); + return transform; + } + catch(Exception e) + { + throw new RuntimeException(e); + } + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoParser.java b/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoParser.java index 975846d..6fb372a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoParser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoParser.java @@ -3,13 +3,21 @@ package com.ruoyi.common.geo; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureSource; +import org.geotools.geometry.jts.JTS; +import org.geotools.referencing.CRS; import org.locationtech.jts.geom.Geometry; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; import java.io.Closeable; import java.io.File; @@ -144,9 +152,35 @@ public final class GeoParser implements Closeable } } - public List> GetMapList() + public String GetEPSGName() { CheckSource(); + CoordinateReferenceSystem sourceCS = source.getSchema().getCoordinateReferenceSystem(); + return GeoConverter.EPSGName(sourceCS); + } + + public List> GetMapList(String targetFormat) + { + CheckSource(); + + CoordinateReferenceSystem sourceCS = source.getSchema().getCoordinateReferenceSystem(); + System.out.println("[GeoParser]: 源坐标系: " + GeoConverter.EPSGName(sourceCS)); + CoordinateReferenceSystem targetCS = null; + if(StringUtils.isNotEmpty(targetFormat)) + targetCS = GeoConverter.CoordinateSystem(targetFormat); + MathTransform transformer = null; + if(null != targetCS && !GeoConverter.CoordinateSystemEquals(sourceCS, targetCS)) + { + try + { + transformer = CRS.findMathTransform(sourceCS, targetCS, true); + System.out.println(StrUtil.format("[GeoParser]: 需要转换坐标系: {} -> {}", CRS.toSRS(sourceCS), CRS.toSRS(targetCS))); + } + catch(FactoryException e) + { + throw new RuntimeException(e); + } + } try { List> ret = new ArrayList<>(); @@ -158,7 +192,13 @@ public final class GeoParser implements Closeable for (int i = 0; i < feature.getAttributeCount(); i++) { Object attribute = feature.getAttribute(i); if(attribute instanceof Geometry) - attribute = ((Geometry) attribute).toText(); + { + Geometry geometry = (Geometry) attribute; + if(null == transformer) + attribute = geometry.toText(); + else + attribute = JTS.transform(geometry, transformer).toText(); + } map.put(columnMap.get(i), attribute); } ret.add(map); @@ -170,9 +210,9 @@ public final class GeoParser implements Closeable } } - public List GetList(Class clazz) + public List GetList(Class clazz, String targetFormat) { - List> maps = GetMapList(); + List> maps = GetMapList(targetFormat); return maps.stream().map((x) -> BeanUtil.mapToBean(x, clazz, false, CopyOptions.create())).collect(Collectors.toList()); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoWriter.java b/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoWriter.java index 64d21b7..fce3415 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoWriter.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoWriter.java @@ -1,18 +1,15 @@ package com.ruoyi.common.geo; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Assert; import org.geotools.data.FeatureWriter; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; -import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.referencing.crs.DefaultGeographicCRS; -import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.LineString; import org.locationtech.jts.geom.LinearRing; import org.locationtech.jts.geom.MultiLineString; @@ -28,7 +25,6 @@ import java.io.Closeable; import java.io.File; import java.io.Serializable; import java.nio.charset.Charset; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; @@ -99,15 +95,15 @@ public final class GeoWriter implements Closeable Assert.notNull(writer, "请先打开写入"); } - public void AddSchema(String name, Map> parms) + public void AddSchema(String name, String cs, Map> parms) { CheckDataStore(); try { SimpleFeatureTypeBuilder tBuilder = new SimpleFeatureTypeBuilder(); - // 5、设置 -- WGS84:一个二维地理坐标参考系统,使用WGS84数据 - tBuilder.setCRS(DefaultGeographicCRS.WGS84); + tBuilder.setCRS(GeoConverter.CoordinateSystem(cs)); + System.out.println("写入坐标系: " + cs); tBuilder.setName(name); parms.forEach(tBuilder::add); @@ -198,49 +194,49 @@ public final class GeoWriter implements Closeable if(value instanceof Point) return value; else - return GeoCreator.PointByWKT(value.toString()); + return GeoConverter.PointByWKT(value.toString()); } else if(MultiPoint.class.isAssignableFrom(clazz)) { if(value instanceof MultiPoint) return value; else - return GeoCreator.MultiPointByWKT(value.toString()); + return GeoConverter.MultiPointByWKT(value.toString()); } else if(LineString.class.isAssignableFrom(clazz)) { if(value instanceof LineString) return value; else - return GeoCreator.LineStringByWKT(value.toString()); + return GeoConverter.LineStringByWKT(value.toString()); } else if(MultiLineString.class.isAssignableFrom(clazz)) { if(value instanceof MultiLineString) return value; else - return GeoCreator.MultiLineByWKT(value.toString()); + return GeoConverter.MultiLineByWKT(value.toString()); } else if(Polygon.class.isAssignableFrom(clazz)) { if(value instanceof Polygon) return value; else - return GeoCreator.PolygonByWKT(value.toString()); + return GeoConverter.PolygonByWKT(value.toString()); } else if(MultiPolygon.class.isAssignableFrom(clazz)) { if(value instanceof MultiPolygon) return value; else - return GeoCreator.MultiPolygonByWKT(value.toString()); + return GeoConverter.MultiPolygonByWKT(value.toString()); } else if(LinearRing.class.isAssignableFrom(clazz)) { if(value instanceof LinearRing) return value; else - return GeoCreator.LinearRingByWKT(value.toString()); + return GeoConverter.LinearRingByWKT(value.toString()); } else return value;