瀏覽代碼

导出任务

master
Zhao 2 天之前
父節點
當前提交
c139cd7c76
共有 15 個檔案被更改,包括 214 行新增43 行删除
  1. +6
    -0
      pom.xml
  2. +11
    -7
      ruoyi-admin/src/test/java/GeoTest.java
  3. +10
    -0
      ruoyi-business/src/main/java/com/ruoyi/business/constants/TaskEnums.java
  4. +2
    -2
      ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyExportTask.java
  5. +1
    -1
      ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyImportTask.java
  6. +18
    -1
      ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoExportTask.java
  7. +25
    -0
      ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoImportTask.java
  8. +2
    -3
      ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyExportTask.java
  9. +1
    -1
      ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyImportTask.java
  10. +2
    -5
      ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgExportTask.java
  11. +1
    -1
      ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgImportTask.java
  12. +5
    -0
      ruoyi-common/pom.xml
  13. +76
    -4
      ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoConverter.java
  14. +44
    -4
      ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoParser.java
  15. +10
    -14
      ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoWriter.java

+ 6
- 0
pom.xml 查看文件

@@ -258,6 +258,12 @@
<version>${geotools.version}</version> <version>${geotools.version}</version>
</dependency> </dependency>


<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
<version>${geotools.version}</version>
</dependency>





<!-- 定时任务--> <!-- 定时任务-->


+ 11
- 7
ruoyi-admin/src/test/java/GeoTest.java 查看文件

@@ -2,6 +2,7 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.thread.ThreadUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.ruoyi.RuoYiApplication; import com.ruoyi.RuoYiApplication;
import com.ruoyi.common.geo.GeoConverter;
import com.ruoyi.common.geo.GeoParser; import com.ruoyi.common.geo.GeoParser;
import com.ruoyi.common.geo.GeoWriter; import com.ruoyi.common.geo.GeoWriter;
import com.ruoyi.geo.service.GeoExportHandlerService; import com.ruoyi.geo.service.GeoExportHandlerService;
@@ -40,11 +41,14 @@ public final class GeoTest


public static void main(String[] args) public static void main(String[] args)
{ {
String COORD = "3857";
COORD = "4326";
String DIR = "D:/m/胜利村_shp_" + COORD + "/";
String PATH; 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; String OUT;
OUT = "D:/m/output_胜利村_shp_3857/jtzyxx.shp"; OUT = "D:/m/output_胜利村_shp_3857/jtzyxx.shp";
@@ -56,7 +60,7 @@ public final class GeoTest
parser.Open(PATH, "UTF-8"); parser.Open(PATH, "UTF-8");
System.out.println(parser.GetTypeNames()); System.out.println(parser.GetTypeNames());
parser.SetSource(0); parser.SetSource(0);
List<Map<String, Object>> cjqies = parser.GetMapList();
List<Map<String, Object>> cjqies = parser.GetMapList(GeoConverter.EPSG_3857);
//List<GeoCJQY> cjqies = parser.GetList(GeoCJQY.class); //List<GeoCJQY> cjqies = parser.GetList(GeoCJQY.class);
//List<GeoJTZY> cjqies = parser.GetList(GeoJTZY.class); //List<GeoJTZY> cjqies = parser.GetList(GeoJTZY.class);
//List<GeoZYHYCG> cjqies = parser.GetList(GeoZYHYCG.class); //List<GeoZYHYCG> cjqies = parser.GetList(GeoZYHYCG.class);
@@ -65,7 +69,7 @@ public final class GeoTest
System.out.println(JSON.toJSONString(cjqies)); System.out.println(JSON.toJSONString(cjqies));
System.out.println("-------------------------"); System.out.println("-------------------------");


try(GeoWriter writer = new GeoWriter())
/*try(GeoWriter writer = new GeoWriter())
{ {
writer.Open(OUT, "UTF-8"); writer.Open(OUT, "UTF-8");
Map<String, Class<?>> classes = new LinkedHashMap<>(); Map<String, Class<?>> classes = new LinkedHashMap<>();
@@ -77,7 +81,7 @@ public final class GeoTest
System.out.println(writer.GetTypeNames()); System.out.println(writer.GetTypeNames());
writer.SetSource(0, false); writer.SetSource(0, false);
writer.WriteMapList(cjqies); writer.WriteMapList(cjqies);
}
}*/
} }
} }
} }

+ 10
- 0
ruoyi-business/src/main/java/com/ruoyi/business/constants/TaskEnums.java 查看文件

@@ -13,6 +13,7 @@ public final class TaskEnums


private TaskStatus() {} private TaskStatus() {}
} }

public static final class ImportType public static final class ImportType
{ {
public static final String IT_OVERRIDE = "1"; // 覆盖导入 public static final String IT_OVERRIDE = "1"; // 覆盖导入
@@ -21,5 +22,14 @@ public final class TaskEnums
private ImportType() {} 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() {} private TaskEnums() {}
} }

+ 2
- 2
ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyExportTask.java 查看文件

@@ -1,7 +1,7 @@
package com.ruoyi.geo.framework; package com.ruoyi.geo.framework;


import com.ruoyi.business.domain.TGisCjqy; 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.service.GeoMapperService;
import com.ruoyi.geo.structs.GeoCJQY; import com.ruoyi.geo.structs.GeoCJQY;
import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.MultiPolygon;
@@ -55,7 +55,7 @@ public class GeoCjqyExportTask implements GeoDBExportTaskInterface


public Map<String, Class<?>> GetTypes() public Map<String, Class<?>> GetTypes()
{ {
Map<String, Class<?>> types = GeoCreator.GetClassTypes(GeoCJQY.class);
Map<String, Class<?>> types = GeoConverter.GetClassTypes(GeoCJQY.class);
types.put("the_geom", MultiPolygon.class); types.put("the_geom", MultiPolygon.class);
return types; return types;
} }


+ 1
- 1
ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoCjqyImportTask.java 查看文件

@@ -30,7 +30,7 @@ public class GeoCjqyImportTask implements GeoDBImportTaskInterface


public int LoadDataList() 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()); importTask.logFile.WriteLine(TYPE_NAME + "shp读取数据条数: " + list.size());


return list.size(); return list.size();


+ 18
- 1
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.date.DateUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil; import cn.hutool.core.util.ZipUtil;
import com.ruoyi.business.constants.TaskEnums;
import com.ruoyi.business.domain.TTaskExport; import com.ruoyi.business.domain.TTaskExport;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.geo.GeoConverter;
import com.ruoyi.common.geo.GeoWriter; import com.ruoyi.common.geo.GeoWriter;
import com.ruoyi.common.utils.ExceptionUtil; import com.ruoyi.common.utils.ExceptionUtil;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
@@ -144,6 +146,18 @@ public class GeoExportTask implements Runnable
taskExport.setFileUrl("/profile" + GeoSysDir.TrimNormalized(zipFile)); 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() private void CreateShp()
{ {
writer = new GeoWriter(); writer = new GeoWriter();
@@ -153,9 +167,12 @@ public class GeoExportTask implements Runnable
logFile.ErrorLine("打开shp文件错误: " + shpFile); logFile.ErrorLine("打开shp文件错误: " + shpFile);
} }


String dbCrsName = GetEPSGName();
logFile.WriteLine("任务的坐标系: " + dbCrsName);
logFile.WriteLine("数据库的坐标系: " + GeoConverter.EPSG_3857);
try try
{ {
writer.AddSchema(type, typeClasses);
writer.AddSchema(type + ".shp", dbCrsName, typeClasses);


System.out.println(writer.GetTypeNames()); System.out.println(writer.GetTypeNames());
if(!writer.SetSource(type, false)) if(!writer.SetSource(type, false))


+ 25
- 0
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.date.DateUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil; import cn.hutool.core.util.ZipUtil;
import com.ruoyi.business.constants.TaskEnums;
import com.ruoyi.business.domain.TTaskImport; import com.ruoyi.business.domain.TTaskImport;
import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.geo.GeoConverter;
import com.ruoyi.common.geo.GeoParser; import com.ruoyi.common.geo.GeoParser;
import com.ruoyi.common.utils.ExceptionUtil; import com.ruoyi.common.utils.ExceptionUtil;
import com.ruoyi.common.utils.spring.SpringUtils; 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.geo.service.GeoMapperService;
import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysDeptMapper;
import lombok.extern.slf4j.Slf4j; 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.TaskStatus;
import static com.ruoyi.business.constants.TaskEnums.CoordinateSystem;


import java.io.File; import java.io.File;
import java.util.Date; import java.util.Date;
@@ -40,6 +45,7 @@ public class GeoImportTask implements Runnable
private String type; private String type;
String username; String username;
Date now; Date now;
static final String DefaultCS = GeoConverter.EPSG_3857;


private GeoDBImportTaskInterface task; 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() private boolean LoadDataList()
{ {
if(!parser.SetSource(type)) if(!parser.SetSource(type))
@@ -144,6 +162,13 @@ public class GeoImportTask implements Runnable
return false; 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(); int num = task.LoadDataList();
if(num == 0) if(num == 0)
{ {


+ 2
- 3
ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyExportTask.java 查看文件

@@ -1,7 +1,6 @@
package com.ruoyi.geo.framework; 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.service.GeoMapperService;
import com.ruoyi.geo.structs.GeoJTZY; import com.ruoyi.geo.structs.GeoJTZY;
import com.ruoyi.resource.domain.TResourceLand; import com.ruoyi.resource.domain.TResourceLand;
@@ -72,7 +71,7 @@ public class GeoJtzyExportTask implements GeoDBExportTaskInterface


public Map<String, Class<?>> GetTypes() public Map<String, Class<?>> GetTypes()
{ {
Map<String, Class<?>> types = GeoCreator.GetClassTypes(GeoJTZY.class);
Map<String, Class<?>> types = GeoConverter.GetClassTypes(GeoJTZY.class);
types.put("the_geom", MultiPolygon.class); types.put("the_geom", MultiPolygon.class);
return types; return types;
} }


+ 1
- 1
ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoJtzyImportTask.java 查看文件

@@ -30,7 +30,7 @@ public class GeoJtzyImportTask implements GeoDBImportTaskInterface


public int LoadDataList() 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()); importTask.logFile.WriteLine(TYPE_NAME + "shp读取数据条数: " + list.size());


return list.size(); return list.size();


+ 2
- 5
ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgExportTask.java 查看文件

@@ -1,12 +1,9 @@
package com.ruoyi.geo.framework; 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.service.GeoMapperService;
import com.ruoyi.geo.structs.GeoZYHYCG; import com.ruoyi.geo.structs.GeoZYHYCG;
import com.ruoyi.resource.domain.TResourceOperation; import com.ruoyi.resource.domain.TResourceOperation;
import org.locationtech.jts.geom.MultiPolygon;


import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -69,6 +66,6 @@ public class GeoZyhycgExportTask implements GeoDBExportTaskInterface


public Map<String, Class<?>> GetTypes() public Map<String, Class<?>> GetTypes()
{ {
return GeoCreator.GetClassTypes(GeoZYHYCG.class);
return GeoConverter.GetClassTypes(GeoZYHYCG.class);
} }
} }

+ 1
- 1
ruoyi-business/src/main/java/com/ruoyi/geo/framework/GeoZyhycgImportTask.java 查看文件

@@ -31,7 +31,7 @@ public class GeoZyhycgImportTask implements GeoDBImportTaskInterface


public int LoadDataList() 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()); importTask.logFile.WriteLine(TYPE_NAME + "shp读取数据条数: " + list.size());


return list.size(); return list.size();


+ 5
- 0
ruoyi-common/pom.xml 查看文件

@@ -172,6 +172,11 @@
<artifactId>gt-geojson</artifactId> <artifactId>gt-geojson</artifactId>
</dependency> </dependency>


<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-epsg-hsql</artifactId>
</dependency>



</dependencies> </dependencies>




ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoCreator.java → ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoConverter.java 查看文件

@@ -1,6 +1,8 @@
package com.ruoyi.common.geo; 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.GeometryFactory;
import org.locationtech.jts.geom.LineString; import org.locationtech.jts.geom.LineString;
import org.locationtech.jts.geom.LinearRing; 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.geom.Polygon;
import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader; 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.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; 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 static GeometryFactory geometryFactory = new GeometryFactory();


private GeoCreator() {
private GeoConverter() {
} }


/** /**
@@ -157,4 +163,70 @@ public final class GeoCreator
} }
return ret; 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);
}
}
} }

+ 44
- 4
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.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.lang.Assert; 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.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureIterator; import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource; 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.locationtech.jts.geom.Geometry;
import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.feature.type.AttributeDescriptor; 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.Closeable;
import java.io.File; import java.io.File;
@@ -144,9 +152,35 @@ public final class GeoParser implements Closeable
} }
} }


public List<Map<String, Object>> GetMapList()
public String GetEPSGName()
{ {
CheckSource(); CheckSource();
CoordinateReferenceSystem sourceCS = source.getSchema().getCoordinateReferenceSystem();
return GeoConverter.EPSGName(sourceCS);
}

public List<Map<String, Object>> 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 { try {
List<Map<String, Object>> ret = new ArrayList<>(); List<Map<String, Object>> ret = new ArrayList<>();
@@ -158,7 +192,13 @@ public final class GeoParser implements Closeable
for (int i = 0; i < feature.getAttributeCount(); i++) { for (int i = 0; i < feature.getAttributeCount(); i++) {
Object attribute = feature.getAttribute(i); Object attribute = feature.getAttribute(i);
if(attribute instanceof Geometry) 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); map.put(columnMap.get(i), attribute);
} }
ret.add(map); ret.add(map);
@@ -170,9 +210,9 @@ public final class GeoParser implements Closeable
} }
} }


public <T> List<T> GetList(Class<T> clazz)
public <T> List<T> GetList(Class<T> clazz, String targetFormat)
{ {
List<Map<String, Object>> maps = GetMapList();
List<Map<String, Object>> maps = GetMapList(targetFormat);
return maps.stream().map((x) -> BeanUtil.mapToBean(x, clazz, false, CopyOptions.create())).collect(Collectors.toList()); return maps.stream().map((x) -> BeanUtil.mapToBean(x, clazz, false, CopyOptions.create())).collect(Collectors.toList());
} }
} }

+ 10
- 14
ruoyi-common/src/main/java/com/ruoyi/common/geo/GeoWriter.java 查看文件

@@ -1,18 +1,15 @@
package com.ruoyi.common.geo; package com.ruoyi.common.geo;


import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import org.geotools.data.FeatureWriter; import org.geotools.data.FeatureWriter;
import org.geotools.data.Transaction; import org.geotools.data.Transaction;
import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.LineString; import org.locationtech.jts.geom.LineString;
import org.locationtech.jts.geom.LinearRing; import org.locationtech.jts.geom.LinearRing;
import org.locationtech.jts.geom.MultiLineString; import org.locationtech.jts.geom.MultiLineString;
@@ -28,7 +25,6 @@ import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.Serializable; import java.io.Serializable;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@@ -99,15 +95,15 @@ public final class GeoWriter implements Closeable
Assert.notNull(writer, "请先打开写入"); Assert.notNull(writer, "请先打开写入");
} }


public void AddSchema(String name, Map<String, Class<?>> parms)
public void AddSchema(String name, String cs, Map<String, Class<?>> parms)
{ {
CheckDataStore(); CheckDataStore();


try { try {
SimpleFeatureTypeBuilder tBuilder = new SimpleFeatureTypeBuilder(); SimpleFeatureTypeBuilder tBuilder = new SimpleFeatureTypeBuilder();


// 5、设置 -- WGS84:一个二维地理坐标参考系统,使用WGS84数据
tBuilder.setCRS(DefaultGeographicCRS.WGS84);
tBuilder.setCRS(GeoConverter.CoordinateSystem(cs));
System.out.println("写入坐标系: " + cs);
tBuilder.setName(name); tBuilder.setName(name);


parms.forEach(tBuilder::add); parms.forEach(tBuilder::add);
@@ -198,49 +194,49 @@ public final class GeoWriter implements Closeable
if(value instanceof Point) if(value instanceof Point)
return value; return value;
else else
return GeoCreator.PointByWKT(value.toString());
return GeoConverter.PointByWKT(value.toString());
} }
else if(MultiPoint.class.isAssignableFrom(clazz)) else if(MultiPoint.class.isAssignableFrom(clazz))
{ {
if(value instanceof MultiPoint) if(value instanceof MultiPoint)
return value; return value;
else else
return GeoCreator.MultiPointByWKT(value.toString());
return GeoConverter.MultiPointByWKT(value.toString());
} }
else if(LineString.class.isAssignableFrom(clazz)) else if(LineString.class.isAssignableFrom(clazz))
{ {
if(value instanceof LineString) if(value instanceof LineString)
return value; return value;
else else
return GeoCreator.LineStringByWKT(value.toString());
return GeoConverter.LineStringByWKT(value.toString());
} }
else if(MultiLineString.class.isAssignableFrom(clazz)) else if(MultiLineString.class.isAssignableFrom(clazz))
{ {
if(value instanceof MultiLineString) if(value instanceof MultiLineString)
return value; return value;
else else
return GeoCreator.MultiLineByWKT(value.toString());
return GeoConverter.MultiLineByWKT(value.toString());
} }
else if(Polygon.class.isAssignableFrom(clazz)) else if(Polygon.class.isAssignableFrom(clazz))
{ {
if(value instanceof Polygon) if(value instanceof Polygon)
return value; return value;
else else
return GeoCreator.PolygonByWKT(value.toString());
return GeoConverter.PolygonByWKT(value.toString());
} }
else if(MultiPolygon.class.isAssignableFrom(clazz)) else if(MultiPolygon.class.isAssignableFrom(clazz))
{ {
if(value instanceof MultiPolygon) if(value instanceof MultiPolygon)
return value; return value;
else else
return GeoCreator.MultiPolygonByWKT(value.toString());
return GeoConverter.MultiPolygonByWKT(value.toString());
} }
else if(LinearRing.class.isAssignableFrom(clazz)) else if(LinearRing.class.isAssignableFrom(clazz))
{ {
if(value instanceof LinearRing) if(value instanceof LinearRing)
return value; return value;
else else
return GeoCreator.LinearRingByWKT(value.toString());
return GeoConverter.LinearRingByWKT(value.toString());
} }
else else
return value; return value;


Loading…
取消
儲存