From b8f2c19b869986efa519f1846b63b11378147861 Mon Sep 17 00:00:00 2001
From: zrj <646384940@qq.com>
Date: Tue, 05 Nov 2024 22:11:27 +0800
Subject: [PATCH] 增加空间数据和基础接口及shp导入导出

---
 src/main/java/org/springblade/modules/yw/mapper/GeomInfoMapper.xml             |   16 +
 src/main/java/org/springblade/common/utils/ZipUtil.java                        |  142 +++++++++++
 src/main/java/org/springblade/modules/yw/service/impl/GeomInfoServiceImpl.java |   77 ++++++
 src/main/java/org/springblade/common/utils/ShapeFileUtil.java                  |   45 ++-
 src/main/java/org/springblade/modules/yw/entity/GeomInfoEntity.java            |   87 +++++++
 src/main/java/org/springblade/common/utils/FileUtil.java                       |   47 +++
 src/main/resources/application-prod.yml                                        |    4 
 src/main/resources/application-test.yml                                        |    4 
 src/main/java/org/springblade/modules/yw/mapper/GeomInfoMapper.java            |   28 ++
 src/main/java/org/springblade/modules/yw/service/IGeomInfoService.java         |   32 ++
 src/main/java/org/springblade/modules/yw/vo/GeomInfoVO.java                    |   18 +
 src/main/java/org/springblade/modules/yw/controller/DownZipController.java     |   60 +++++
 src/main/resources/application-dev.yml                                         |    3 
 src/main/java/org/springblade/modules/yw/controller/GeomInfoController.java    |  120 ++++++++++
 src/main/java/org/springblade/common/constant/FileConstant.java                |   17 +
 15 files changed, 680 insertions(+), 20 deletions(-)

diff --git a/src/main/java/org/springblade/common/constant/FileConstant.java b/src/main/java/org/springblade/common/constant/FileConstant.java
new file mode 100644
index 0000000..f59e474
--- /dev/null
+++ b/src/main/java/org/springblade/common/constant/FileConstant.java
@@ -0,0 +1,17 @@
+package org.springblade.common.constant;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+public class FileConstant {
+
+	/**
+	 * zip 临时保存路径
+	 */
+	@Value("${zip.temp.savePath}")
+	private String zipTempSavePath;
+
+}
diff --git a/src/main/java/org/springblade/common/utils/FileUtil.java b/src/main/java/org/springblade/common/utils/FileUtil.java
new file mode 100644
index 0000000..ca59fbe
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/FileUtil.java
@@ -0,0 +1,47 @@
+package org.springblade.common.utils;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+
+public class FileUtil {
+
+	/**
+	 * MultipartFile 转 file
+	 * @param multipartFile
+	 * @return
+	 */
+	public static File toFile(MultipartFile multipartFile) {
+		// 如果multipartFile为空,则直接返回null
+		if (multipartFile == null) {
+			return null;
+		}
+		// 创建一个临时的文件
+		File file = null;
+		try {
+			file = File.createTempFile("temp", multipartFile.getOriginalFilename());
+			multipartFile.transferTo(file);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return file;
+	}
+
+	/**
+	 * 获取文件后缀
+	 * @param file
+	 * @return
+	 */
+	public static String getFileExtension(MultipartFile file) {
+		String originalFilename = file.getOriginalFilename();
+		String extension = "";
+		if (originalFilename != null) {
+			int dotIndex = originalFilename.lastIndexOf(".");
+			if (dotIndex >= 0) {
+				extension = originalFilename.substring(dotIndex + 1);
+			}
+		}
+		return extension;
+	}
+}
diff --git a/src/main/java/org/springblade/common/utils/ShapeFileUtil.java b/src/main/java/org/springblade/common/utils/ShapeFileUtil.java
index 77242ad..efcb2aa 100644
--- a/src/main/java/org/springblade/common/utils/ShapeFileUtil.java
+++ b/src/main/java/org/springblade/common/utils/ShapeFileUtil.java
@@ -15,6 +15,7 @@
 import org.locationtech.jts.geom.*;
 import org.locationtech.jts.io.ParseException;
 import org.locationtech.jts.io.WKTReader;
+import org.opengis.feature.GeometryAttribute;
 import org.opengis.feature.simple.SimpleFeature;
 import org.opengis.feature.simple.SimpleFeatureType;
 import org.opengis.filter.Filter;
@@ -39,7 +40,10 @@
 	 * @param geomType           geometry类型
 	 * @param saveFolder         导出位置
 	 */
-	private static void exportShp(List<Map<String, Object>> dataPropertiesList, String fileName, String geomType,String saveFolder) {
+	public static void exportShp(List<Map<String, Object>> dataPropertiesList,
+								 String fileName,
+								 String geomType,
+								 String saveFolder) {
 		//创建保存shp文件夹
 		File dir = new File(saveFolder);
 		if (!dir.exists()) {
@@ -194,13 +198,17 @@
 				featureJSON.writeFeature(feature, writer);
 				String temp = writer.toString();
 				JSONObject json = JSONObject.parseObject(temp);
-
+				Object value = feature.getDefaultGeometryProperty().getValue();
 				try {
 					// 空间坐标
-					shpDTO.put("geometry",json.getJSONObject("geometry").getString("coordinates"));
+					shpDTO.put("geometry",value);
 					// 空间类型
 					if (json.getJSONObject("geometry").get("type") != null) {
-						shpDTO.put("geoType",json.getJSONObject("geometry").getString("type"));
+						shpDTO.put("type",json.getJSONObject("geometry").getString("type"));
+					}
+					// 名称
+					if (json.getJSONObject("properties").get("name")!= null) {
+						shpDTO.put("name",json.getJSONObject("properties").getString("name"));
 					}
 					dtoList.add(shpDTO);
 				} catch (NumberFormatException e) {
@@ -220,22 +228,27 @@
 
 	public static void main(String[] args) throws IOException, ParseException {
 //		File file = new File("F:\\test4jdata\\shp\\import\\zrq.zip");
-		File file = new File("F:\\test4jdata\\shp\\export\\test.zip");
+		File file = new File("F:\\test4jdata\\shp\\zip\\test.zip");
 		List<Map<String, Object>> list = shpToGeoJson(file);
 		System.out.println("list = " + list);
 
 		// 导出shp 文件
-		List<Map<String,Object>> propertyList = new ArrayList<>();
-		for (int i = 0; i < 3; i++) {
-			Map<String,Object> map = new HashMap<>();
-			map.put("ID", i);
-			map.put("名称", "test" + i);
-			map.put("描述", "测试shp导出" + i);
-			map.put("geometry", "MULTILINESTRING ((114.0888763800001 22.549298400000055, 114.0897166200001 22.54931240800005, 114.09006708000004 22.549318250000056, 114.09104754000009 22.549328150000065))");
-			propertyList.add(map);
-		}
-		String exportPath = "F:\\test4jdata\\shp\\export\\";
-		exportShp(propertyList, "test", "MultiLineString",exportPath);
+//		List<Map<String,Object>> propertyList = new ArrayList<>();
+//		for (int i = 0; i < 3; i++) {
+//			Map<String,Object> map = new HashMap<>();
+//			map.put("ID", i);
+//			map.put("名称", "test" + i);
+//			map.put("描述", "测试shp导出" + i);
+//			map.put("geometry", "MULTILINESTRING ((114.0888763800001 22.549298400000055, 114.0897166200001 22.54931240800005, 114.09006708000004 22.549318250000056, 114.09104754000009 22.549328150000065))");
+//			propertyList.add(map);
+//		}
+//		String exportPath = "F:\\test4jdata\\shp\\export\\";
+//		exportShp(propertyList, "test", "MultiLineString",exportPath);
+//		// 打包成 zip 包,然后导出
+//		String zipPath = "F:\\test4jdata\\shp\\zip\\test.zip";
+//		boolean folder = ZipUtil.zipFolder(exportPath, zipPath);
+		// 打包成功后导出
+
 	}
 
 	public static double[] getLongitudeLatitude(Geometry wktPoint) throws ParseException {
diff --git a/src/main/java/org/springblade/common/utils/ZipUtil.java b/src/main/java/org/springblade/common/utils/ZipUtil.java
index 165ce93..eb9c1d3 100644
--- a/src/main/java/org/springblade/common/utils/ZipUtil.java
+++ b/src/main/java/org/springblade/common/utils/ZipUtil.java
@@ -1,8 +1,13 @@
 package org.springblade.common.utils;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.context.annotation.Configuration;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.net.URLEncoder;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -81,7 +86,12 @@
         return list;
     }
 
-    // 定义一个公共的静态方法zipFolder,用于压缩文件夹
+	/**
+	 * 压缩文件夹
+	 * @param sourceFolderPath 压缩文件路径
+	 * @param zipFilePath 压缩后包的路径
+	 * @return
+	 */
     public static boolean zipFolder(String sourceFolderPath, String zipFilePath) {
         File sourceFile = new File(sourceFolderPath);
         try (
@@ -96,8 +106,48 @@
         return false;
     }
 
-    // 将文件夹整体压缩
-    private static void zipFile(File fileToZip, String fileName, ZipOutputStream zos) throws IOException {
+	/**
+	 * 压缩文件夹
+	 * @param sourceFolderPath 压缩文件路径
+	 * @param zos zip输出流
+	 * @return
+	 */
+    public static boolean zipFolder(String sourceFolderPath,ZipOutputStream zos) {
+        File sourceFile = new File(sourceFolderPath);
+		try {
+			zipFile(sourceFile, sourceFile.getName(), zos);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}finally {
+			// 删除生成的文件
+			deleteDirectory(sourceFile);
+		}
+		return false;
+    }
+
+	/**
+	 * 删除文件夹下文件
+	 * @param directoryToBeDeleted
+	 * @return
+	 */
+	public static boolean deleteDirectory(File directoryToBeDeleted) {
+		File[] allContents = directoryToBeDeleted.listFiles();
+		if (allContents != null) {
+			for (File file : allContents) {
+				deleteDirectory(file);
+			}
+		}
+		return directoryToBeDeleted.delete();
+	}
+
+	/**
+	 * 将文件夹整体压缩
+	 * @param fileToZip
+	 * @param fileName 文件名称
+	 * @param zos
+	 * @throws IOException
+	 */
+	public static void zipFile(File fileToZip, String fileName, ZipOutputStream zos) throws IOException {
         if (fileToZip.isHidden()) {
             return;
         }
@@ -126,7 +176,91 @@
         fis.close();
     }
 
-    public static void main(String[] args) {
+	/**
+	 * 设置导出zip的响应格式
+	 *
+	 * @param request
+	 * @param response
+	 * @param fileZip  zip的名字
+	 * @param filePath zip的路径
+	 * @throws UnsupportedEncodingException
+	 */
+	public static void downLoadFile(HttpServletRequest request, HttpServletResponse response, String fileZip, String filePath) throws UnsupportedEncodingException {
+		//进行浏览器下载
+		final String userAgent = request.getHeader("USER-AGENT");
+		//判断浏览器代理并分别设置响应给浏览器的编码格式
+		String finalFileName = null;
+		if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
+			// IE浏览器
+			finalFileName = URLEncoder.encode(fileZip, "UTF8");
+			System.out.println("IE浏览器");
+		} else if (StringUtils.contains(userAgent, "Mozilla")) {
+			// google,火狐浏览器
+			finalFileName = new String(fileZip.getBytes(), "ISO8859-1");
+		} else {
+			// 其他浏览器
+			finalFileName = URLEncoder.encode(fileZip, "UTF8");
+		}
+		// 告知浏览器下载文件,而不是直接打开,浏览器默认为打开
+		response.setContentType("application/x-download");
+		// 下载文件的名称
+		response.setHeader("Content-Disposition", "attachment;filename=\"" + finalFileName + "\"");
+
+		ServletOutputStream servletOutputStream = null;
+		try {
+			servletOutputStream = response.getOutputStream();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		DataOutputStream temps = new DataOutputStream(
+			servletOutputStream);
+		// 浏览器下载文件的路径
+		DataInputStream in = null;
+		try {
+			in = new DataInputStream(
+				new FileInputStream(filePath));
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		}
+		byte[] b = new byte[2048];
+		// 之后用来删除临时压缩文件
+		File reportZip = new File(filePath);
+		try {
+			while ((in.read(b)) != -1) {
+				temps.write(b);
+			}
+			temps.flush();
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (temps != null) {
+				try {
+					temps.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (in != null) {
+				try {
+					in.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (reportZip != null) {
+				// 删除服务器本地产生的临时压缩文件!
+				reportZip.delete();
+			}
+			try {
+				servletOutputStream.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+
+	public static void main(String[] args) {
         // 调用方法进行测试
     }
 }
diff --git a/src/main/java/org/springblade/modules/yw/controller/DownZipController.java b/src/main/java/org/springblade/modules/yw/controller/DownZipController.java
new file mode 100644
index 0000000..42c6c42
--- /dev/null
+++ b/src/main/java/org/springblade/modules/yw/controller/DownZipController.java
@@ -0,0 +1,60 @@
+package org.springblade.modules.yw.controller;
+
+import lombok.AllArgsConstructor;
+import org.springblade.common.constant.FileConstant;
+import org.springblade.common.utils.ShapeFileUtil;
+import org.springblade.common.utils.ZipUtil;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+@AllArgsConstructor
+@RequestMapping("/yw/downZip")
+@RestController
+public class DownZipController {
+
+	private final FileConstant fileConstant;
+
+	/**
+	 * 导出指定文件夹下文件(压缩成zip)
+	 * @param response
+	 * @throws IOException
+	 */
+	@GetMapping("/download-folder-as-zip")
+	public void downloadFolderAsZip(HttpServletResponse response) throws IOException {
+		// 要导出的文件夹路径
+		String sourceFolderPath = fileConstant.getZipTempSavePath();
+		// 先生成文件
+		List<Map<String,Object>> propertyList = new ArrayList<>();
+		for (int i = 0; i < 3; i++) {
+			Map<String,Object> map = new HashMap<>();
+			map.put("ID", i);
+			map.put("名称", "test" + i);
+			map.put("描述", "测试shp导出" + i);
+			map.put("geometry", "MULTILINESTRING ((114.0888763800001 22.549298400000055, 114.0897166200001 22.54931240800005, 114.09006708000004 22.549318250000056, 114.09104754000009 22.549328150000065))");
+			propertyList.add(map);
+		}
+		// 导出shp 文件
+		ShapeFileUtil.exportShp(propertyList, "test", "MultiLineString",sourceFolderPath);
+		// ZIP文件名
+		String zipFileName = "exported_folder.zip";
+		response.setContentType("application/zip");
+		response.setHeader("Content-Disposition", "attachment; filename=\"" + zipFileName + "\"");
+		try (
+			BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
+			ZipOutputStream zipOut = new ZipOutputStream(bos);
+		) {
+			ZipUtil.zipFolder(sourceFolderPath, zipOut);
+		}
+	}
+}
diff --git a/src/main/java/org/springblade/modules/yw/controller/GeomInfoController.java b/src/main/java/org/springblade/modules/yw/controller/GeomInfoController.java
new file mode 100644
index 0000000..8f7ab8a
--- /dev/null
+++ b/src/main/java/org/springblade/modules/yw/controller/GeomInfoController.java
@@ -0,0 +1,120 @@
+package org.springblade.modules.yw.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.yw.entity.GeomInfoEntity;
+import org.springblade.modules.yw.service.IGeomInfoService;
+import org.springblade.modules.yw.vo.GeomInfoVO;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import springfox.documentation.annotations.ApiIgnore;
+import javax.validation.Valid;
+import java.util.Map;
+
+/**
+ * 空间信息表 控制器
+ *
+ * @author BladeX
+ * @since 2024-11-05
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("yw/geomInfo")
+@Api(value = "空间信息表", tags = "空间信息表接口")
+public class GeomInfoController {
+
+	private final IGeomInfoService geomInfoService;
+
+	/**
+	 * 空间信息表 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入geomInfo")
+	public R detail(GeomInfoEntity geomInfo) {
+		GeomInfoEntity detail = geomInfoService.getOne(Condition.getQueryWrapper(geomInfo));
+		return R.data(detail);
+	}
+	/**
+	 * 空间信息表 分页
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入geomInfo")
+	public R<IPage> list(@ApiIgnore @RequestParam Map<String, Object> geomInfo, Query query) {
+		IPage<GeomInfoEntity> pages = geomInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(geomInfo, GeomInfoEntity.class));
+		return R.data(pages);
+	}
+
+	/**
+	 * 空间信息表 自定义分页
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入geomInfo")
+	public R<IPage<GeomInfoVO>> page(GeomInfoVO geomInfo, Query query) {
+		IPage<GeomInfoVO> pages = geomInfoService.selectGeomInfoPage(Condition.getPage(query), geomInfo);
+		return R.data(pages);
+	}
+
+	/**
+	 * 空间信息表 新增
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入geomInfo")
+	public R save(@Valid @RequestBody GeomInfoEntity geomInfo) {
+		return R.status(geomInfoService.save(geomInfo));
+	}
+
+	/**
+	 * 空间信息表 修改
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入geomInfo")
+	public R update(@Valid @RequestBody GeomInfoEntity geomInfo) {
+		return R.status(geomInfoService.updateById(geomInfo));
+	}
+
+	/**
+	 * 空间信息表 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入geomInfo")
+	public R submit(@Valid @RequestBody GeomInfoEntity geomInfo) {
+		return R.status(geomInfoService.saveOrUpdate(geomInfo));
+	}
+
+	/**
+	 * 空间信息表 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(geomInfoService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 导入 shp zip 包文件解析空间信息
+	 * @param file
+	 * @return
+	 */
+	@PostMapping("/importShpZip")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "导入 shp zip 包文件解析空间信息", notes = "传入文件")
+	public R importShpZip(MultipartFile file) {
+		return geomInfoService.importShpZip(file);
+	}
+
+}
diff --git a/src/main/java/org/springblade/modules/yw/entity/GeomInfoEntity.java b/src/main/java/org/springblade/modules/yw/entity/GeomInfoEntity.java
new file mode 100644
index 0000000..1d99d80
--- /dev/null
+++ b/src/main/java/org/springblade/modules/yw/entity/GeomInfoEntity.java
@@ -0,0 +1,87 @@
+package org.springblade.modules.yw.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 空间信息表 实体类
+ *
+ * @author BladeX
+ * @since 2024-11-05
+ */
+@Data
+@TableName("yw_geom_info")
+@ApiModel(value = "GeomInfo对象", description = "空间信息表")
+public class GeomInfoEntity implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键id
+	 */
+	@ApiModelProperty(value = "主键ID", example = "")
+	@TableId(value = "id",type = IdType.ASSIGN_ID)
+	private Long id;
+
+	/**
+	 * 名称
+	 */
+	@ApiModelProperty(value = "名称")
+	private String name;
+
+	/**
+	 * 空间类型
+	 */
+	@ApiModelProperty(value = "空间类型")
+	private String type;
+
+	/**
+	 * 空间信息
+	 */
+	@ApiModelProperty(value = "空间信息")
+	private String geom;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人", example = "")
+	@TableField(value = "create_user", fill = FieldFill.INSERT)
+	private Long createUser;
+
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "create_time", fill = FieldFill.INSERT)
+	private Date createTime;
+
+	/**
+	 * 更新人
+	 */
+	@ApiModelProperty(value = "更新人", example = "")
+	@TableField("update_user")
+	private Long updateUser;
+
+	/**
+	 * 更新人时间
+	 */
+	@ApiModelProperty(value = "更新人时间", example = "")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField(value = "update_time", fill = FieldFill.INSERT)
+	private Date updateTime;
+
+	/**
+	 * 是否删除 0:否  1:是
+	 */
+	@ApiModelProperty(value = "是否删除 0:否  1:是", example = "")
+	@TableField("is_deleted")
+	@TableLogic
+	private Integer isDeleted;
+
+}
diff --git a/src/main/java/org/springblade/modules/yw/mapper/GeomInfoMapper.java b/src/main/java/org/springblade/modules/yw/mapper/GeomInfoMapper.java
new file mode 100644
index 0000000..23d7509
--- /dev/null
+++ b/src/main/java/org/springblade/modules/yw/mapper/GeomInfoMapper.java
@@ -0,0 +1,28 @@
+package org.springblade.modules.yw.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.modules.yw.entity.GeomInfoEntity;
+import org.springblade.modules.yw.vo.GeomInfoVO;
+import java.util.List;
+
+/**
+ * 空间信息表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-11-05
+ */
+public interface GeomInfoMapper extends BaseMapper<GeomInfoEntity> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param geomInfo
+	 * @return
+	 */
+	List<GeomInfoVO> selectGeomInfoPage(IPage page, GeomInfoVO geomInfo);
+
+	int saveGeoInfo(@Param("geomInfoEntity") GeomInfoEntity geomInfoEntity);
+}
diff --git a/src/main/java/org/springblade/modules/yw/mapper/GeomInfoMapper.xml b/src/main/java/org/springblade/modules/yw/mapper/GeomInfoMapper.xml
new file mode 100644
index 0000000..8c7a923
--- /dev/null
+++ b/src/main/java/org/springblade/modules/yw/mapper/GeomInfoMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.modules.yw.mapper.GeomInfoMapper">
+
+    <!--自定义分页查询-->
+    <select id="selectGeomInfoPage" resultType="org.springblade.modules.yw.vo.GeomInfoVO">
+        select * from yw_geom_info where is_deleted = 0
+    </select>
+
+    <!--保存空间信息-->
+    <insert id="saveGeoInfo">
+        insert into yw_geom_info (name,type,geom)
+        values (#{geomInfoEntity.name},#{geomInfoEntity.type},ST_GeomFromText(${geomInfoEntity.geom}))
+    </insert>
+
+</mapper>
diff --git a/src/main/java/org/springblade/modules/yw/service/IGeomInfoService.java b/src/main/java/org/springblade/modules/yw/service/IGeomInfoService.java
new file mode 100644
index 0000000..cafa431
--- /dev/null
+++ b/src/main/java/org/springblade/modules/yw/service/IGeomInfoService.java
@@ -0,0 +1,32 @@
+package org.springblade.modules.yw.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.yw.entity.GeomInfoEntity;
+import org.springblade.modules.yw.vo.GeomInfoVO;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 空间信息表 服务类
+ *
+ * @author zhongrj
+ * @since 2024-11-05
+ */
+public interface IGeomInfoService extends IService<GeomInfoEntity> {
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param geomInfo
+	 * @return
+	 */
+	IPage<GeomInfoVO> selectGeomInfoPage(IPage<GeomInfoVO> page, GeomInfoVO geomInfo);
+
+	/**
+	 * 导入 shp zip 包文件解析空间信息
+	 * @param file
+	 * @return
+	 */
+	R importShpZip(MultipartFile file);
+}
diff --git a/src/main/java/org/springblade/modules/yw/service/impl/GeomInfoServiceImpl.java b/src/main/java/org/springblade/modules/yw/service/impl/GeomInfoServiceImpl.java
new file mode 100644
index 0000000..8b77059
--- /dev/null
+++ b/src/main/java/org/springblade/modules/yw/service/impl/GeomInfoServiceImpl.java
@@ -0,0 +1,77 @@
+package org.springblade.modules.yw.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.geotools.geojson.geom.GeometryJSON;
+import org.geotools.geometry.jts.WKBReader;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.io.ParseException;
+import org.springblade.common.utils.FileUtil;
+import org.springblade.common.utils.ShapeFileUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.yw.entity.GeomInfoEntity;
+import org.springblade.modules.yw.mapper.GeomInfoMapper;
+import org.springblade.modules.yw.service.IGeomInfoService;
+import org.springblade.modules.yw.vo.GeomInfoVO;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 空间信息表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-11-05
+ */
+@Service
+public class GeomInfoServiceImpl extends ServiceImpl<GeomInfoMapper, GeomInfoEntity> implements IGeomInfoService {
+
+	/**
+	 * 自定义分页
+	 * @param page
+	 * @param geomInfo
+	 * @return
+	 */
+	@Override
+	public IPage<GeomInfoVO> selectGeomInfoPage(IPage<GeomInfoVO> page, GeomInfoVO geomInfo) {
+		return page.setRecords(baseMapper.selectGeomInfoPage(page, geomInfo));
+	}
+
+	/**
+	 * 导入 shp zip 包文件解析空间信息
+	 * @param multipartFile
+	 * @return
+	 */
+	@Override
+	public R importShpZip(MultipartFile multipartFile) {
+		// 判断文件是否为 zip 文件
+		if (!FileUtil.getFileExtension(multipartFile).equals("zip")){
+			return R.data(400,"文件格式不对,必须是 zip 文件","文件格式不对,必须是 zip 文件");
+		}
+		// 转 file
+		File file = FileUtil.toFile(multipartFile);
+		// 获取文件信息
+		try {
+			List<Map<String, Object>> list = ShapeFileUtil.shpToGeoJson(file);
+			// 写入数据库,暂时考虑只有一组数据的情况
+			if (list.size()>0){
+				Map<String, Object> map = list.get(0);
+				GeomInfoEntity geomInfoEntity = Objects.requireNonNull(BeanUtil.copy(map, GeomInfoEntity.class));
+				String geometry = map.get("geometry").toString();
+				geomInfoEntity.setGeom("'" + geometry +"'");
+				// 保存
+				baseMapper.saveGeoInfo(geomInfoEntity);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		// 返回
+		return R.data(200,"操作成功","操作成功");
+	}
+}
diff --git a/src/main/java/org/springblade/modules/yw/vo/GeomInfoVO.java b/src/main/java/org/springblade/modules/yw/vo/GeomInfoVO.java
new file mode 100644
index 0000000..e1e8d78
--- /dev/null
+++ b/src/main/java/org/springblade/modules/yw/vo/GeomInfoVO.java
@@ -0,0 +1,18 @@
+package org.springblade.modules.yw.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.yw.entity.GeomInfoEntity;
+
+/**
+ * 空间信息表 视图实体类
+ *
+ * @author BladeX
+ * @since 2024-11-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class GeomInfoVO extends GeomInfoEntity {
+	private static final long serialVersionUID = 1L;
+
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 7663bcc..6544447 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -56,3 +56,6 @@
     upload-domain: http://localhost:8999
     remote-path: /usr/share/nginx/html
 
+zip:
+  temp:
+    savePath: F:\\test4jdata\\shp\\export\\
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 024d64f..d6394ec 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -38,3 +38,7 @@
     remote-mode: true
     upload-domain: http://localhost:8999
     remote-path: /usr/share/nginx/html
+
+zip:
+  temp:
+    savePath: /home/temp
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 3560e48..0e0c088 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -38,3 +38,7 @@
     remote-mode: true
     upload-domain: http://localhost:8999
     remote-path: /usr/share/nginx/html
+
+zip:
+  temp:
+    savePath: /home/temp

--
Gitblit v1.9.3