|
@@ -3,6 +3,7 @@ package com.fdkankan.scene.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.fastjson.JSONArray;
|
|
import com.alibaba.fastjson.JSONArray;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
+import com.alibaba.fastjson.serializer.SerializerFeature;
|
|
import com.fdkankan.base.aop.SystemServiceLog;
|
|
import com.fdkankan.base.aop.SystemServiceLog;
|
|
import com.fdkankan.base.constant.LoginConstant;
|
|
import com.fdkankan.base.constant.LoginConstant;
|
|
import com.fdkankan.base.constant.SceneConstant;
|
|
import com.fdkankan.base.constant.SceneConstant;
|
|
@@ -42,6 +43,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+import org.springframework.util.ObjectUtils;
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
import tk.mybatis.mapper.entity.Condition;
|
|
import tk.mybatis.mapper.entity.Condition;
|
|
@@ -2102,7 +2104,26 @@ public class SceneProServiceImpl extends BaseServiceImpl<SceneProEntity, Long> i
|
|
}
|
|
}
|
|
FileUtils.deleteDirectory(target + File.separator + "extras/video/");
|
|
FileUtils.deleteDirectory(target + File.separator + "extras/video/");
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ // 清除马赛克数据
|
|
|
|
+ if(scenejson.containsKey("planId")){
|
|
|
|
+ String[] planIds = scenejson.getString("planId").split(",");
|
|
|
|
+ String mosaicDatasTr = sceneProEntity.getMosaics();
|
|
|
|
+ JSONArray jsonArray = new JSONArray();
|
|
|
|
+ if(!ObjectUtils.isEmpty(mosaicDatasTr)){
|
|
|
|
+ jsonArray = JSONArray.parseArray(mosaicDatasTr);
|
|
|
|
+ }
|
|
|
|
+ for (String planId : planIds) {
|
|
|
|
+ for (Iterator<Object> iterator = jsonArray.iterator(); iterator.hasNext(); ) {
|
|
|
|
+ JSONObject data = (JSONObject)iterator.next();
|
|
|
|
+ if(StringUtils.equals(data.getString("panoId"),planId)){
|
|
|
|
+ iterator.remove();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ sceneProEntity.setMosaics(JSON.toJSONString(jsonArray,SerializerFeature.DisableCircularReferenceDetect));
|
|
|
|
+ scenejson.remove("planId");
|
|
|
|
+ scenejson.put("mosaics",JSON.toJSONString(jsonArray,SerializerFeature.DisableCircularReferenceDetect));
|
|
|
|
+ }
|
|
scenejson.put("imagesVersion", sceneProEditEntity.getImagesVersion() + 1);
|
|
scenejson.put("imagesVersion", sceneProEditEntity.getImagesVersion() + 1);
|
|
scenejson.put("buildImages", 0);
|
|
scenejson.put("buildImages", 0);
|
|
sceneProEditEntity.setImagesVersion(sceneProEditEntity.getImagesVersion() + 1);
|
|
sceneProEditEntity.setImagesVersion(sceneProEditEntity.getImagesVersion() + 1);
|
|
@@ -3538,6 +3559,11 @@ public class SceneProServiceImpl extends BaseServiceImpl<SceneProEntity, Long> i
|
|
}
|
|
}
|
|
|
|
|
|
scenejson.put("buildImages", 1);
|
|
scenejson.put("buildImages", 1);
|
|
|
|
+ if(scenejson.containsKey("planId")){
|
|
|
|
+ scenejson.put("planId",scenejson.getString("planId").concat(","+planId));
|
|
|
|
+ }else{
|
|
|
|
+ scenejson.put("planId",planId);
|
|
|
|
+ }
|
|
FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
|
|
FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
|
|
|
|
|
|
return Result.success();
|
|
return Result.success();
|
|
@@ -4340,6 +4366,189 @@ public class SceneProServiceImpl extends BaseServiceImpl<SceneProEntity, Long> i
|
|
return sceneProMapper.findFolderIdScence(folderId,userId);
|
|
return sceneProMapper.findFolderIdScence(folderId,userId);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public Result uploadROIImage(String sceneNum, String mosaics) throws Exception {
|
|
|
|
+ if(StringUtils.isEmpty(sceneNum) || StringUtils.isEmpty(mosaics)){
|
|
|
|
+ throw new BaseRuntimeException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
|
|
|
|
+ }
|
|
|
|
+ log.info("uploadROIImage 参数:{},{}",sceneNum,mosaics);
|
|
|
|
+
|
|
|
|
+ JSONArray mosaicDatas = JSONArray.parseArray(mosaics);
|
|
|
|
+ if (mosaicDatas.size() > 1) {
|
|
|
|
+ throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5012, "只支持上传一个马赛克数据");
|
|
|
|
+ }
|
|
|
|
+ JSONObject mosicData = mosaicDatas.getJSONObject(0);
|
|
|
|
+
|
|
|
|
+ SceneProEntity sceneProEntity = sceneProMapper.findByNum(sceneNum);
|
|
|
|
+ if(sceneProEntity == null){
|
|
|
|
+ throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ StringBuffer dataBuf = new StringBuffer().append("data").append(File.separator)
|
|
|
|
+ .append("data").append(sceneProEntity.getNum()).append(File.separator);
|
|
|
|
+
|
|
|
|
+ StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ String path = sceneProEntity.getDataSource();
|
|
|
|
+
|
|
|
|
+ if(!ObjectUtils.isEmpty(path) && path.startsWith("http")){
|
|
|
|
+ path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
|
|
|
|
+ }
|
|
|
|
+ String target = path + "_roi";
|
|
|
|
+
|
|
|
|
+ FileUtils.deleteDirectory(target);
|
|
|
|
+
|
|
|
|
+ //文件上传的位置可以自定义
|
|
|
|
+ String filePath = target + File.separator + "extras" + File.separator + "images/";
|
|
|
|
+ File imageFile = new File(filePath);
|
|
|
|
+ if(!imageFile.getParentFile().exists()){
|
|
|
|
+ imageFile.getParentFile().mkdirs();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ FileUtils.copyFolderAllFiles(path + "/caches/images/", filePath, true);
|
|
|
|
+
|
|
|
|
+ String mosaicDatasTr = sceneProEntity.getMosaics();
|
|
|
|
+ JSONArray jsonArray = new JSONArray();
|
|
|
|
+ if(!ObjectUtils.isEmpty(mosaicDatasTr)){
|
|
|
|
+ jsonArray = JSONArray.parseArray(mosaicDatasTr);
|
|
|
|
+ }
|
|
|
|
+ jsonArray.add(mosicData);
|
|
|
|
+
|
|
|
|
+ // 更新 scene.json
|
|
|
|
+ String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
|
|
|
|
+ JSONObject scenejson = new JSONObject();
|
|
|
|
+ if(strsceneInfos!=null) {
|
|
|
|
+ scenejson = JSONObject.parseObject(strsceneInfos);
|
|
|
|
+ }
|
|
|
|
+ scenejson.put("mosaics",JSON.toJSONString(jsonArray, SerializerFeature.DisableCircularReferenceDetect));
|
|
|
|
+ FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toJSONString());
|
|
|
|
+
|
|
|
|
+ // 准备算法数据
|
|
|
|
+ List<JSONObject> params = new ArrayList<>();
|
|
|
|
+ for(int i = 0, len = jsonArray.size(); i < len; i++){
|
|
|
|
+ JSONObject jsonObject = jsonArray.getJSONObject(i);
|
|
|
|
+ boolean contains = false;
|
|
|
|
+ for (JSONObject param : params) {
|
|
|
|
+ if(StringUtils.equals(param.getString("panoId"),jsonObject.getString("panoId"))){
|
|
|
|
+ contains = true;
|
|
|
|
+ param.getJSONArray("rect").addAll(jsonObject.getJSONArray("rect"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(!contains){
|
|
|
|
+ params.add(jsonObject);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ JSONObject roiImageJSon = new JSONObject();
|
|
|
|
+ roiImageJSon.put("batch",params);
|
|
|
|
+
|
|
|
|
+ FileUtils.writeFile(target + File.separator + "extras" + File.separator + "image-ROI.json", JSON.toJSONString(roiImageJSon,SerializerFeature.DisableCircularReferenceDetect));
|
|
|
|
+
|
|
|
|
+ FileUtils.copyFile(sceneProEntity.getDataSource() + File.separator + "results/vision.txt", target + File.separator+"extras/vision.txt", true);
|
|
|
|
+ FileUtils.copyFile(sceneProEntity.getDataSource() + File.separator + "results/vision2.txt", target + File.separator+"extras/vision2.txt", true);
|
|
|
|
+
|
|
|
|
+ FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
|
|
|
|
+
|
|
|
|
+ String data = FileUtils.readFile(target + File.separator+"data.json");
|
|
|
|
+ if(data != null){
|
|
|
|
+ JSONObject floorplanJson = new JSONObject();
|
|
|
|
+ floorplanJson.put("has_source_images", true);
|
|
|
|
+ floorplanJson.put("has_vision_txt", true);
|
|
|
|
+
|
|
|
|
+ JSONObject dataJson = JSONObject.parseObject(data);
|
|
|
|
+ dataJson.put("extras", floorplanJson);
|
|
|
|
+ //V5表示不需要生成high,low文件
|
|
|
|
+ dataJson.put("skybox_type", "SKYBOX_V6");
|
|
|
|
+ if(sceneProEntity.getSceneScheme() == 11){
|
|
|
|
+ dataJson.put("skybox_type", "SKYBOX_V7");
|
|
|
|
+ }
|
|
|
|
+ dataJson.put("split_type", "SPLIT_V18");
|
|
|
|
+ //sceneScheme为3切成瓦片图
|
|
|
|
+ if(sceneProEntity.getSceneScheme() == 3){
|
|
|
|
+ dataJson.put("skybox_type", "SKYBOX_V4");
|
|
|
|
+ }
|
|
|
|
+ FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);
|
|
|
|
+
|
|
|
|
+ //进行计算
|
|
|
|
+ log.info("马赛克:开始建模——" + sceneProEntity.getNum());
|
|
|
|
+ CreateObjUtil.build3dModel2(target , "1");
|
|
|
|
+
|
|
|
|
+ //读取upload文件,检验需要上传的文件是否存在
|
|
|
|
+ String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json");
|
|
|
|
+ JSONObject uploadJson = null;
|
|
|
|
+ JSONArray array = null;
|
|
|
|
+ if(uploadData!=null) {
|
|
|
|
+ uploadJson = JSONObject.parseObject(uploadData);
|
|
|
|
+ array = uploadJson.getJSONArray("upload");
|
|
|
|
+ }
|
|
|
|
+ if(array == null){
|
|
|
|
+ throw new Exception("upload.json数据出错");
|
|
|
|
+ }
|
|
|
|
+ Map<String,String> map = new HashMap<String,String>();
|
|
|
|
+ JSONObject fileJson = null;
|
|
|
|
+ String fileName = "";
|
|
|
|
+ for(int i = 0, len = array.size(); i < len; i++){
|
|
|
|
+ fileJson = array.getJSONObject(i);
|
|
|
|
+ fileName = fileJson.getString("file");
|
|
|
|
+ //文件不存在抛出异常
|
|
|
|
+ if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){
|
|
|
|
+ throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //high文件夹
|
|
|
|
+ if(fileJson.getIntValue("clazz") == 3){
|
|
|
|
+ map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
|
|
|
|
+ sceneProEntity.getNum()+"/pan/high/"+ fileName.replace("high/", ""));
|
|
|
|
+ }
|
|
|
|
+ //low文件夹
|
|
|
|
+ if(fileJson.getIntValue("clazz") == 4){
|
|
|
|
+ map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
|
|
|
|
+ sceneProEntity.getNum()+"/pan/low/"+ fileName.replace("low/", ""));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //tiles文件夹,亚马逊没有裁剪图片api,不需要上传4k图
|
|
|
|
+ if(fileJson.getIntValue("clazz") == 5){
|
|
|
|
+ map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
|
|
|
|
+ sceneProEntity.getNum()+ File.separator + fileName);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //tiles文件夹,亚马逊瓦片图
|
|
|
|
+ if(fileJson.getIntValue("clazz") == 7 ){
|
|
|
|
+ map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
|
|
|
|
+ sceneProEntity.getNum()+ File.separator + fileName);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for(String imagesName : imageFile.list()){
|
|
|
|
+ //覆盖原始图片资源
|
|
|
|
+ FileUtils.copyFile(target + File.separator + "extras/images/" + imagesName,
|
|
|
|
+ path + File.separator + "caches/images/" + imagesName, true);
|
|
|
|
+ FileUtils.deleteFile(target + File.separator + "extras/images/" + imagesName);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ uploadToOssUtil.uploadMulFiles(map);
|
|
|
|
+
|
|
|
|
+ scenejson.put("imagesVersion", scenejson.getIntValue("imagesVersion") + 1);
|
|
|
|
+
|
|
|
|
+ FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
|
|
|
|
+
|
|
|
|
+ SceneProEditEntity sceneProEditEntity = sceneProEditMapper.findByProId(sceneProEntity.getId());
|
|
|
|
+ if(sceneProEditEntity != null){
|
|
|
|
+ sceneProEditEntity.setImagesVersion(sceneProEditEntity.getImagesVersion() + 1);
|
|
|
|
+ sceneProEditMapper.updateByPrimaryKey(sceneProEditEntity);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ sceneProEntity.setMosaics(JSON.toJSONString(jsonArray,SerializerFeature.DisableCircularReferenceDetect));
|
|
|
|
+ update(sceneProEntity);
|
|
|
|
+
|
|
|
|
+ Map<String,Object> result = new HashMap<>(1);
|
|
|
|
+ result.put("mosaics",jsonArray);
|
|
|
|
+
|
|
|
|
+ return Result.success(result);
|
|
|
|
+ }
|
|
|
|
|
|
public static void main(String[] args) {
|
|
public static void main(String[] args) {
|
|
try {
|
|
try {
|