Explorar el Código

手动输入控制点需要使用矩阵转换漫游点坐标

wuweihao hace 3 años
padre
commit
8c209fa60e

+ 6 - 1
README.md

@@ -253,4 +253,9 @@ t-40 (t-vZkqRV8):
    t_special_point 特殊点
    t_tiled_map  地图 (展示端)
    t_user  (写死的,登录区分)
-   t_users   (写死的,不区分)
+   t_users   (写死的,不区分)
+   
+   
+# git
+    master: 生成版本
+    dev1.1: sit版本  2021-1230  

+ 59 - 22
laser/src/main/java/com/fdkankan/indoor/base/convert/ConvertToVision.java

@@ -63,23 +63,31 @@ public class ConvertToVision {
 
 
 
+
+
 	/**
-	 * 初始化vision数据 漫游点数据
+	 * 2022-1-5
 	 * @param sceneCode
-	 * @param panoInfos
-	 * @param from web(手动控制点), null(默认控制点)
+	 * @param panoInfos 热点数据
+	 * @param calculateEntity 控制点计算.rotation2
+	 * @param from web:手动输入控制点
 	 * @param isMerge 是否合并
-	 * @param sp 特殊点
+	 * @param originalPoint 特殊点的原点
+	 * @param orientation dataSet.orientation
+	 * @param gpsLocation dataSet.location
 	 * @return
 	 */
-	private  JSONArray createVisionToFilter(String sceneCode, JSONArray panoInfos, ControlPointCalculateEntity calculateEntity, String from, boolean isMerge, SpecialPointEntity sp) {
+	private  JSONArray createVisionToFilter(String sceneCode, JSONArray panoInfos, ControlPointCalculateEntity calculateEntity,
+											String from, boolean isMerge, Double[] originalPoint, Double orientation, Double[] gpsLocation) {
 
 		JSONArray laserPanos = new JSONArray();
 		int visionSize = panoInfos.size();
 		log.info("漫游点位数量: {}", visionSize);
 		log.info("from: {}", from);
-		Double[] originalPoint = sp.getPoi();
-		log.info("原点: {}", sp.getPoi());
+		if (originalPoint == null){
+			throw new BaseRuntimeException("原点值为空,请检查特殊点表GpsPoi原点值");
+		}
+		log.info("原点: {}", (Object) originalPoint);
 		for(int i=0;i< visionSize;++i) {
 			JSONObject item = panoInfos.getJSONObject(i);
 			JSONObject laserPano = new JSONObject();
@@ -107,23 +115,33 @@ public class ConvertToVision {
 			floor_location[1] = position2.getDouble("y");
 			floor_location[2] = position2.getDouble("z");
 			//gis坐标
-//			double[] _location = GisCoordinateUtil.transformLocationToBL(location[0], location[1], calculateEntity);
-			// 2021-12-30
-			double[] _location = GisCoordinateTransform.convertByProj4ToGps(location[0], location[1],originalPoint);
+
+			double[] _location ;
+			double[] _floor_location;
+			if ("web".equals(from)){
+				// 2022-1-5 手动输入控制点需要使用矩阵计算坐标
+				double[] newMatrix = MatrixUtil.getNewMatrix(orientation, gpsLocation, originalPoint);
+
+				_location = MatrixUtil.convertByMatrixLocationToGps(location, newMatrix, originalPoint);
+				_floor_location = MatrixUtil.convertByMatrixLocationToGps(floor_location, newMatrix, originalPoint);
+
+			} else {
+				_location = GisCoordinateTransform.convertByProj4ToGps(location[0], location[1],originalPoint);
+				_floor_location = GisCoordinateTransform.convertByProj4ToGps(floor_location[0], floor_location[1], originalPoint);
+			}
+
 			if (_location == null) {
 				String msg = "_location坐标转换异常";
 				log.error(msg);
 				throw new BaseRuntimeException(msg);
 			}
-//			double[] _floor_location = GisCoordinateUtil.transformLocationToBL(floor_location[0], floor_location[1], calculateEntity);
-			// 2021-12-30
-			double[] _floor_location = GisCoordinateTransform.convertByProj4ToGps(floor_location[0], floor_location[1], originalPoint);
 			if (_floor_location == null) {
 				String msg = "_floor_location坐标转换异常";
 				log.error(msg);
 				throw new BaseRuntimeException(msg);
 			}
 
+
 			location[0] = _location[0];
 			location[1] = _location[1];
 			floor_location[0] = _floor_location[0];
@@ -153,11 +171,16 @@ public class ConvertToVision {
 			quaternation[3] = rotation.getDouble("z");
 
 			// 2021-09-14
-			if ("web".equals(from)) {
-				laserPano.put("orientation", getQuaternation(rotation, calculateEntity.getRotation2()));
-			} else {
-				laserPano.put("orientation", quaternation);
-			}
+//			if ("web".equals(from)) {
+//				laserPano.put("orientation", getQuaternation(rotation, calculateEntity.getRotation2()));
+//			} else {
+//				laserPano.put("orientation", quaternation);
+//			}
+
+			// 2021-1-5
+			laserPano.put("orientation", getQuaternation(rotation, calculateEntity.getRotation2()));
+
+
 
 			// 2021-08-11
 			laserPano.put("dataset_orientation", quaternation);
@@ -201,16 +224,30 @@ public class ConvertToVision {
 	}
 
 
-
-
-	public  JSONArray createFilter(String sceneCode, String path, ControlPointCalculateEntity calculateEntity, String from, boolean isMerge, SpecialPointEntity sp){
+	/**
+	 *
+	 * @param sceneCode
+	 * @param path
+	 * @param calculateEntity 控制点计算的rotation2
+	 * @param from web:手动重算控制点, age:重置数据
+	 * @param isMerge 是否合并
+	 * @param original 特殊点的原点
+	 * @param orientation dataSet.orientation
+	 * @param gpsLocation dataSet.location
+	 * @return
+	 */
+	public  JSONArray createFilter(String sceneCode, String path, ControlPointCalculateEntity calculateEntity, String from,
+								   boolean isMerge, Double[] original, Double orientation, Double[] gpsLocation){
 		if (!cn.hutool.core.io.FileUtil.isFile(path)) {
 			log.error("文件路径不存在: {}", path);
 			throw new RuntimeException("文件路径不存在");
 		}
 		try {
 			JSONArray panoInfos = readVisionTxt(path);
-			return createVisionToFilter(sceneCode, panoInfos, calculateEntity, from, isMerge, sp);
+
+
+
+			return createVisionToFilter(sceneCode, panoInfos, calculateEntity, from, isMerge, original, orientation, gpsLocation);
 		} catch (IOException e) {
 			e.printStackTrace();
 		}

+ 0 - 1
laser/src/main/java/com/fdkankan/indoor/base/convert/FixRouteMap.java

@@ -3,7 +3,6 @@ package com.fdkankan.indoor.base.convert;
 import com.fdkankan.indoor.base.constant.MsgCode;
 import com.fdkankan.indoor.base.exception.BaseRuntimeException;
 import com.fdkankan.indoor.core.entity.ControlPointCalculateEntity;
-import com.fdkankan.indoor.core.entity.ControlPointEntity;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.json.JSONObject;
 

+ 65 - 1
laser/src/main/java/com/fdkankan/indoor/base/convert/GisCoordinateTransform.java

@@ -1,6 +1,9 @@
 package com.fdkankan.indoor.base.convert;
 
+import com.fdkankan.indoor.core.entity.ControlPointCalculateEntity;
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
 import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
 import org.locationtech.proj4j.*;
 
 import java.math.BigDecimal;
@@ -128,6 +131,36 @@ public  class GisCoordinateTransform {
     }
 
     /**
+     * 2022-1-5
+     * 经纬度转本地 反
+     * @param x
+     * @param y
+     * @return
+     */
+    public static double[] convertByProj4ToLoction(double x,double y, Double[] originalPoint) {
+        CRSFactory crsFactory = new CRSFactory();
+        CoordinateReferenceSystem crs1 = crsFactory.createFromParameters("WGS 84 (long/lat)","+proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees");
+        String str = "+proj=tmerc +ellps=WGS84 +lon_0=" + originalPoint[0] + " +lat_0=" + originalPoint[1];
+        CoordinateReferenceSystem crs2 = crsFactory.createFromParameters("WGS84",str);
+
+        BigDecimal d3 = new BigDecimal(x);
+        BigDecimal d4 =  new BigDecimal(y);
+        ProjCoordinate pt11 = new ProjCoordinate(d3.doubleValue(), d4.doubleValue());
+        ProjCoordinate pt21 = new ProjCoordinate();
+        BasicCoordinateTransform transform21 = new BasicCoordinateTransform( crs1,crs2);
+        ProjCoordinate p = transform21.transform(pt11, pt21);
+
+
+        double[] xy=new double[2];
+        xy[0]=p.x;
+        xy[1]=p.y;
+        if (xy == null) {
+            log.error("这里出现空值,应该抛出异常");
+        }
+        return  xy;
+    }
+
+    /**
      * 2021-12-30
      * 本地转经纬度 (正)
      * @param x
@@ -139,7 +172,7 @@ public  class GisCoordinateTransform {
         CRSFactory crsFactory = new CRSFactory();
         CoordinateReferenceSystem crs1 = crsFactory.createFromParameters("WGS 84 (long/lat)","+proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees");
         // +proj=tmerc +ellps=WGS84 +lon_0=116.434376069193 +lat_0=39.9199287112848
-        String str = "+proj=tmerc +ellps=WGS84 +lon_0=" + originalPoint[0] + "lat_0=" + originalPoint[1];
+        String str = "+proj=tmerc +ellps=WGS84 +lon_0=" + originalPoint[0] + " +lat_0=" + originalPoint[1];
         CoordinateReferenceSystem crs2 = crsFactory.createFromParameters("WGS84", str);
 
         BasicCoordinateTransform transform = new BasicCoordinateTransform(crs2, crs1);
@@ -158,6 +191,37 @@ public  class GisCoordinateTransform {
         return  xy;
     }
 
+    /**
+     * 2021-1-5 测试转坐标
+     * */
+    @Test
+    public void testCoord(){
+//        double[] location1 = {25.270975,22.644186};
+//        Double[] originalPoint = {116.434376069193,39.9199287112848};
+        // 原点
+        ControlPointEntity param = new ControlPointEntity();
+        double[] location1 = {25.270975, 22.644186};
+        double[] location2 = {71.950974, 51.604187};
+        double[] gps1 = {113.592652016944, 22.3661385405556};
+        double[] gps2 = {113.593145836667, 22.3659494975};
+        param.setAgeControlLocation1(location1);
+        param.setAgeControlLocation2(location2);
+        param.setGpsControlCoordinate1(gps1);
+        param.setGpsControlCoordinate2(gps2);
+
+        ControlPointCalculateEntity dto = GisCoordinateUtil.calculateVariable(param);
+
+        double[] origin = ModifyCloud.convertFromOrigin(dto);
+        Double[] origin_ = {origin[0], origin[1]};
+        double[] resGps1 = convertByProj4ToGps(location1[0], location1[1], origin_);
+
+        log.warn("控制点1,gps1: {}, {}", resGps1[0], resGps1[1]);
+
+        // gps转本地
+        double[] resLocation1 = convertByProj4ToLoction(resGps1[0], resGps1[1], origin_);
+        log.warn("控制点1,location1: {}, {}", resLocation1[0], resLocation1[1]);
+    }
+
 
 
 

+ 1 - 4
laser/src/main/java/com/fdkankan/indoor/base/convert/GisCoordinateUtil.java

@@ -122,7 +122,7 @@ public class GisCoordinateUtil {
 
     public static  double[] transformBLToLocation(double lon,double lat, ControlPointCalculateEntity dto){
         double[] gauss= GisCoordinateTransform.convertByProj4(lon, lat,"EPSG:4490","EPSG:4547");
-        log.info("经纬度转本地坐标,大地坐标:{}, {}", gauss[0],gauss[1]);
+//        log.info("经纬度转本地坐标,大地坐标:{}, {}", gauss[0],gauss[1]);
         Point point = new Point(gauss[0],gauss[1]);
         Point resultPoint = AffineTransform.transformBoePoint(new Point(point.getX(), point.getY()), dto.getRotation1(), dto.getScale1(), dto.getDx1(), dto.getDy1());
 
@@ -203,21 +203,18 @@ public class GisCoordinateUtil {
             double scale2 = AffineTransform.getScale( newPoint1 , point1 , newPoint2 , point2);
             log.info("scale2: {}", scale2);
 
-
             // 2021-09-13 这里应该使用scale2
             double dx2 = AffineTransform.getXTranslation( newPoint1 ,point1, rotation2, scale2);
 //            log.info("输出结果 dx2:{}, {}", dx2);
             double dy2 = AffineTransform.getYTranslation( newPoint1 ,point1, rotation2, scale2);
 //            log.info("输出结果 dy2:{}, {}", dy2);
 
-
             ControlPointCalculateEntity entity = new ControlPointCalculateEntity();
             entity.setRotation1(rotation1);
             entity.setScale1(scale1);
             entity.setDx1(dx1);
             entity.setDy1(dy1);
 
-
             entity.setRotation2(rotation2);
             entity.setScale2(scale2);
             entity.setDx2(dx2);

+ 104 - 0
laser/src/main/java/com/fdkankan/indoor/base/convert/MatrixUtil.java

@@ -0,0 +1,104 @@
+package com.fdkankan.indoor.base.convert;
+
+import lombok.extern.slf4j.Slf4j;
+import net.sf.json.JSONObject;
+import org.junit.Test;
+
+/**
+ * Created by owen on 2022/1/5 0005 18:30
+ *
+ * 矩阵工具类
+ */
+@Slf4j
+public class MatrixUtil {
+
+    /**
+     * 获取矩阵
+     * @param orientation dataSet.orientation
+     * @param gpsLocation dataSet.location
+     * @param origin 特殊点的原点
+     * @return
+     */
+    public static double[] getNewMatrix(double orientation, Double[] gpsLocation, Double[] origin) {
+
+        // dataSet.location的gps坐标转本地坐标
+        double[] ageLocation = GisCoordinateTransform.convertByProj4ToLoction(gpsLocation[0], gpsLocation[1], origin);
+
+        // 新的本地坐标, 转出来应该是原点, 很接近0
+        JSONObject newLocation = new JSONObject();
+        newLocation.put("x", ageLocation[0]);
+        newLocation.put("y", ageLocation[1]);
+        newLocation.put("z", gpsLocation[2]);
+        log.info("newLocation: {}", newLocation );
+
+        // 新的矩阵
+        double[] newMatrix = getTransfromMatrix(orientation, newLocation);
+        log.info("新矩阵坐标:{}", newMatrix);
+
+        return newMatrix;
+    }
+
+    private static double[] getTransfromMatrix(double orientation, JSONObject location) {
+        double a1 = Math.cos(orientation);
+        double a2 = Math.sin(orientation);
+
+        double[] mat = new double[16];
+        mat[0] = a1;
+        mat[1] = a2;
+        mat[4] = -1 * a2;
+        mat[5] = a1;
+        mat[10] = 1;
+        mat[12] = location.getDouble("x");
+        mat[13] = location.getDouble("y");
+        mat[14] = location.getDouble("z");
+        mat[15] = 1;
+        return mat;
+    }
+
+    /**
+     * 旧坐标通过矩阵转新坐标是本地坐标
+     * @param position
+     * @param e
+     * @return
+     */
+    private static double[] applyMatrix4(double[] position, double[] e) {
+        double x = position[0];
+        double y = position[1];
+        double z = position[2];
+        double w = 1 / (e[3] * x + e[7] * y + e[11] * z + e[15]);
+        position[0] = (e[0] * x + e[4] * y + e[8] * z + e[12]) * w;
+        position[1] = (e[1] * x + e[5] * y + e[9] * z + e[13]) * w;
+        position[2] = (e[2] * x + e[6] * y + e[10] * z + e[14]) * w;
+        return position;
+
+    }
+
+    /**
+     * 本地坐标通过矩阵转gps坐标
+     * @param location
+     * @param matrix
+     * @return
+     */
+    public static double[] convertByMatrixLocationToGps(double[] location, double[] matrix, Double[] original){
+        // 转换后是平面坐标
+        double[] planeLocation = applyMatrix4(location, matrix);
+
+        // 平面坐标转gps坐标
+        double[] gps = GisCoordinateTransform.convertByProj4ToGps(planeLocation[0], planeLocation[1], original);
+
+        return gps;
+    }
+
+
+    /**
+     * 测试转换矩阵
+     */
+    @Test
+    public void testMatrix(){
+        double orientation = 0.9;
+        Double[] gpsLocation = {113.592329764068, 22.3662040255659, 0.0};
+        Double[] origin = {113.592329764068, 22.3662040255659, 0.0};
+
+        double[] newMatrix = getNewMatrix(orientation, gpsLocation, origin);
+    }
+}

+ 1 - 23
laser/src/main/java/com/fdkankan/indoor/base/convert/PlanGraph.java

@@ -104,29 +104,7 @@ public class PlanGraph {
         //return [e[3], e[0], e[1], e[2]]
     }
 
-//    public static double[] toArray(JSONObject quaternion, double angle) {
-//
-//        //new THREE.Quaternion
-//		/*
-//		 * 	_w: 1
-//			_x: 0
-//			_y: 0
-//			_z: 0
-//		 * */
-//        //double[] Quaternion = {1,0,0,0};
-//        JSONObject axis = new JSONObject();
-//        axis.put("x", 0);
-//        axis.put("y", 0);
-//        axis.put("z", 1);
-//        JSONObject rot90 =  setFromAxisAngle(axis, degToRad(angle));
-//        JSONObject rot90Invert = inverse(rot90);//add 转出时旋回90度
-//        JSONObject t1 = multiply(quaternion,rot90Invert);
-//
-//        double[] e = {t1.getDouble("w"),t1.getDouble("x"),t1.getDouble("y"),t1.getDouble("z")};
-//        return e;
-//        //JSONObject e = t1.toArray();
-//        //return [e[3], e[0], e[1], e[2]]
-//    }
+
 
 
     public static double[] toArray(JSONObject quaternion,double orientation) {

+ 17 - 0
laser/src/main/java/com/fdkankan/indoor/core/controller/TestController.java

@@ -3,9 +3,11 @@ package com.fdkankan.indoor.core.controller;
 import com.fdkankan.indoor.base.util.AliYunOssUtil;
 import com.fdkankan.indoor.base.util.Result;
 import com.fdkankan.indoor.base.util.SnowFlakeUUidUtils;
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
 import com.fdkankan.indoor.core.entity.MergeInfoEntity;
 import com.fdkankan.indoor.core.entity.OwenEntity;
 import com.fdkankan.indoor.core.entity.SpecialPointEntity;
+import com.fdkankan.indoor.core.entity.dto.ControlPointDto;
 import com.fdkankan.indoor.core.service.*;
 import com.fdkankan.indoor.core.entity.vo.HaoVo;
 import io.swagger.annotations.Api;
@@ -280,4 +282,19 @@ public class TestController {
     public Result batchDefault(String str){
         return owenService.batchDefault(str);
     }
+
+
+    /**
+     * 2021-12-23
+     * 批量替换
+     *  default/index.html    直接替换,且修改场景码
+     *  default/css/style.css 直接替换
+     *  default/js/index.js   直接替换
+     * @return
+     */
+    @ApiOperation(value = "2022-1-5, 测试手动输入控制点转换坐标")
+    @PostMapping("controllerPoint")
+    public Result controllerPoint(@RequestBody ControlPointEntity param){
+        return owenService.controllerPoint(param);
+    }
 }

+ 1 - 1
laser/src/main/java/com/fdkankan/indoor/core/service/InitService.java

@@ -24,7 +24,7 @@ public interface InitService {
 
     Result testRemove(String sceneCode);
 
-    void testInitDataStep2(String id, String from);
+//    void testInitDataStep2(String id, String from);
 
     void initSiteModel(String sceneCode);
 

+ 4 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/OwenService.java

@@ -1,8 +1,10 @@
 package com.fdkankan.indoor.core.service;
 
 import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
 import com.fdkankan.indoor.core.entity.MergeInfoEntity;
 import com.fdkankan.indoor.core.entity.OwenEntity;
+import com.fdkankan.indoor.core.entity.dto.ControlPointDto;
 
 /**
  * Created by owen on 2021/7/28 0028 20:05
@@ -41,4 +43,6 @@ public interface OwenService {
     Result batchIndexHtml();
 
     Result batchDefault(String isBatch);
+
+    Result controllerPoint(ControlPointEntity param);
 }

+ 10 - 10
laser/src/main/java/com/fdkankan/indoor/core/service/impl/ControlPointServiceImpl.java

@@ -40,22 +40,22 @@ public class ControlPointServiceImpl implements ControlPointService {
     public Result save(ControlPointDto param, String sceneCode) {
 
 
-        ControlPointEntity pointEntity = this.findById(sceneCode);
-        if (pointEntity == null) {
-            pointEntity = new ControlPointEntity();
+        ControlPointEntity entity = this.findById(sceneCode);
+        if (entity == null) {
+            entity = new ControlPointEntity();
         }
 
-        BeanUtils.copyProperties(param, pointEntity);
+        BeanUtils.copyProperties(param, entity);
 
-        pointEntity.setUpdateTime(LocalDateTime.now());
+
+        entity.setUpdateTime(LocalDateTime.now());
         // 用户手动输入控制点
-       pointEntity.setStatus(1);
-        entityMapper.save(pointEntity);
+        entity.setStatus(1);
+        this.saveEntity(entity);
         log.info("控制点保存完成");
 
         // 初始化step2 数据
-        boolean isUploadImg = true;
-        initService.initDataStep2(sceneCode, "web", isUploadImg);
+        initService.initDataStep2(sceneCode, "web", true);
         log.info("初始化step2 完成");
         return Result.success();
     }
@@ -103,7 +103,7 @@ public class ControlPointServiceImpl implements ControlPointService {
         // 初始化step2 数据
         // 场景码
 
-        initService.testInitDataStep2(sceneCode, "web");
+//        initService.testInitDataStep2(sceneCode, "web");
         log.info("初始化step2 完成");
         return Result.success();
     }

+ 74 - 67
laser/src/main/java/com/fdkankan/indoor/core/service/impl/InitServiceImpl.java

@@ -287,7 +287,6 @@ public class InitServiceImpl implements InitService {
         removeInitDataStep2(sceneCode);
 
         String path = init.getPath();
-//        String laserDataPath = path + "/laserData";
         String laserDataPath = path;
         log.info("laserDataPath: {}", laserDataPath);
 
@@ -306,14 +305,16 @@ public class InitServiceImpl implements InitService {
         // step2 处理could.js、创建sitModel, 使用的是代码初始化,创建site_model, 处理原点、中心点、最大点、最小点
         processCould(sceneCode, laserDataPath, calculateEntity);
 
+        // step7 创建t_datasets表, 使用的是代码, 需要处理原点之后执行
+        DataSetPo dataSet = createDataSet(sceneCode, laserDataPath, calculateEntity.getRotation2(), from);
+
         // step1: vision.txt 漫游点处理,2021-12-30 处理vision.txt 创建filter表, 处理特殊点:firstView, 需要使用原点
-        createFilter(sceneCode, laserDataPath, calculateEntity, from);
+        createFilter(sceneCode, laserDataPath, calculateEntity, from, dataSet);
 
         // step6 创建t_configs表, 使用的是模板数据 , 需要firstView;
         createConfig(sceneCode);
 
-        // step7 创建t_datasets表, 使用的是代码, 需要处理原点之后执行
-        DataSetPo dataSet = createDataSet(sceneCode, laserDataPath, calculateEntity.getRotation2(), from);
+
 
         // step 10 创建平面图 t_tiled_map表, 需要用到dataSet数据
         tiledMapService.init(sceneCode, from);
@@ -517,8 +518,6 @@ public class InitServiceImpl implements InitService {
         controlPointService.saveEntity(entity);
         log.info("算法控制点保存完成");
 
-//        // 执行initData2 初始化
-//        this.initDataStep2(sceneCode, "age", isUploadImag);
 
         log.info("controlPoint控制点初始化完成");
     }
@@ -593,60 +592,60 @@ public class InitServiceImpl implements InitService {
         return Result.success();
     }
 
-    @Override
-    public void testInitDataStep2(String sceneCode, String from) {
-
-        Optional<InitEntity> optional = initMapper.findById(sceneCode);
-        if (!optional.isPresent()) {
-            throw new BaseRuntimeException(MsgCode.e3001, "此场景的数据初始化不存在");
-        }
-        InitEntity init = optional.get();
-
-        // 输入控制点,需要删除旧数据,重新初始化
-        removeInitDataStep2(sceneCode);
-
-        String path = "F:\\test\\project\\age_laser";
-        String laserDataPath = path + "/laserData";
-        log.info("laserDataPath: {}", laserDataPath);
-
-        // step:0 获取控制点
-        ControlPointEntity controlPoint = getControlPoint(sceneCode);
-        // 2021-09-13 初始化控制点计算,并保存数据库
-        ControlPointCalculateEntity calculateEntity = GisCoordinateUtil.calculateVariable(controlPoint);
-        calculateEntity.setId(sceneCode);
-        controlPointCalculateService.saveEntity(calculateEntity);
-        log.info("更新控制点计算完成");
-
-
-
-        // step2 处理could.js 使用的是代码初始化,创建site_model, 处理原点、中心点、最大点、最小点
-        processCould(sceneCode, laserDataPath, calculateEntity);
-
-        // step1: 2021-12-30 处理vision.txt 创建filter表, 处理特殊点:firstView, 需要使用原点
-        createFilter(sceneCode, laserDataPath, calculateEntity, from);
-
-        // step6 创建t_configs表, 使用的是模板数据 , 需要firstView;
-        createConfig(sceneCode);
-
-        // step7 创建t_datasets表, 使用的是代码, 需要处理原点之后执行, dataSet.orientation: 计算控制点结果rotation2
-        // 2021-09-23 会初始化一条信息到合并场景信息表t_merge_info, 存dataSet数据
-        DataSetPo dataSet = createDataSet(sceneCode, laserDataPath, calculateEntity.getRotation2(), from);
-
-        // Route数据重新计算, 并保存数据库
-//        routeService.updateRouteByControlPointCalculate(dataSet.getLocation(), dataSet.getOrientation(), sceneCode, calculateEntity, laserDataPath);
-
-
-
-        // step8 目录pano、pano_depth、webcloud上传oss,
-//        ossUploadDir(sceneCode, laserDataPath);
-
-        // 更新 initDataStep2 状态
-        init.setUpdateTime(LocalDateTime.now());
-        init.setStatus(1);
-        initMapper.save(init);
-        log.info("initDataStep_2处理完成");
-
-    }
+//    @Override
+//    public void testInitDataStep2(String sceneCode, String from) {
+//
+//        Optional<InitEntity> optional = initMapper.findById(sceneCode);
+//        if (!optional.isPresent()) {
+//            throw new BaseRuntimeException(MsgCode.e3001, "此场景的数据初始化不存在");
+//        }
+//        InitEntity init = optional.get();
+//
+//        // 输入控制点,需要删除旧数据,重新初始化
+//        removeInitDataStep2(sceneCode);
+//
+//        String path = "F:\\test\\project\\age_laser";
+//        String laserDataPath = path + "/laserData";
+//        log.info("laserDataPath: {}", laserDataPath);
+//
+//        // step:0 获取控制点
+//        ControlPointEntity controlPoint = getControlPoint(sceneCode);
+//        // 2021-09-13 初始化控制点计算,并保存数据库
+//        ControlPointCalculateEntity calculateEntity = GisCoordinateUtil.calculateVariable(controlPoint);
+//        calculateEntity.setId(sceneCode);
+//        controlPointCalculateService.saveEntity(calculateEntity);
+//        log.info("更新控制点计算完成");
+//
+//
+//
+//        // step2 处理could.js 使用的是代码初始化,创建site_model, 处理原点、中心点、最大点、最小点
+//        processCould(sceneCode, laserDataPath, calculateEntity);
+//
+//        // step1: 2021-12-30 处理vision.txt 创建filter表, 处理特殊点:firstView, 需要使用原点
+//        createFilter(sceneCode, laserDataPath, calculateEntity, from);
+//
+//        // step6 创建t_configs表, 使用的是模板数据 , 需要firstView;
+//        createConfig(sceneCode);
+//
+//        // step7 创建t_datasets表, 使用的是代码, 需要处理原点之后执行, dataSet.orientation: 计算控制点结果rotation2
+//        // 2021-09-23 会初始化一条信息到合并场景信息表t_merge_info, 存dataSet数据
+//        DataSetPo dataSet = createDataSet(sceneCode, laserDataPath, calculateEntity.getRotation2(), from);
+//
+//        // Route数据重新计算, 并保存数据库
+////        routeService.updateRouteByControlPointCalculate(dataSet.getLocation(), dataSet.getOrientation(), sceneCode, calculateEntity, laserDataPath);
+//
+//
+//
+//        // step8 目录pano、pano_depth、webcloud上传oss,
+////        ossUploadDir(sceneCode, laserDataPath);
+//
+//        // 更新 initDataStep2 状态
+//        init.setUpdateTime(LocalDateTime.now());
+//        init.setStatus(1);
+//        initMapper.save(init);
+//        log.info("initDataStep_2处理完成");
+//
+//    }
 
 
 
@@ -659,7 +658,7 @@ public class InitServiceImpl implements InitService {
      * @param calculateEntity
      * @param from
      */
-    private void createFilter(String sceneCode, String path, ControlPointCalculateEntity calculateEntity, String from) {
+    private void createFilter(String sceneCode, String path, ControlPointCalculateEntity calculateEntity, String from, DataSetPo dataSet) {
         path = path + "/vision.txt";
         if (!cn.hutool.core.io.FileUtil.isFile(path)) {
             throw new BaseRuntimeException(MsgCode.e3001, "vision.txt不存在");
@@ -668,7 +667,10 @@ public class InitServiceImpl implements InitService {
         // 2021-12-30 根据场景码查询特殊点的原点
         SpecialPointEntity sp = specialPointService.findBySceneCodeAndPoiKey(sceneCode, TypeConstant.POI_ORIGIN);
 
-        JSONArray jsonArray = convertToVision.createFilter(sceneCode, path, calculateEntity, from, false, sp);
+
+
+        JSONArray jsonArray = convertToVision.createFilter(sceneCode, path, calculateEntity, from, false,
+                sp.getGpsPoi(), dataSet.getOrientation(), dataSet.getLocation());
         FilterEntity entity = new FilterEntity();
         entity.setId(sceneCode);
         entity.setCreateTime(LocalDateTime.now());
@@ -680,6 +682,7 @@ public class InitServiceImpl implements InitService {
     }
 
 
+
     /**
      * 处理could.js 并做相应的计算
      *
@@ -916,7 +919,6 @@ public class InitServiceImpl implements InitService {
      *
      * @param sceneCode
      */
-//    private void createDataSet(String sceneCode, String laserDataPath, double orientation, String from) {
     private DataSetPo createDataSet(String sceneCode, String laserDataPath, double orientation, String from) {
         log.info("run createDataSet");
         DataSetEntity entity = new DataSetEntity();
@@ -926,7 +928,8 @@ public class InitServiceImpl implements InitService {
         List<SpecialPointEntity> spList = specialPointService.findBySceneCode(sceneCode);
         log.info("特殊点数量:{}", spList.size());
         // 正常是5条记录: db.getCollection('t_special_point').find({"sceneCode":"t97"})
-        if (spList.size() != 5) {
+        // 目前还没有firstView 初始点
+        if (spList.size() < 4) {
             throw new BaseRuntimeException(MsgCode.e3001, "特殊点表坐标异常");
         }
 
@@ -956,7 +959,11 @@ public class InitServiceImpl implements InitService {
 
         mergeDto.setPath(laserDataPath);
 
-        // 处理弧度, 使用计算控制点的rotation2
+        /**
+         * 处理弧度, 使用计算控制点的rotation2
+         * 2022-1-5 这一块跟自研不一样
+         */
+        log.info("dataSet.orientation: {}", orientation);
         if ("web".equals(from)) {
             mergeDto.setOrientation(orientation);
         } else {
@@ -964,6 +971,7 @@ public class InitServiceImpl implements InitService {
             mergeDto.setOrientation(0.0);
         }
 
+
         DataSetPo po = ModifyDataSets.mergeDataSetPo(map, mergeDto);
         entity.setData(Arrays.asList(po));
         dataSetService.save(entity);
@@ -1001,7 +1009,6 @@ public class InitServiceImpl implements InitService {
         Double[] poi = sp.getPoi();
         log.info("firstView: {}", sp.getPoi());
 
-//        String content = MyFileUtils.getResourceContent("data/config.json");
         String content = cn.hutool.core.io.FileUtil.readUtf8String(configConstant.templatePath + "/config.json");
 
         List<ConfigDto> dtoList = com.alibaba.fastjson.JSONArray.parseArray(content, ConfigDto.class);
@@ -1035,7 +1042,7 @@ public class InitServiceImpl implements InitService {
      */
     private void createRoute(String sceneCode, String path) {
         List<String> list = new ArrayList<>();
-//
+
         String routePath = path + "/final_freespace.csv";
         log.info("routePath: {}", routePath);
         if (!cn.hutool.core.io.FileUtil.isFile(routePath)) {

+ 4 - 1
laser/src/main/java/com/fdkankan/indoor/core/service/impl/MergeSceneServiceImpl.java

@@ -543,7 +543,10 @@ public class MergeSceneServiceImpl extends IBaseServiceImpl implements MergeScen
          * 2021-12-30 加入特殊点的原点
          * */
         SpecialPointEntity sp = specialPointService.findBySceneCodeAndPoiKey(sceneCode, TypeConstant.POI_ORIGIN);
-        JSONArray jsonArray = convertToVision.createFilter(sceneCode, path, dto, "web", true, sp);
+
+
+        // todo 2021-1-5 dataSet数据没传, 暂时没处理
+        JSONArray jsonArray = convertToVision.createFilter(sceneCode, path, dto, "web", true, sp.getGpsPoi(), null, null);
         FilterEntity entity = new FilterEntity();
         entity.setId(sceneCode);
         entity.setCreateTime(LocalDateTime.now());

+ 31 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/impl/OwenServiceImpl.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.indoor.base.constant.CmdConstant;
 import com.fdkankan.indoor.base.constant.ConfigConstant;
 import com.fdkankan.indoor.base.constant.TypeConstant;
+import com.fdkankan.indoor.base.convert.GisCoordinateUtil;
 import com.fdkankan.indoor.base.convert.quadTree.Solution;
 import com.fdkankan.indoor.base.exception.BaseRuntimeException;
 import com.fdkankan.indoor.base.util.AliYunOssUtil;
@@ -14,6 +15,7 @@ import com.fdkankan.indoor.base.util.CmdUtils;
 import com.fdkankan.indoor.base.util.RedisUtil;
 import com.fdkankan.indoor.base.util.Result;
 import com.fdkankan.indoor.core.entity.*;
+import com.fdkankan.indoor.core.entity.dto.ControlPointDto;
 import com.fdkankan.indoor.core.entity.dto.PoiTypeGroupDto;
 import com.fdkankan.indoor.core.mapper.OwenMapper;
 import com.fdkankan.indoor.core.service.InitService;
@@ -326,6 +328,35 @@ public class OwenServiceImpl implements OwenService {
         return Result.success("替换数量:" + i);
     }
 
+    @Override
+    public Result controllerPoint(ControlPointEntity param) {
+        ControlPointCalculateEntity entity = GisCoordinateUtil.calculateVariable(param);
+        // 本地转gps
+        double[] location1 = param.getAgeControlLocation1();
+
+
+        double[] resGps1 = GisCoordinateUtil.transformLocationToBL(location1[0], location1[1], entity);
+        log.warn("控制点1,gps1_x: {}", resGps1[0]);
+        log.warn("控制点1,gps1_y: {}", resGps1[1]);
+
+        // gps转本地
+        double[] resLocation1 = GisCoordinateUtil.transformBLToLocation(resGps1[0], resGps1[1], entity);
+        log.warn("控制点1,location1_x: {}", resLocation1[0]);
+        log.warn("控制点1,location1_y: {}", resLocation1[1]);
+
+        log.info("");
+        double[] location2 = param.getAgeControlLocation2();
+        double[] resGps2 = GisCoordinateUtil.transformLocationToBL(location2[0], location2[1], entity);
+        log.warn("控制点2,gps2_x: {}", resGps2[0]);
+        log.warn("控制点2,gps2_y: {}", resGps2[1]);
+
+        // gps转本地
+        double[] resLocation2 = GisCoordinateUtil.transformBLToLocation(resGps2[0], resGps2[1], entity);
+        log.warn("控制点2,location2_x: {}", resLocation2[0]);
+        log.warn("控制点2,location2_y: {}", resLocation2[1]);
+        return null;
+    }
+
 
     private String getTitleByIndexHtml(String indexPath){
         if (!FileUtil.isFile(indexPath)) {

+ 1 - 1
laser/src/main/java/com/fdkankan/indoor/core/service/impl/TiledMapServiceImpl.java

@@ -493,7 +493,7 @@ public class TiledMapServiceImpl extends IBaseServiceImpl implements TiledMapSer
         // 使用dataSet.location
         dto.setLocation(location);
 
-        // 计算 2021-09-14
+        // 计算 2021-09-14 控制平面图的旋转角度
         dto.setOrientation(PlanGraph.tiledMapOrientation(orientation));
         List<TiledMapDto> list = new ArrayList<>();
         list.add(dto);