package com.fd.controller; import com.fd.constant.Command; import com.fd.constant.MsgCode; import com.fd.constant.TypeCode; import com.fd.dto.PageDto; import com.fd.entity.FileEntity; import com.fd.server.CmdServer; import com.fd.server.FileServer; import com.fd.server.VectorServer; import com.fd.util.FileUtils; import com.fd.util.R; import io.swagger.annotations.ApiOperation; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.Date; /** * Created by Owen on 2019/11/12 0012 9:40 * * 矢量数据 */ @Log4j2 @RequestMapping("api/vector") @RestController public class VectorController { @Value("${input.file.path}") private String INPUT_FILE_PATH; @Value("${output.file.path}") private String OUTPUT_FILE_PATH; @Autowired private FileServer fileServer; @Autowired private VectorServer vectorServer; @Autowired private CmdServer cmdServer; // @ApiOperation("上传矢量数据,coord:坐标, directoryName:目录名称") // @PostMapping(value = "upload/{directoryName}/", consumes = { "multipart/form-data" }) // private R upload(@RequestParam("file") MultipartFile file, @PathVariable("directoryName") String directoryName, // @RequestParam(value = "coord",required = false) String coord){ // log.info("run upload"); // return fileServer.uploadFile(file, directoryName, TypeCode.FILE_TYPE_VECTOR); // } @ApiOperation("上传矢量数据,只能上传zip文件,里面的文件名必须跟压缩包一致, coord:坐标(可以为空), 坐标格式:0,0,0,0,0,0,0") @PostMapping(value = "upload", consumes = { "multipart/form-data" }) private R upload(@RequestParam("file") MultipartFile file, @RequestParam(value = "coord",required = false) String coord){ log.info("run upload"); // 文件名全名 String fileName = file.getOriginalFilename(); String s = StringUtils.substringAfterLast(fileName, "."); if (!"zip".equals(s)) { return new R(50007,MsgCode.E50007); } return vectorServer.uploadFile(file, coord); } @ApiOperation("解压zip文件") @GetMapping("unzip/{fileId}/") private R fileUnzip(@PathVariable("fileId") Long fileId) { log.info("run fileUnzip: {}", fileId); FileEntity entity = fileServer.findById(fileId); boolean unzip = FileUtils.unzip(entity.getFileUrl(), INPUT_FILE_PATH); if (!unzip) { log.info("zip error: {}", MsgCode.E51001); return new R(51001, MsgCode.E51001); } String fileName = StringUtils.substringBefore(entity.getFileName(), "."); // 判断文件内容是否跟目录名称一样 String shpPath = INPUT_FILE_PATH + fileName + File.separator + fileName + ".shp"; File file = new File(shpPath); if (!file.exists()) { log.info("zip error: {}", MsgCode.E51002); return new R(51002, MsgCode.E51002); } FileEntity fileEntity = new FileEntity(); // 添加文件夹到数据库 fileEntity.setFileName(fileName); fileEntity.setFileUrl(INPUT_FILE_PATH + fileName); fileEntity.setCreateTime(new Date()); fileEntity.setUpdateTime(new Date()); fileEntity.setType(TypeCode.FILE_TYPE_VECTOR); fileEntity.setCoord(entity.getCoord()); fileEntity = fileServer.save(fileEntity); // xxx.shp到数据库 // String sName = StringUtils.substringAfter(fileName, "_"); // sName = sName + ".shp"; fileEntity = new FileEntity(); // fileEntity.setFileName(sName); // fileEntity.setFileUrl(INPUT_FILE_PATH + fileName + File.separator + sName); fileEntity.setFileName(fileName + ".shp"); fileEntity.setFileUrl(shpPath); fileEntity.setCreateTime(new Date()); fileEntity.setUpdateTime(new Date()); fileEntity.setType(TypeCode.FILE_TYPE_VECTOR); fileEntity.setCoord(entity.getCoord()); fileEntity = fileServer.save(fileEntity); return new R(200, fileEntity); } // @ApiOperation("test") // @PostMapping(value = "test/{directoryName}/", consumes = { "multipart/form-data" }) // private R test(@RequestParam("file") MultipartFile file, @PathVariable("directoryName") String directoryName, @RequestParam(value = "str",required = false) String str){ // log.info("run upload"); // log.info("directoryName: {}", directoryName); // log.info("str: {}", str); // return new R(200, "123"); // } @ApiOperation("获取矢量数据列表") @PostMapping(value = "list") private R list(@RequestBody PageDto param){ log.info("run list"); // return fileServer.findByType(TypeCode.FILE_TYPE_VECTOR, TypeCode.FILE_TYPE_VECTOR_SHP, param); return fileServer.findByType(TypeCode.FILE_TYPE_VECTOR, param); } /** * 删除文件 */ @ApiOperation("删除文件") @GetMapping("delete/{fileId}/") private R deleteFile(@PathVariable("fileId") Long fileId) { log.info("run deleteFile: {}", fileId); return fileServer.deleteById(fileId); } // @ApiOperation("矢量数据判断坐标") // @GetMapping("command/judge/coord/{fileId}/") // private R cmdJudgeCoord(@PathVariable("fileId") Long fileId) { // log.info("run cmdJudgeCoord: {}", fileId); // FileEntity entity = fileServer.findById(fileId); // // String cmd = Command.VECTOR_JUDGE_COORD; // cmd = cmd.replace("@inputFile", entity.getFileUrl()); // log.info("cmd: {}", cmd); // // boolean isJudge = cmdServer.exeCmdJudgeCoord(cmd); // // if (isJudge){ // log.info("need to transform"); // } else { // log.info("not to transform"); // } // // // return new R(200, isJudge); // } @ApiOperation("矢量数据判断坐标") @GetMapping("command/judge/coord/{fileId}/") private R cmdJudgeCoord(@PathVariable("fileId") Long fileId) { log.info("run cmdJudgeCoord: {}", fileId); FileEntity entity = fileServer.findById(fileId); String coord = entity.getCoord(); log.info("coord: {}", coord); // 判断是否需要坐标转换 String cmd = Command.VECTOR_JUDGE_COORD; cmd = cmd.replace("@inputFile", entity.getFileUrl()); log.info("cmd: {}", cmd); Integer isJudge = cmdServer.exeCmdJudgeCoord(cmd); FileEntity fileEntity = null; // 转换坐标 普通坐标转换 if (isJudge == 1000){ // 普通坐标转换 log.info("need to general transform"); if (coord == null) { // 没有坐标参数,执行普通坐标转换(ogrinfo) fileEntity = generalCoordTransform(entity, Command.VECTOR_TRANSFORM_GENERAL); } else { // 有坐标参数,执行严格坐标转换(CGCS2000转wgs80) fileEntity = strictCoordTransform(entity, Command.VECTOR_TRANSFORM_STRICT_WGS80); } } else if (isJudge == 1001) { // 严格坐标转换 (西安80转wgs84),需要参数 log.info("need to strict transform"); if (coord == null) { log.info("error: {}", MsgCode.E50009); return new R(50009, MsgCode.E50009); } fileEntity = strictCoordTransform(entity, Command.VECTOR_TRANSFORM_STRICT_WGS84); } else if (0 == isJudge){ // 不转换坐标 log.info("not to transform"); fileEntity = entity; } else { log.info("error exeCmd"); return new R(50005, MsgCode.E50005); } return new R(200, fileEntity); } @ApiOperation("矢量数据转geojson") @GetMapping("command/geojson/{fileId}/") private R cmdGeojson(@PathVariable("fileId") Long fileId) { log.info("run cmdGeojson: {}", fileId); FileEntity entity = fileServer.findById(fileId); String fileName = StringUtils.substringBefore(entity.getFileName(), "."); // 截取目录名称 String fileUrl = entity.getFileUrl(); String outputFile = StringUtils.substringBefore(fileUrl, "."); outputFile = outputFile + ".json"; String cmd = Command.VECTOR_TO_GEOJSON; cmd = cmd.replace("@inputFile", fileUrl); cmd = cmd.replace("@outputFile", outputFile); log.info("cmd: {}", cmd); Integer integer = cmdServer.exeCmdInt(cmd); if (integer != 0) { return new R(50005, MsgCode.E50005); } FileEntity fileEntity = new FileEntity(); fileEntity.setFileName(fileName + ".json"); fileEntity.setFileUrl(outputFile); fileEntity.setCreateTime(new Date()); fileEntity.setUpdateTime(new Date()); fileEntity.setType(TypeCode.FILE_TYPE_VECTOR); fileEntity = fileServer.save(fileEntity); return new R(200, fileEntity); } @ApiOperation("矢量数据切片") @GetMapping("command/slice/{fileId}/") private R cmdSlice (@PathVariable("fileId") Long fileId) { log.info("run cmdSlice: {}", fileId); FileEntity entity = fileServer.findById(fileId); String fileName = StringUtils.substringBefore(entity.getFileName(), "."); String outputFile = OUTPUT_FILE_PATH + fileName + ".mbtiles"; String cmd = Command.VECTOR_SLICE_TIPPECANOE; cmd = cmd.replace("@inputFile", entity.getFileUrl()); cmd = cmd.replace("@outputFile", outputFile); log.info("cmd: {}", cmd); Integer integer = cmdServer.exeCmdInt(cmd); if (integer != 0) { return new R(50005, MsgCode.E50005); } FileEntity fileEntity = new FileEntity(); fileEntity.setFileName(fileName + ".mbtiles"); fileEntity.setFileUrl(outputFile); fileEntity.setCreateTime(new Date()); fileEntity.setUpdateTime(new Date()); fileEntity.setType(TypeCode.FILE_TYPE_VECTOR); fileEntity = fileServer.save(fileEntity); return new R(200, fileEntity); } // 普通坐标转换 private FileEntity generalCoordTransform(FileEntity entity, String cmd){ String directory = createDirectory(entity); directory = directory + File.separator + entity.getFileName(); cmd = cmd.replace("@inputFile", entity.getFileUrl()); cmd = cmd.replace("@outputFile", directory); log.info("cmd: {}", cmd); return runCmd(cmd, entity, directory); } // 严格坐标转换 private FileEntity strictCoordTransform(FileEntity entity, String cmd){ String directory = createDirectory(entity); directory = directory + File.separator + entity.getFileName(); cmd = cmd.replace("@coord", entity.getCoord()); cmd = cmd.replace("@inputFile", entity.getFileUrl()); cmd = cmd.replace("@outputFile", directory); log.info("cmd: {}", cmd); return runCmd(cmd, entity, directory); } // 创建目录 private String createDirectory(FileEntity entity){ String fileName = StringUtils.substringBeforeLast(entity.getFileName(), "."); String directory = INPUT_FILE_PATH + "transform" + File.separator + fileName; FileUtils.createDir(directory); return directory; } // 执行命令,创建对象 private FileEntity runCmd(String cmd, FileEntity entity, String filePath){ Integer integer = cmdServer.exeCmdInt(cmd); if (integer != 0) { return null; } FileEntity fileEntity = new FileEntity(); fileEntity.setFileName(entity.getFileName()); fileEntity.setFileUrl(filePath); fileEntity.setCreateTime(new Date()); fileEntity.setUpdateTime(new Date()); fileEntity.setType(TypeCode.FILE_TYPE_VECTOR); fileEntity = fileServer.save(fileEntity); return fileEntity; } }