소스 검색

完成了矢量数据判断坐标

wuweihao 5 년 전
부모
커밋
58c98d6918

+ 8 - 1
src/main/java/com/fd/constant/Command.java

@@ -39,9 +39,16 @@ public class Command {
      * 输出文件:@outputFile
      *
      * tippecanoe -zg -o output.mbtiles --force --drop-densest-as-needed --extend-zooms-if-still-dropping input.json
+     * tippecanoe -zg -o /root/gis/cesium/output/clip.mbtiles --force --drop-densest-as-needed --extend-zooms-if-still-dropping /root/gis/cesium/input/vector1/clip.json
      */
-    public static String VECTOR_CUT_TIPPECANOE = "tippecanoe -zg -o @outputFile --force --drop-densest-as-needed --extend-zooms-if-still-dropping @inputFile";
+    public static String VECTOR_SLICE_TIPPECANOE = "tippecanoe -zg -o @outputFile --force --drop-densest-as-needed --extend-zooms-if-still-dropping @inputFile";
 
+    /**
+     * 矢量数据判断坐标
+     * 输入文件:@inputFile
+     */
+    public static String VECTOR_JUDGE_COORD = "docker run --rm -v /root/gis/cesium/input:/root/gis/cesium/input osgeo/gdal " +
+            "ogrinfo -ro -al -so @inputFile";
 
     /**
      * 栅格数据切片命令

+ 101 - 27
src/main/java/com/fd/controller/VectorController.java

@@ -33,6 +33,9 @@ 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;
 
@@ -66,40 +69,79 @@ public class VectorController {
     }
 
 
-    @ApiOperation("矢量数据普通坐标转换")
-    @GetMapping("command/transform/{fileId}/")
-    private R cmdTransform(@PathVariable("fileId") Long fileId) {
-        log.info("run cmdTransform: {}", 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 fileName = StringUtils.substringBefore(entity.getFileName(), ".");
-        // 截取目录名称
-        String fileUrl = entity.getFileUrl();
-        String directoryName = StringUtils.substring(fileUrl, fileUrl.indexOf("input/") + 6, fileUrl.lastIndexOf("/"));
-
-        String cmd = Command.VECTOR_TRANSFORM_OGR2OGR;
-        cmd = cmd.replace("@fileName", fileName);
-        cmd = cmd.replace("@directory", directoryName);
+        // 判断是否需要坐标转换
+        String cmd = Command.VECTOR_JUDGE_COORD;
+        cmd = cmd.replace("@inputFile", entity.getFileUrl());
         log.info("cmd: {}", cmd);
 
-        // 创建个目录,用来存转换后的文件,目录以文件名命名
-        String directoryPath = INPUT_FILE_PATH + "transform" + File.separator + directoryName;
-        FileUtils.createDir(directoryPath);
-
-        Integer integer = cmdServer.exeCmdInt(cmd);
-        if (integer != 0) {
-            return new R(50005, MsgCode.E50005);
+        boolean isJudge = cmdServer.exeCmdJudgeCoord(cmd);
+
+        FileEntity fileEntity = null;
+        // 转换坐标 普通坐标转换
+        if (isJudge){
+            log.info("need to transform");
+
+            String fileName = StringUtils.substringBefore(entity.getFileName(), ".");
+            // 截取目录名称
+            String fileUrl = entity.getFileUrl();
+            String directoryName = StringUtils.substring(fileUrl, fileUrl.indexOf("input/") + 6, fileUrl.lastIndexOf("/"));
+            cmd = Command.VECTOR_TRANSFORM_OGR2OGR;
+            cmd = cmd.replace("@fileName", fileName);
+            cmd = cmd.replace("@directory", directoryName);
+            log.info("cmd: {}", cmd);
+
+            // 创建个目录,用来存转换后的文件,目录以文件名命名
+            String directoryPath = INPUT_FILE_PATH + "transform" + File.separator + directoryName;
+            FileUtils.createDir(directoryPath);
+
+            Integer integer = cmdServer.exeCmdInt(cmd);
+            if (integer != 0) {
+                return new R(50005, MsgCode.E50005);
+            }
+
+            fileEntity = new FileEntity();
+            fileEntity.setFileName(entity.getFileName());
+            fileEntity.setFileUrl(directoryPath + File.separator + entity.getFileName());
+            fileEntity.setCreateTime(new Date());
+            fileEntity.setUpdateTime(new Date());
+            fileEntity.setType(TypeCode.FILE_TYPE_VECTOR_SHP);
+            fileEntity = fileServer.save(fileEntity);
+        } else { // 不转换坐标
+            log.info("not to transform");
+            fileEntity = entity;
         }
 
-        FileEntity shpFile = new FileEntity();
-        shpFile.setFileName(entity.getFileName());
-        shpFile.setFileUrl(directoryPath + File.separator + entity.getFileName());
-        shpFile.setCreateTime(new Date());
-        shpFile.setUpdateTime(new Date());
-        shpFile.setType(TypeCode.FILE_TYPE_VECTOR_SHP);
-        shpFile = fileServer.save(shpFile);
 
-        return new R(200, shpFile);
+        return new R(200, fileEntity);
     }
 
     @ApiOperation("矢量数据转geojson")
@@ -135,4 +177,36 @@ public class VectorController {
 
         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);
+    }
 }

+ 3 - 1
src/main/java/com/fd/server/CmdServer.java

@@ -16,7 +16,9 @@ public interface CmdServer {
 
     R exeCmdOsgb(String cmd, String fileName);
 
-    R exeCmdUnzip(String cmd);
+//    R exeCmdUnzip(String cmd);
 
     Integer exeCmdInt(String cmd);
+
+    boolean exeCmdJudgeCoord(String cmd);
 }

+ 98 - 36
src/main/java/com/fd/server/impl/CmdServerImpl.java

@@ -132,63 +132,125 @@ public class CmdServerImpl implements CmdServer {
 
     }
 
+//    @Override
+//    public R exeCmdUnzip(String commandStr) {
+//        log.info("run exeCmdUnzip");
+//        Integer isCmd = null; // 命令运行结果 1:失败, 0:成功
+//        try {
+//            String[] cmd = new String[]{"/bin/sh", "-c", commandStr};
+//            Process ps = Runtime.getRuntime().exec(cmd);
+//
+////            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
+////            BufferedReader errorBuf = new BufferedReader(new InputStreamReader(ps.getErrorStream()));
+////
+////            StringBuffer sb = new StringBuffer();
+////            StringBuffer errorStr = new StringBuffer();
+//
+//            // error : 坑, 控制台信息是从errorBuf这里出来的
+////            String errorLine;
+////            log.info("run 111111");
+////            while ((errorLine = errorBuf.readLine()) != null) {
+////                log.info("run 2222222");
+////                errorStr.append(errorLine).append("\n");
+////            }
+////            log.info("run 33333333");
+////            log.info("error result: {}", errorStr.toString());
+////
+////            // success ,没有获取到信息
+////            String line;
+////            while ((line = br.readLine()) != null) {
+////                log.info("run 44444444");
+//////                log.info("=====  br.readLine: ======== {}", br.readLine());
+////                //执行结果加上回车
+////                sb.append(line).append("\n");
+////            }
+//
+////            log.info("result: {}", sb.toString());
+//
+//            // 结束命令行
+//            isCmd = ps.waitFor();
+//            log.info("run 5555555");
+//            // 关闭流
+////            br.close();
+////            errorBuf.close();
+//
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//
+//        if (isCmd == 0) {
+//            return new R(200, MsgCode.SUCCESS);
+//        } else {
+//            return new R(200, MsgCode.E50005);
+//        }
+//    }
+
     @Override
-    public R exeCmdUnzip(String commandStr) {
-        log.info("run exeCmdUnzip");
+    public Integer exeCmdInt(String cmd) {
+        Integer isCmd = exeCmdSingle(cmd);
+        return isCmd;
+    }
+
+    /**
+     * 判断坐标
+     * @param
+     * @return
+     */
+    @Override
+    public boolean exeCmdJudgeCoord(String commandStr) {
         Integer isCmd = null; // 命令运行结果 1:失败, 0:成功
+
+        StringBuffer sb = new StringBuffer();
+        StringBuffer errorStr = new StringBuffer();
         try {
             String[] cmd = new String[]{"/bin/sh", "-c", commandStr};
             Process ps = Runtime.getRuntime().exec(cmd);
 
-//            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
-//            BufferedReader errorBuf = new BufferedReader(new InputStreamReader(ps.getErrorStream()));
-//
-//            StringBuffer sb = new StringBuffer();
-//            StringBuffer errorStr = new StringBuffer();
+            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
+            BufferedReader errorBuf = new BufferedReader(new InputStreamReader(ps.getErrorStream()));
 
             // error : 坑, 控制台信息是从errorBuf这里出来的
-//            String errorLine;
-//            log.info("run 111111");
-//            while ((errorLine = errorBuf.readLine()) != null) {
-//                log.info("run 2222222");
-//                errorStr.append(errorLine).append("\n");
-//            }
-//            log.info("run 33333333");
-//            log.info("error result: {}", errorStr.toString());
-//
-//            // success ,没有获取到信息
-//            String line;
-//            while ((line = br.readLine()) != null) {
-//                log.info("run 44444444");
-////                log.info("=====  br.readLine: ======== {}", br.readLine());
-//                //执行结果加上回车
-//                sb.append(line).append("\n");
-//            }
+            String errorLine;
+            while ((errorLine = errorBuf.readLine()) != null) {
+                errorStr.append(errorLine).append("\n");
+            }
+            log.info("error result: {}", errorStr.toString());
 
-//            log.info("result: {}", sb.toString());
+            // success ,没有获取到信息
+            String line;
+            while ((line = br.readLine()) != null) {
+//                log.info("=====  br.readLine: ======== {}", br.readLine());
+                //执行结果加上回车
+                sb.append(line).append("\n");
+            }
+            log.info("result: {}", sb.toString());
 
             // 结束命令行
             isCmd = ps.waitFor();
-            log.info("run 5555555");
+
             // 关闭流
-//            br.close();
-//            errorBuf.close();
+            br.close();
+            errorBuf.close();
 
         } catch (Exception e) {
             e.printStackTrace();
         }
 
+        boolean isJudge = false;
         if (isCmd == 0) {
-            return new R(200, MsgCode.SUCCESS);
-        } else {
-            return new R(200, MsgCode.E50005);
+            log.info("end exeCmd : {}", isCmd);
+            // 判断坐标
+            if (sb.toString().contains("GEOGCS[\"China Geodetic Coordinate System 2000\"")) {
+                // 需要坐标转换
+                isJudge = true;  // 2:
+            }
+            if (sb.toString().contains("GEOGCS[\"WGS 84\"")) {
+                // 不需要坐标转换
+                isJudge = false;
+            }
         }
-    }
 
-    @Override
-    public Integer exeCmdInt(String cmd) {
-        Integer isCmd = exeCmdSingle(cmd);
-        return isCmd;
+        return isJudge;
     }