Procházet zdrojové kódy

完成model 模块

wuweihao před 5 roky
rodič
revize
62c7d2b17f

+ 3 - 0
README.md

@@ -8,5 +8,8 @@
     
     /root/java/apache-tomcat-8.5.47_8082_cesium
     
+    俊波前端:
+    /var/www/html/3dmap
+    
     
 linux 命令不会自动创建目录,云行是记得检查目录是否创建

+ 7 - 0
pom.xml

@@ -71,6 +71,13 @@
             <version>${lang3.version}</version>
         </dependency>
 
+        <!-- Alibaba fastjson-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.47</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 12 - 3
src/main/java/com/fd/constant/Command.java

@@ -12,7 +12,8 @@ public class Command {
      * 输入目录:/root/gis/cesium/input/@fileName fileName:是目录名
      * 输出目录:/root/gis/cesium/output/@fileName fileName:是目录名
      */
-    public static String MODEL_SLICE_OSGB = "/opt/3dtiles_v1/target/release/3dtile -f osgb -i /root/gis/cesium/input/@fileName -o /root/gis/cesium/output/@fileName";
+//    public static String MODEL_SLICE_OSGB = "/opt/3dtiles_v1/target/release/3dtile -f osgb -i /root/gis/cesium/input/@fileName -o /root/gis/cesium/output/@fileName";
+    public static String MODEL_SLICE_OSGB = "/opt/3dtiles_v1/target/release/3dtile -f osgb -i @inputFile -o @outputFile";
 
     /**
      * 矢量数据 坐标转换(普通转换,2000转wgs84)
@@ -78,8 +79,16 @@ public class Command {
      *
      *
      */
-    public static String RASTER_SLICE_OSGEO  = "docker run --rm -v /root/gis/cesium/input:/root/gis/cesium/input " +
-            "osgeo/gdal python3 /usr/bin/gdal2tiles.py --zoom=9-19 --processes=6 @filePath /root/gis/cesium/input/@fileName";
+//    public static String RASTER_SLICE_OSGEO  = "docker run --rm -v /root/gis/cesium/input:/root/gis/cesium/input " +
+//            "osgeo/gdal python3 /usr/bin/gdal2tiles.py --zoom=9-19 --processes=6 @filePath /root/gis/cesium/input/@fileName";
+
+    /**
+     * 输入文件: @inputFile
+     * 输出文件: @outputFile
+     *
+     */
+    public static String RASTER_SLICE_OSGEO  = "docker run --rm -v /root/gis/cesium:/root/gis/cesium " +
+            "osgeo/gdal python3 /usr/bin/gdal2tiles.py --zoom=9-19 --processes=6 @inputFile @outputFile";
 
 
 

+ 46 - 33
src/main/java/com/fd/controller/FdModelController.java

@@ -6,8 +6,11 @@ import com.fd.constant.TypeCode;
 import com.fd.dto.PageDto;
 import com.fd.dto.MyQueue;
 import com.fd.entity.FileEntity;
+import com.fd.entity.FileSchedule;
+import com.fd.entity.OutputFileEntity;
 import com.fd.server.CmdServer;
 import com.fd.server.FileServer;
+import com.fd.server.ModelServer;
 import com.fd.util.FileUtils;
 import com.fd.util.R;
 import io.swagger.annotations.ApiOperation;
@@ -48,6 +51,9 @@ public class FdModelController {
     @Autowired
     private CmdServer cmdServer;
 
+    @Autowired
+    private ModelServer modelServer;
+
     // 队列
     BlockingQueue<String> queue = new LinkedBlockingQueue<String>(5);
 
@@ -64,10 +70,6 @@ public class FdModelController {
     @PostConstruct
     private void init() {
 
-        // 多线程运行切片
-//        new Thread(new ModelSliceThread(cmd, fileEntity)).start();
-        // 多线程消费队列
-//        new Thread(new ConsumerThread()).start();
 
         new Thread(new modelSliceConsumerThread(modelQueue)).start();
 
@@ -130,16 +132,18 @@ public class FdModelController {
                         log.info("消费者,拿到队列中的数据data:" + data.toString());
 
                         Integer integer = cmdServer.exeCmdModelSlice(data.getStr());
-                        FileEntity obj =(FileEntity) data.getObj();
+                        OutputFileEntity obj = data.getOutputFile();
 
                         if (integer != 0) {
                             log.info("error command exeCmdModelSlice");
                             // 如果命令运行失败,删除刚才创建的实体类
-                            fileServer.deleteById(obj.getId());
+                            // o:代表切片失败
+                            obj.setStatus(0);
+                            modelServer.save(obj);
                             return;
                         }
                     }
-                    Thread.sleep(4000);
+//                    Thread.sleep(4000);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
@@ -221,8 +225,7 @@ public class FdModelController {
         if (!"zip".equals(s)) {
             return new R(50007, MsgCode.E50007);
         }
-
-        return fileServer.uploadBigFile(file, TypeCode.FILE_TYPE_MODEL);
+        return modelServer.uploadBigFile(file);
     }
 
 
@@ -230,35 +233,38 @@ public class FdModelController {
     @GetMapping("unzip/{fileId}/")
     private R fileUnzip(@PathVariable("fileId") Long fileId) {
         log.info("run fileUnzip: {}", fileId);
-        FileEntity entity = fileServer.findById(fileId);
+//        FileEntity entity = fileServer.findById(fileId);
+        OutputFileEntity entity = modelServer.findById(fileId);
+
+        FileEntity uploadFiel = fileServer.findById(entity.getUploadId());
+
 
-        boolean unzip = FileUtils.unzip(entity.getFileUrl(), INPUT_FILE_PATH);
+        String outputPath = OUTPUT_FILE_PATH + "unzip";
+        FileUtils.createDir(outputPath);
+
+        boolean unzip = FileUtils.unzip(uploadFiel.getFileUrl(), outputPath);
 
         if (!unzip) {
             log.info("zip error: {}", MsgCode.E51001);
             return new R(50001, MsgCode.E51001);
         }
 
-        String fileName = StringUtils.substringBefore(entity.getFileName(), ".");
+        String fileName = StringUtils.substringBeforeLast(entity.getFileName(), ".");
 
-        FileEntity fileEntity = new FileEntity();
+        entity.setStatus(4);
+        entity.setUpdateTime(new Date());
+        entity.setUnZipPath(outputPath + File.separator + fileName);
 
-        fileEntity.setFileName(fileName);
-        fileEntity.setFileUrl(INPUT_FILE_PATH + File.separator + fileName);
-        fileEntity.setCreateTime(new Date());
-        fileEntity.setUpdateTime(new Date());
-        fileEntity.setType(TypeCode.FILE_TYPE_MODEL);
-        fileEntity.setStatus(4);
-        fileEntity = fileServer.save(fileEntity);
+        entity = modelServer.save(entity);
 
-        return new R(200, fileEntity);
+        return new R(200, entity);
     }
 
     @ApiOperation("获取3D模型数据列表")
     @PostMapping(value = "list")
     private R list(@RequestBody PageDto param) {
         log.info("run list");
-        return fileServer.findByType(TypeCode.FILE_TYPE_MODEL, param);
+        return modelServer.findByType(TypeCode.FILE_TYPE_MODEL, param);
     }
 
     /**
@@ -277,25 +283,32 @@ public class FdModelController {
     private R cmdModelSlice(@PathVariable("fileId") Long fileId) {
         log.info("run cmdModelSlice: {}", fileId);
 
-        FileEntity entity = fileServer.findById(fileId);
+//        FileEntity entity = fileServer.findById(fileId);
+        OutputFileEntity entity = modelServer.findById(fileId);
+
+
+        String fileName = StringUtils.substringBeforeLast(entity.getFileName(), ".");
+        String outputPath = OUTPUT_FILE_PATH + "model";
+        FileUtils.createDir(outputPath);
+
+        outputPath = outputPath + File.separator + fileName;
         // 传入的是目录
         String cmd = Command.MODEL_SLICE_OSGB;
-        cmd = cmd.replace("@fileName", entity.getFileName());
+        cmd = cmd.replace("@inputFile", entity.getUnZipPath());
+        cmd = cmd.replace("@outputFile", outputPath);
         log.info("cmd: {}", cmd);
 
         // 命令产生的是文件夹
-        FileEntity fileEntity = new FileEntity();
-        fileEntity.setFileName(entity.getFileName());
-        fileEntity.setFileUrl(OUTPUT_FILE_PATH + entity.getFileName());
-        fileEntity.setCreateTime(new Date());
-        fileEntity.setUpdateTime(new Date());
-        fileEntity.setStatus(5);
+        entity.setStatus(5);
+        entity.setUpdateTime(new Date());
+        entity.setSlicePath(outputPath);
+
+        entity = modelServer.save(entity);
 
-        fileEntity = fileServer.save(fileEntity);
 
         // 把数据放入队列中
         MyQueue data = new MyQueue();
-        data.setObj(fileEntity);
+        data.setOutputFile(entity);
         data.setStr(cmd);
         try {
             modelQueue.offer(data, 1, TimeUnit.SECONDS);
@@ -304,7 +317,7 @@ public class FdModelController {
             e.printStackTrace();
         }
 
-        return new R(200, fileEntity);
+        return new R(200, entity);
 
     }
 

+ 55 - 5
src/main/java/com/fd/controller/RasterController.java

@@ -3,10 +3,13 @@ package com.fd.controller;
 import com.fd.constant.Command;
 import com.fd.constant.MsgCode;
 import com.fd.constant.TypeCode;
+import com.fd.dto.MyQueue;
 import com.fd.dto.PageDto;
 import com.fd.entity.FileEntity;
 import com.fd.server.CmdServer;
 import com.fd.server.FileServer;
+import com.fd.server.RasterServer;
+import com.fd.util.FileUtils;
 import com.fd.util.R;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.log4j.Log4j2;
@@ -16,9 +19,12 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.PostConstruct;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
 
 /**
  * Created by Owen on 2019/11/12 0012 9:40
@@ -33,12 +39,37 @@ public class RasterController {
     @Value("${input.file.path}")
     private String INPUT_FILE_PATH;
 
+    @Value("${output.file.path}")
+    private String OUTPUT_FILE_PATH;
+
     @Autowired
     private FileServer fileServer;
 
     @Autowired
     private CmdServer cmdServer;
 
+    @Autowired
+    private RasterServer rasterServer;
+
+    BlockingQueue<MyQueue> sliceQueue = new LinkedBlockingQueue<MyQueue>(5);
+
+    BlockingQueue<MyQueue> coordQueue = new LinkedBlockingQueue<MyQueue>(5);
+
+
+    /**
+     * 初始化队列
+     *
+     * @return
+     */
+    @PostConstruct
+    private void init() {
+
+        // 消费队列
+//        new Thread(new FdModelController.modelSliceConsumerThread(modelQueue)).start();
+
+    }
+
+
 
     @ApiOperation("上传栅格数据,只能上传tif文件")
     @PostMapping(value = "upload", consumes = { "multipart/form-data" })
@@ -107,12 +138,17 @@ public class RasterController {
         log.info("run cmdOsgeo: {}", fileId);
         FileEntity entity = fileServer.findById(fileId);
 
-        String fileName = StringUtils.substringBefore(entity.getFileName(), ".");
+        String fileName = StringUtils.substringBeforeLast(entity.getFileName(), ".");
         // fileName_tiles
-        fileName = fileName + "_tiles";
+//        fileName = fileName + "_tiles";
+
+        String outFilePath = OUTPUT_FILE_PATH + "tiles" + File.separator + fileName;
+        FileUtils.createDir(outFilePath);
+
+
         String cmd = Command.RASTER_SLICE_OSGEO;
-        cmd = cmd.replace("@filePath", entity.getFileUrl());
-        cmd = cmd.replace("@fileName",fileName);
+        cmd = cmd.replace("@inputFile", entity.getFileUrl());
+        cmd = cmd.replace("@outputFile", outFilePath);
         log.info("cmd: {}", cmd);
 
 
@@ -122,7 +158,9 @@ public class RasterController {
         fileEntity.setCreateTime(new Date());
         fileEntity.setUpdateTime(new Date());
         fileEntity.setType(TypeCode.FILE_TYPE_RASTER);
-        fileEntity.setStatus(5);
+        // 设个默认经度给前端显示
+        fileEntity.setProgress(1);
+        fileEntity.setStatus(6);
 
         fileEntity = fileServer.save(fileEntity);
 
@@ -154,6 +192,10 @@ public class RasterController {
                 fileServer.deleteById(entity.getId());
                 return;
             }
+
+            // 修改状态, 告诉前端切片完成
+            entity.setStatus(5);
+            fileServer.save(entity);
             log.warn("end RasterSliceThread");
         }
     }
@@ -167,6 +209,14 @@ public class RasterController {
     }
 
 
+    @ApiOperation("移动数据到服务器上")
+    @GetMapping("move/{fileId}/")
+    private R moveFile(@PathVariable("fileId") Long fileId) {
+        log.info("run moveFile: {}", fileId);
+        return rasterServer.moveFileToServer(fileId);
+    }
+
+
     // 严格坐标转换
     private FileEntity cmdTansformGdalwarpStrict(Long fileId){
         log.info("run cmdTansformGdalwarpStrict: {}", fileId);

+ 11 - 0
src/main/java/com/fd/controller/VectorController.java

@@ -74,6 +74,17 @@ public class VectorController {
     }
 
 
+    @ApiOperation("上传矢量数据,里面的文件名必须跟压缩包一致, coord:坐标(可以为空), 坐标格式:0,0,0,0,0,0,0")
+    @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 uploadVector");
+        return vectorServer.uploadDirectoryFile(file, directoryName, coord);
+    }
+
+
+
     @ApiOperation("解压zip文件")
     @GetMapping("unzip/{fileId}/")
     private R fileUnzip(@PathVariable("fileId") Long fileId) {

+ 4 - 1
src/main/java/com/fd/dto/MyQueue.java

@@ -1,5 +1,8 @@
 package com.fd.dto;
 
+import com.fd.entity.FileEntity;
+import com.fd.entity.FileSchedule;
+import com.fd.entity.OutputFileEntity;
 import lombok.Data;
 
 /**
@@ -10,7 +13,7 @@ import lombok.Data;
 @Data
 public class MyQueue {
 
-    private Object obj;
+    private OutputFileEntity outputFile;
 
     private String str;
 }

+ 2 - 0
src/main/java/com/fd/entity/FileEntity.java

@@ -40,11 +40,13 @@ public class FileEntity extends BaseEntity implements Serializable {
 
     /**
      * 状态
+     * 0: 切片失败
      * 1:未解压
      * 2:未判断坐标
      * 3:未转geojson
      * 4:未切片
      * 5:切片完成
+     * 6:切片中
      */
     @Column
     private Integer status;

+ 69 - 0
src/main/java/com/fd/entity/FileSchedule.java

@@ -0,0 +1,69 @@
+package com.fd.entity;
+
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * Created by Owen on 2019/11/22 0022 18:39
+ *
+ * 文件进度控制表
+ *
+ *
+ */
+
+@Data
+@Entity
+@Table(name = "t_file_schedule")
+public class FileSchedule extends BaseEntity implements Serializable {
+
+
+    @Column
+    private Long uploadId; // 上传文件ID
+
+    @Column
+    private String fileName; // 文件名称
+
+    @Column
+    private String zipPath; // 压缩文件路径
+
+    @Column
+    private String coordGeneralPath; // 简单坐标文件路径
+
+    @Column
+    private String coordStrictPath; // 严格坐标文件路径
+
+    @Column
+    private String geojsonPath; // geoJson文件路径
+
+    @Column
+    private String slicePath; // 切片文件路径
+
+    @Column
+    private Integer progress; // 进度
+
+    @Column
+    private String type; // 文件类型
+
+    @Column
+    private String coord; // 坐标
+
+
+    /**
+     * 状态
+     * 0:切片失败
+     * 1:未解压
+     * 2:未判断坐标
+     * 3:未转geojson
+     * 4:未切片
+     * 5:切片完成
+     * 6:切片中
+     */
+    @Column
+    private Integer status;
+
+
+}

+ 65 - 0
src/main/java/com/fd/entity/OutputFileEntity.java

@@ -0,0 +1,65 @@
+package com.fd.entity;
+
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+
+/**
+ * Created by Owen on 2019/10/28 0028 11:15
+ */
+@Data
+@Entity
+@Table(name = "t_output_file")
+public class OutputFileEntity extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = 3663614649370191338L;
+
+
+    @Column
+    private Long uploadId; // 上传文件ID
+
+    @Column
+    private String fileName; // 文件名称
+
+    @Column
+    private String unZipPath; // 解压文件路径
+
+    @Column
+    private String coordGeneralPath; // 简单坐标文件路径
+
+    @Column
+    private String coordStrictPath; // 严格坐标文件路径
+
+    @Column
+    private String geojsonPath; // geoJson文件路径
+
+    @Column
+    private String slicePath; // 切片文件路径
+
+    @Column
+    private Integer progress; // 进度
+
+    @Column
+    private String type; // 文件类型
+
+    @Column
+    private String coord; // 坐标
+
+
+    /**
+     * 状态
+     * 0:切片失败
+     * 1:未解压
+     * 2:未判断坐标
+     * 3:未转geojson
+     * 4:未切片
+     * 5:切片完成
+     * 6:切片中
+     */
+    @Column
+    private Integer status;
+
+}

+ 21 - 0
src/main/java/com/fd/repository/FileScheduleRepository.java

@@ -0,0 +1,21 @@
+package com.fd.repository;
+
+import com.fd.entity.FileEntity;
+import com.fd.entity.FileSchedule;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+/**
+ * Created by Owen on 2019/10/28 0028 11:36
+ *
+ * JpaSpecificationExecutor 条件分页查询
+ */
+public interface FileScheduleRepository extends JpaRepository<FileSchedule, Long> {
+
+    FileSchedule findByAndAndUploadId(Long uploadId);
+
+
+}

+ 27 - 0
src/main/java/com/fd/repository/OutputFileRepository.java

@@ -0,0 +1,27 @@
+package com.fd.repository;
+
+import com.fd.entity.FileEntity;
+import com.fd.entity.FileSchedule;
+import com.fd.entity.OutputFileEntity;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+/**
+ * Created by Owen on 2019/10/28 0028 11:36
+ *
+ * JpaSpecificationExecutor 条件分页查询
+ */
+public interface OutputFileRepository extends JpaRepository<OutputFileEntity, Long> {
+
+    OutputFileEntity findByAndAndUploadId(Long uploadId);
+
+    // 条件分页查询
+    Page<OutputFileEntity> findByType(String type, Pageable pageable);
+
+    @Query(value = "select r from OutputFileEntity r where r.type=?1 or r.type =?2")
+    Page<OutputFileEntity> findByType(String type, String type1, Pageable pageable);
+
+
+}

+ 25 - 0
src/main/java/com/fd/server/ModelServer.java

@@ -0,0 +1,25 @@
+package com.fd.server;
+
+import com.fd.dto.PageDto;
+import com.fd.entity.FileEntity;
+import com.fd.entity.FileSchedule;
+import com.fd.entity.OutputFileEntity;
+import com.fd.util.R;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * Created by Owen on 2019/11/21 0021 15:29
+ */
+public interface ModelServer {
+
+    // 大文件上传
+    R uploadBigFile(MultipartFile file);
+
+    OutputFileEntity findByUploadId(Long uploadId);
+
+    OutputFileEntity save(OutputFileEntity fileSchedule);
+
+    OutputFileEntity findById(Long fileId);
+
+    R findByType(String fileTypeModel, PageDto param);
+}

+ 13 - 0
src/main/java/com/fd/server/RasterServer.java

@@ -0,0 +1,13 @@
+package com.fd.server;
+
+
+import com.fd.util.R;
+
+/**
+ * Created by Owen on 2019/11/21 0021 15:29
+ */
+public interface RasterServer {
+
+
+    R moveFileToServer(Long fileId);
+}

+ 2 - 0
src/main/java/com/fd/server/VectorServer.java

@@ -9,4 +9,6 @@ import org.springframework.web.multipart.MultipartFile;
 public interface VectorServer {
 
     R uploadFile(MultipartFile file, String coord);
+
+    R uploadDirectoryFile(MultipartFile file, String directoryName, String coord);
 }

+ 2 - 0
src/main/java/com/fd/server/impl/FileServerImpl.java

@@ -20,6 +20,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.transaction.Transactional;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Base64;
 import java.util.Date;
 import java.util.Optional;
@@ -111,6 +112,7 @@ public class FileServerImpl implements FileServer {
         String filePath = INPUT_FILE_PATH + fileName;
 
         // 写文件到本地
+
         try {
             FileUtils.bigFileWrite(file.getInputStream(), filePath);
         } catch (IOException e) {

+ 137 - 0
src/main/java/com/fd/server/impl/ModelServerImpl.java

@@ -0,0 +1,137 @@
+package com.fd.server.impl;
+
+import com.fd.constant.MsgCode;
+import com.fd.constant.TypeCode;
+import com.fd.dto.PageDto;
+import com.fd.entity.FileEntity;
+import com.fd.entity.FileSchedule;
+import com.fd.entity.OutputFileEntity;
+import com.fd.repository.FileRepository;
+import com.fd.repository.FileScheduleRepository;
+import com.fd.repository.OutputFileRepository;
+import com.fd.server.ModelServer;
+import com.fd.server.VectorServer;
+import com.fd.util.FileUtils;
+import com.fd.util.R;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Base64;
+import java.util.Date;
+import java.util.Optional;
+
+
+/**
+ * Created by Owen on 2019/11/21 0021 15:29
+ */
+@Log4j2
+@Service
+public class ModelServerImpl implements ModelServer {
+
+    @Value("${input.file.path}")
+    private String INPUT_FILE_PATH;
+
+    @Value("${output.file.path}")
+    private String OUTPUT_FILE_PATH;
+
+    @Autowired
+    private FileRepository fileRepository;
+
+    @Autowired
+    private OutputFileRepository outputFileRepository;
+
+
+    @Override
+    public R uploadBigFile(MultipartFile file) {
+        log.warn("run uploadBigFile");
+        long start = System.currentTimeMillis();
+        if (file.isEmpty() || file.getSize() <= 0) {
+            log.info("文件为空");
+            return new R(50001, MsgCode.E50001);
+        }
+
+        // 文件名全名
+        String fullFileName = file.getOriginalFilename();
+
+        // 创建目录路径
+        FileUtils.createDir(INPUT_FILE_PATH);
+
+        // 拼接唯一文件名
+        long timeMillis = System.currentTimeMillis();
+//        String fileName = timeMillis + "_" + fullFileName;
+        String fileName = fullFileName;
+
+        // 文件保存路径
+        String filePath = INPUT_FILE_PATH + fileName;
+
+        // 写文件到本地
+        try {
+            FileUtils.bigFileWrite(file.getInputStream(), filePath);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        log.info("filePath: {}", filePath);
+
+        // 保存信息到db
+        FileEntity entity = new FileEntity();
+        entity.setFileName(fileName);
+        entity.setFileUrl(filePath);
+        entity.setCreateTime(new Date());
+        entity.setUpdateTime(new Date());
+        entity.setType(TypeCode.FILE_TYPE_MODEL);
+//        entity.setStatus(1);
+        entity = fileRepository.save(entity);
+
+
+
+        OutputFileEntity outputFile = new OutputFileEntity();
+        outputFile.setUploadId(entity.getId());
+        outputFile.setFileName(entity.getFileName());
+        outputFile.setStatus(1);
+        outputFile.setType(TypeCode.FILE_TYPE_MODEL);
+        outputFile.setCreateTime(new Date());
+        outputFile.setUpdateTime(new Date());
+
+        outputFile = outputFileRepository.save(outputFile);
+
+
+        long end = System.currentTimeMillis();
+        log.info("end uploadBigFile, total time: {} s", (end - start)/1000);
+        return new R(200, outputFile);
+    }
+
+    @Override
+    public OutputFileEntity findByUploadId(Long uploadId) {
+        return outputFileRepository.findByAndAndUploadId(uploadId);
+    }
+
+    @Override
+    public OutputFileEntity save(OutputFileEntity fileSchedule) {
+        return outputFileRepository.save(fileSchedule);
+    }
+
+    @Override
+    public OutputFileEntity findById(Long fileId) {
+        Optional<OutputFileEntity> o = outputFileRepository.findById(fileId);
+        if (o.isPresent()) {
+            return o.get();
+        }
+        return null;
+    }
+
+    @Override
+    public R findByType(String fileTypeModel, PageDto pageDto) {
+        Page<OutputFileEntity> page = outputFileRepository.findByType(fileTypeModel, PageRequest.of(pageDto.getPageNum(), pageDto.getPageSize(), Sort.by("createTime").descending()));
+        return new R(200, page);
+    }
+
+
+}

+ 58 - 0
src/main/java/com/fd/server/impl/RasterServerImpl.java

@@ -0,0 +1,58 @@
+package com.fd.server.impl;
+
+import com.fd.constant.MsgCode;
+import com.fd.constant.TypeCode;
+import com.fd.entity.FileEntity;
+import com.fd.repository.FileRepository;
+import com.fd.server.RasterServer;
+import com.fd.server.VectorServer;
+import com.fd.util.FileUtils;
+import com.fd.util.R;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Base64;
+import java.util.Date;
+import java.util.Optional;
+
+
+/**
+ * Created by Owen on 2019/11/21 0021 15:29
+ */
+@Log4j2
+@Service
+public class RasterServerImpl implements RasterServer {
+
+    @Value("${input.file.path}")
+    private String INPUT_FILE_PATH;
+
+    @Value("${output.file.path}")
+    private String OUTPUT_FILE_PATH;
+
+    @Value("${copy.file.path.raster}")
+    private String MOVE_FILE_TO_SERVER;
+
+    @Autowired
+    private FileRepository fileRepository;
+
+
+    @Override
+    public R moveFileToServer(Long fileId) {
+        Optional<FileEntity> o = fileRepository.findById(fileId);
+        if (!o.isPresent()) {
+            log.info("id:{} 不存在", fileId);
+            return new R(50002, MsgCode.E50002);
+        }
+        FileEntity entity = o.get();
+
+        FileUtils.base64ToFileWriter(entity.getFileUrl(), MOVE_FILE_TO_SERVER);
+        return new R(200, MsgCode.SUCCESS);
+    }
+}

+ 45 - 0
src/main/java/com/fd/server/impl/VectorServerImpl.java

@@ -77,4 +77,49 @@ public class VectorServerImpl implements VectorServer {
         log.info("end uploadFile");
         return new R(200, entity);
     }
+
+    @Override
+    public R uploadDirectoryFile(MultipartFile file, String directoryName, String coord) {
+
+        log.warn("run uploadBigFile");
+        long start = System.currentTimeMillis();
+        if (file.isEmpty() || file.getSize() <= 0) {
+            log.info("文件为空");
+            return new R(50001, MsgCode.E50001);
+        }
+
+        // 文件名全名
+        String fullFileName = file.getOriginalFilename();
+
+        // 创建目录路径
+        String filePath = INPUT_FILE_PATH + directoryName + File.separator;
+        FileUtils.createDir(filePath);
+
+
+        // 文件保存路径
+        filePath = filePath + fullFileName;
+
+        // 写文件到本地
+
+        try {
+            FileUtils.bigFileWrite(file.getInputStream(), filePath);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        log.info("filePath: {}", filePath);
+
+        // 保存信息到db
+        FileEntity entity = new FileEntity();
+        entity.setFileName(fullFileName);
+        entity.setFileUrl(filePath);
+        entity.setCreateTime(new Date());
+        entity.setUpdateTime(new Date());
+        entity.setType(TypeCode.FILE_TYPE_VECTOR);
+        entity.setCoord(coord);
+        entity.setStatus(2);
+        fileRepository.save(entity);
+        long end = System.currentTimeMillis();
+        log.info("end uploadBigFile, total time: {} s", (end - start)/1000);
+        return new R(200, entity);
+    }
 }

+ 6 - 0
src/main/resources/application-dev.properties

@@ -8,3 +8,9 @@ logging.file=log/cesium.log
 
 input.file.path=F:\\test\\cesium\\input\\
 output.file.path=F:\\test\\cesium\\output\\
+
+
+#·¢²¼·þÎñµØÖ·
+copy.file.path.model=/root/gis/cesium/output/copy/
+copy.file.path.raster=/root/gis/cesium/output/copy/
+copy.file.path.vector=/root/gis/cesium/output/copy/

+ 4 - 1
src/main/resources/application-pro.properties

@@ -10,5 +10,8 @@ input.file.path=/root/gis/cesium/input/
 output.file.path=/root/gis/cesium/output/
 
 
-#
+#·¢²¼·þÎñµØÖ·
+copy.file.path.model=/root/gis/cesium/output/copy/
+copy.file.path.raster=/root/gis/cesium/output/copy/
+copy.file.path.vector=/root/gis/cesium/output/copy/
 

+ 8 - 0
src/main/resources/static/config.json

@@ -0,0 +1,8 @@
+{
+    "tileset": "../data/wuyidaxue/tileset.json",
+    "layers": [
+          { "name": "house", "text": "建筑", "type": "geodata", "checked": false, "show": true, "url": "house" },
+        { "name": "road", "text": "道路", "type": "geodata", "checked": false, "show": true, "url": "road" },
+        { "name": "heatmap", "text": "热力图", "type": "heatmap", "checked": false, "show": true, "url": "" } 
+     ]
+}