|
@@ -1,10 +1,14 @@
|
|
|
package com.fdkankan.indoor.core.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.fdkankan.indoor.base.constant.ConfigConstant;
|
|
|
import com.fdkankan.indoor.base.convert.DistanceUtil;
|
|
|
+import com.fdkankan.indoor.base.convert.ModifyCloud;
|
|
|
import com.fdkankan.indoor.base.exception.BaseRuntimeException;
|
|
|
import com.fdkankan.indoor.base.util.GisUtils;
|
|
|
import com.fdkankan.indoor.base.util.Result;
|
|
|
+import com.fdkankan.indoor.core.entity.ControlPointCalculateEntity;
|
|
|
import com.fdkankan.indoor.core.entity.DataSetEntity;
|
|
|
import com.fdkankan.indoor.core.entity.FilterEntity;
|
|
|
import com.fdkankan.indoor.core.entity.SiteModelEntity;
|
|
@@ -16,6 +20,7 @@ import com.fdkankan.indoor.core.entity.po.DataSetPo;
|
|
|
import com.fdkankan.indoor.core.mapper.SiteModelMapper;
|
|
|
import com.fdkankan.indoor.core.service.*;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import net.sf.json.JSONArray;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
|
@@ -23,6 +28,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import java.awt.geom.Point2D;
|
|
|
+import java.io.IOException;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -32,7 +38,7 @@ import java.util.stream.Collectors;
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
-public class SiteModelServiceImpl implements SiteModelService {
|
|
|
+public class SiteModelServiceImpl extends IBaseServiceImpl implements SiteModelService {
|
|
|
|
|
|
@Autowired
|
|
|
MongoTemplate mongoTemplate;
|
|
@@ -52,6 +58,12 @@ public class SiteModelServiceImpl implements SiteModelService {
|
|
|
@Autowired
|
|
|
FilterService filterService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ ConfigConstant configConstant;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ ControlPointCalculateService controlPointCalculateService;
|
|
|
+
|
|
|
|
|
|
// updateSiteMode 只是这个方法用的
|
|
|
private Integer maxId;
|
|
@@ -123,8 +135,6 @@ public class SiteModelServiceImpl implements SiteModelService {
|
|
|
@Override
|
|
|
public Result withinType(String sceneCode, Double[] location, String type) {
|
|
|
|
|
|
-
|
|
|
-
|
|
|
List<SiteDto> resData = getDataBySceneCode(sceneCode);
|
|
|
// 2021-09-18
|
|
|
if (resData.size() == 0) {
|
|
@@ -347,9 +357,6 @@ public class SiteModelServiceImpl implements SiteModelService {
|
|
|
|
|
|
@Override
|
|
|
public Result initSiteModel(String sceneCode) {
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
SiteModelEntity entity = findById(sceneCode);
|
|
|
if (entity == null) {
|
|
|
String msg = "siteModel表数据不存在,请检查表数据, 场景码:" + sceneCode;
|
|
@@ -359,8 +366,13 @@ public class SiteModelServiceImpl implements SiteModelService {
|
|
|
|
|
|
// 去掉房间数据
|
|
|
List<SiteDto> data = entity.getData();
|
|
|
-// recursionRemoveRoom(data);
|
|
|
- data = removeRoom(data);
|
|
|
+ // 2021-10-18 没有分类信息则添加初始化数据,有则删除房间
|
|
|
+ if (data.size() == 0) {
|
|
|
+ log.info("分类信息为空,重新初始化分类信息数据");
|
|
|
+ data = getBaseSiteModel(sceneCode);
|
|
|
+ } else {
|
|
|
+ data = removeRoom(data);
|
|
|
+ }
|
|
|
|
|
|
entity.setData(data);
|
|
|
this.save(entity);
|
|
@@ -373,6 +385,134 @@ public class SiteModelServiceImpl implements SiteModelService {
|
|
|
|
|
|
|
|
|
/**
|
|
|
+ * 2021-10-18 创建初始化的siteModel.data
|
|
|
+ * @param sceneCode
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<SiteDto> getBaseSiteModel(String sceneCode){
|
|
|
+ String path = redisPath(sceneCode);
|
|
|
+ ControlPointCalculateEntity controlPoint = controlPointCalculateService.findById(sceneCode);
|
|
|
+ List<SiteDto> siteDtos = processCould(path, controlPoint);
|
|
|
+ log.info("分类信息初始化完成");
|
|
|
+
|
|
|
+ return siteDtos;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 处理could.js 并做相应的计算
|
|
|
+ * @param path
|
|
|
+ */
|
|
|
+ private List<SiteDto> processCould(String path, ControlPointCalculateEntity dto){
|
|
|
+ path = path + "/webcloud/cloud.js";
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 修改cloud.js文件
|
|
|
+ net.sf.json.JSONObject info = ModifyCloud.fixCloud(path);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将boundingBox坐标转换成gis坐标, site_model需要
|
|
|
+ * boundingBox:虚拟点坐标,存特殊点, dataSet数据要使用
|
|
|
+ */
|
|
|
+ net.sf.json.JSONObject boundingBox = ModifyCloud.getBoundingBox(info);
|
|
|
+ Double maxZ = boundingBox.getDouble("maxZ");
|
|
|
+ Double minZ = boundingBox.getDouble("minZ");
|
|
|
+
|
|
|
+
|
|
|
+ net.sf.json.JSONObject resJson = ModifyCloud.convertFromBoundingBox(boundingBox, dto);
|
|
|
+
|
|
|
+ Double[] gpsMax = getKey(resJson, "max");
|
|
|
+ Double[] gpsMin = getKey(resJson, "min");
|
|
|
+ Double[] gpsCentre = getKeyZ(resJson, "centre");
|
|
|
+
|
|
|
+ // 创建sitModel
|
|
|
+ List<SiteDto> siteModel = initBaseSiteModel(gpsMax, gpsMin, gpsCentre, maxZ, minZ);
|
|
|
+ return siteModel;
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 2021-10-18
|
|
|
+ * 创建模板siteModel, 没有ROOM类型
|
|
|
+ * @param max
|
|
|
+ * @param min
|
|
|
+ * @param centre
|
|
|
+ * @param maxZ
|
|
|
+ * @param minZ
|
|
|
+ */
|
|
|
+ private List<SiteDto> initBaseSiteModel(Double[] max, Double[] min, Double[] centre, Double maxZ, Double minZ) {
|
|
|
+ //读取初始文件
|
|
|
+ String content = cn.hutool.core.io.FileUtil.readUtf8String(configConstant.templatePath + "/site_model.json");
|
|
|
+ List<SiteDto> siteModels = JSON.parseArray(content, SiteDto.class);
|
|
|
+ // z_max、z_min 替换site_model的Floor、root类型
|
|
|
+ // max、min四个顶点替换BUILDING、FLOOR 的coordinates,
|
|
|
+ // 顺时针,(x_max,y_max),(x_max,y_min),(x_min,y_min),(x_min,y_max)
|
|
|
+ // 一般参数1:x, 参数2:Y
|
|
|
+ Double[] peak_1 = {max[0], max[1]};
|
|
|
+ Double[] peak_2 = {max[0], min[1]};
|
|
|
+ Double[] peak_3 = {min[0], min[1]};
|
|
|
+ Double[] peak_4 = {min[0], max[1]};
|
|
|
+ List<List<Double[]>> doubles = Arrays.asList(Arrays.asList(peak_1, peak_2, peak_3, peak_4));
|
|
|
+
|
|
|
+ // centre 替换BUILDING、FLOOR、ROOM 的center
|
|
|
+ log.info("中心点:{}, {}, {}", centre[0], centre[1], centre[2]);
|
|
|
+ siteModels.forEach(p -> {
|
|
|
+ // 第一层:BUILDING,处理centre、coordinates
|
|
|
+ p.setCenter(centre);
|
|
|
+ SitePolygon polygon = p.getPolygon();
|
|
|
+
|
|
|
+ // BUILDING. coordinates, max、min四个顶点替换
|
|
|
+ polygon.setCoordinates(doubles);
|
|
|
+
|
|
|
+ // 第二层:FLOOR 层
|
|
|
+ List<SiteDto> children = p.getChildren();
|
|
|
+ if (children.size() > 0) {
|
|
|
+ children.forEach(c -> {
|
|
|
+ c.setCenter(centre);
|
|
|
+ c.setZ_max(maxZ);
|
|
|
+ c.setZ_min(minZ);
|
|
|
+
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ return siteModels;
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取两个值的
|
|
|
+ * json数组转 double[]
|
|
|
+ * @param resJson
|
|
|
+ * @param key
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Double[] getKey(net.sf.json.JSONObject resJson , String key){
|
|
|
+ JSONArray array = resJson.getJSONArray(key);
|
|
|
+ Double[] res = {array.getDouble(0), array.getDouble(1)};
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取三个值的
|
|
|
+ * @param resJson
|
|
|
+ * @param key
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Double[] getKeyZ(net.sf.json.JSONObject resJson , String key){
|
|
|
+ JSONArray array = resJson.getJSONArray(key);
|
|
|
+ Double[] res = {array.getDouble(0), array.getDouble(1), array.getDouble(2)};
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
* 2021-9-16
|
|
|
* 处理dataSet.site_model_ids, 是否在site_model.z_min,z_max范围内,且去掉房间ids
|
|
|
*
|
|
@@ -495,23 +635,7 @@ public class SiteModelServiceImpl implements SiteModelService {
|
|
|
return resSite;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 2021-9-16
|
|
|
- * 递归方法遍历, 删除房间
|
|
|
- */
|
|
|
-// private void recursionRemoveRoom(List<SiteDto> param){
|
|
|
-//// for (SiteDto dto : param) {
|
|
|
-//// // 递归调用
|
|
|
-//// List<SiteDto> children = dto.getChildren();
|
|
|
-//// if ("FLOOR".equals(dto.getType())){
|
|
|
-//// children = new ArrayList<>();
|
|
|
-//// dto.setChildren(children);
|
|
|
-//// }
|
|
|
-//// if (children.size() > 0) {
|
|
|
-//// recursionRemoveRoom(children);
|
|
|
-//// }
|
|
|
-//// }
|
|
|
-//// }
|
|
|
+
|
|
|
|
|
|
|
|
|
|