Browse Source

完成控制点、数据初始化

wuweihao 4 years ago
parent
commit
2a3f086681
29 changed files with 966 additions and 949 deletions
  1. 20 0
      laser/src/main/java/com/fdkankan/indoor/base/config/TransactionConfig.java
  2. 6 5
      laser/src/main/java/com/fdkankan/indoor/base/convert/ConvertToPanoInfoFor4dkk.java
  3. 213 214
      laser/src/main/java/com/fdkankan/indoor/base/convert/GetRoute.java
  4. 40 39
      laser/src/main/java/com/fdkankan/indoor/base/convert/ModifyCloud.java
  5. 48 3
      laser/src/main/java/com/fdkankan/indoor/base/convert/TransformGPS.java
  6. 115 36
      laser/src/main/java/com/fdkankan/indoor/base/convert/kesar/AStar.java
  7. 13 1
      laser/src/main/java/com/fdkankan/indoor/base/convert/kesar/Coord.java
  8. 17 7
      laser/src/main/java/com/fdkankan/indoor/base/convert/kesar/MapInfo.java
  9. 15 7
      laser/src/main/java/com/fdkankan/indoor/base/convert/kesar/Node.java
  10. 53 0
      laser/src/main/java/com/fdkankan/indoor/core/controller/ControlPointController.java
  11. 3 3
      laser/src/main/java/com/fdkankan/indoor/core/controller/InitController.java
  12. 0 164
      laser/src/main/java/com/fdkankan/indoor/core/controller/SiteModelController.java
  13. 53 0
      laser/src/main/java/com/fdkankan/indoor/core/controller/TestController.java
  14. 35 0
      laser/src/main/java/com/fdkankan/indoor/core/entity/ControlPointEntity.java
  15. 30 0
      laser/src/main/java/com/fdkankan/indoor/core/entity/InitEntity.java
  16. 16 0
      laser/src/main/java/com/fdkankan/indoor/core/entity/OwenEntity.java
  17. 13 0
      laser/src/main/java/com/fdkankan/indoor/core/mapper/ControlPointMapper.java
  18. 14 0
      laser/src/main/java/com/fdkankan/indoor/core/mapper/InitMapper.java
  19. 14 0
      laser/src/main/java/com/fdkankan/indoor/core/mapper/OwenMapper.java
  20. 15 0
      laser/src/main/java/com/fdkankan/indoor/core/service/ControlPointService.java
  21. 2 0
      laser/src/main/java/com/fdkankan/indoor/core/service/InitService.java
  22. 19 0
      laser/src/main/java/com/fdkankan/indoor/core/service/OwenService.java
  23. 0 31
      laser/src/main/java/com/fdkankan/indoor/core/service/SiteModelService.java
  24. 2 0
      laser/src/main/java/com/fdkankan/indoor/core/service/TestService.java
  25. 52 0
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/ControlPointServiceImpl.java
  26. 77 26
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/InitServiceImpl.java
  27. 72 0
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/OwenServiceImpl.java
  28. 9 3
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/RouteServiceImpl.java
  29. 0 410
      laser/src/main/java/com/fdkankan/indoor/core/service/impl/SiteModelServiceImpl.java

+ 20 - 0
laser/src/main/java/com/fdkankan/indoor/base/config/TransactionConfig.java

@@ -0,0 +1,20 @@
+package com.fdkankan.indoor.base.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.MongoDbFactory;
+import org.springframework.data.mongodb.MongoTransactionManager;
+
+/**
+ * Created by owen on 2021/7/29 0029 17:26
+ * mongodb 事务配置类
+ */
+@Configuration
+public class TransactionConfig {
+
+    @Bean
+    MongoTransactionManager transactionManager(MongoDbFactory factory){
+        return new MongoTransactionManager(factory);
+    }
+
+}

+ 6 - 5
laser/src/main/java/com/fdkankan/indoor/base/convert/ConvertToPanoInfoFor4dkk.java

@@ -5,6 +5,7 @@ import java.time.LocalDateTime;
 
 import com.fdkankan.indoor.base.constant.TypeConstant;
 import com.fdkankan.indoor.base.util.SnowFlakeUUidUtils;
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
 import com.fdkankan.indoor.core.entity.SpecialPointEntity;
 import com.fdkankan.indoor.core.service.SpecialPointService;
 import lombok.extern.slf4j.Slf4j;
@@ -55,7 +56,7 @@ public class ConvertToPanoInfoFor4dkk {
 		return result;
 	}
 	
-	private  JSONArray createPanoInfos(String sceneCode, JSONArray panoInfos) {
+	private  JSONArray createPanoInfos(String sceneCode, JSONArray panoInfos,  ControlPointEntity dto) {
 		
 		JSONArray laserPanos = new JSONArray();
 		for(int i=0;i<panoInfos.size();++i) {
@@ -84,8 +85,8 @@ public class ConvertToPanoInfoFor4dkk {
 			floor_location[1] = position2.getDouble("y");
 			floor_location[2] = position2.getDouble("z");
 			//gis����
-			double[] _location = TransformGPS.convert(location);
-			double[] _floor_location = TransformGPS.convert(floor_location);
+			double[] _location = TransformGPS.convert(location,dto);
+			double[] _floor_location = TransformGPS.convert(floor_location, dto);
 			location[0] = _location[0];
 			location[1] = _location[1];
 			floor_location[0] = _floor_location[0];
@@ -144,14 +145,14 @@ public class ConvertToPanoInfoFor4dkk {
 	}
 
 
-	public  JSONArray createFilter(String sceneCode, String path){
+	public  JSONArray createFilter(String sceneCode, String path, ControlPointEntity dto){
 		if (!cn.hutool.core.io.FileUtil.isFile(path)) {
 			log.error("文件路径不存在: {}", path);
 			throw new RuntimeException("文件路径不存在");
 		}
 		try {
 			JSONArray panoInfos = readVisionTxt(path);
-			return createPanoInfos(sceneCode, panoInfos);
+			return createPanoInfos(sceneCode, panoInfos, dto);
 		} catch (IOException e) {
 			e.printStackTrace();
 		}

+ 213 - 214
laser/src/main/java/com/fdkankan/indoor/base/convert/GetRoute.java

@@ -1,53 +1,90 @@
 package com.fdkankan.indoor.base.convert;
 
+import java.util.ArrayList;
 import java.util.List;
 
+
 import com.fdkankan.indoor.base.convert.kesar.AStar;
 import com.fdkankan.indoor.base.convert.kesar.Coord;
 import com.fdkankan.indoor.base.convert.kesar.MapInfo;
 import com.fdkankan.indoor.base.convert.kesar.Node;
-
-
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
 import com.fdkankan.indoor.core.entity.dto.RouteInputDto;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 
-/**
- * star算法
- * 最优路径算法
- */
-public class GetRoute {
-
-	//	public static String inputFilePath = "F:\\2021\\navvis\\���Ի���\\test3(v2.7.3)\\routeMap.txt";
-	public static String inputFilePath = "F:\\test\\project\\age_laser\\routeMap.txt";
-
-	// 起始点
-	private static float startX = 1.745f;
-	private static float startY = -14.45f;
-	private static float startZ = -0.042078f;
+public class GetRoute_1
+{
+
+	/*
+	public static void main(String[] args)
+	{
+		int[][] maps = {
+				{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+				{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+				{ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 },
+				{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+				{ 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
+				{ 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
+				{ 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }
+				};
+		MapInfo info=new MapInfo(maps,maps[0].length, maps.length,new Node(1, 1), new Node(4, 5));
+		new AStar().start(info);
+		printMap(maps);
+	}
+	
+	public static void printMap(int[][] maps)
+	{
+		for (int i = 0; i < maps.length; i++)
+		{
+			for (int j = 0; j < maps[i].length; j++)
+			{
+				System.out.print(maps[i][j] + " ");
+			}
+			System.out.println();
+		}
+	}
+	*/
 
-	// 终点
-	private static float endX = 3.74493f;
-	private static float endY = -14.4489f;
-	private static float endZ = -0.042078f;
 
+	/**
+	 * 读取文件,获取文件内容
+	 *   F:\test\project\age_laser\routeMap.txt
+	 *
+	 *   list 是routeMap的结果集
+	 * @return
+	 */
+	public static JSONArray getRoute(List<String> list, RouteInputDto dto, ControlPointEntity controlPoint){
+		try {
+			JSONArray maps = readMap(list, dto);
+			MapInfo info=new MapInfo(maps,start,end);
+			List<Node> path = g_AStar.start(info);
+			JSONArray jsonArray = convertFromPath(path, dto, controlPoint);
+			return jsonArray;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+//	public static String inputFilePath = "F:\\2021\\navvis\\���Ի���\\test3(v2.7.3)\\map.txt";
+	private static String inputFilePath = "F:\\test\\project\\age_laser\\routeMap.txt";
+	
+	private static float startX = 5.358192084229412f;
+	private static float startY = -7.905951689748807f;
+	private static float startZ = -1.3145928255248511f;
+	
+	private static float endX = -2.143694831230416f;
+	private static float endY = -3.3754012098200965f;
+	private static float endZ = -1.1803865408990568f;
 	private static int minStartId = -1;
 	private static int minEndId = -1;
+	
 	private static Node start = null;
 	private static Node end = null;
 	private static AStar g_AStar = new AStar();
 
-	//"id" "x" ,"y " ,"z" ,"weight" ,"p1",...,"p8"
-	// lat:113, [0], x, lon:22, [1], y
-
-	/**
-	 *
-	 * @param list 算法部 生成的文件
-	 * @param dto
-	 * @return
-	 * @throws Exception
-	 */
-	private static JSONArray init(List<String> list, RouteInputDto dto) throws Exception {
+	private static JSONArray readMap(List<String> list, RouteInputDto dto) throws Exception {
 //		List<String> list = FileUtil.readFileByLines2(inputFilePath);
 		JSONArray maps = new JSONArray();
 
@@ -59,6 +96,7 @@ public class GetRoute {
 		float endY = dto.getDestination_latitude();
 		float endZ = dto.getDestination_z();
 
+
 		Coord _start = new Coord(startX,startY,startZ);
 		Coord _end = new Coord(endX,endY,endZ);
 
@@ -84,6 +122,7 @@ public class GetRoute {
 
 			item.put("linkedIds", linkedIds.substring(0, linkedIds.length()-1));
 			maps.add(item);
+
 			Coord coord = new Coord(Float.valueOf(strArray[0]),Float.valueOf(strArray[1]),Float.valueOf(strArray[2]));
 			float _startDistance = g_AStar.calcH(_start, coord);
 			if(_startDistance<startDistance) {
@@ -109,86 +148,44 @@ public class GetRoute {
 		return maps;
 	}
 
-
-
-	private static JSONArray init() throws Exception {
-		List<String> list = FileUtil.readFileByLines2(inputFilePath);
-		JSONArray maps = new JSONArray();
-
-//		float startX = dto.getSource_longitude();
-//		float startY = dto.getSource_latitude();
-//		float startZ = dto.getSource_z();
-//
-//		float endX = dto.getDestination_longitude();
-//		float endY = dto.getDestination_latitude();
-//		float endZ = dto.getDestination_z();
-
-		Coord _start = new Coord(startX,startY,startZ);
-		Coord _end = new Coord(endX,endY,endZ);
-
-		float startDistance=1000f;
-		float endDistance = 1000f;
-
-		for(int i=0;i<list.size();++i) {
-			String str = list.get(i);
-			String[] strArray = str.trim().split(" ");
-			JSONObject item = new JSONObject();
-			//item.put("id", i);
-			item.put("x", strArray[0]);
-			item.put("y", strArray[1]);
-			item.put("z", strArray[2]);
-			item.put("weight", strArray[3]);
-
-			String linkedIds = "";
-			for(int j = 4;j<strArray.length;++j) {
-				if(Integer.valueOf(strArray[j])>0) {
-					linkedIds += strArray[j]+",";
-				}
-			}
-
-			item.put("linkedIds", linkedIds.substring(0, linkedIds.length()-1));
-			maps.add(item);
-			Coord coord = new Coord(Float.valueOf(strArray[0]),Float.valueOf(strArray[1]),Float.valueOf(strArray[2]));
-			float _startDistance = g_AStar.calcH(_start, coord);
-			if(_startDistance<startDistance) {
-				minStartId = i;
-				startDistance = _startDistance;
-			}
-			float _endDistance = g_AStar.calcH(_end, coord);
-			if(_endDistance<endDistance) {
-				minEndId = i;
-				endDistance = _endDistance;
-			}
+	private static JSONArray convertFromPath(List<Node> mappath, RouteInputDto dto, ControlPointEntity controlPoint) {
+		if(mappath == null||mappath.size() == 0) {
+			return null;
 		}
 
-		JSONObject virtualStart = maps.getJSONObject(minStartId);
-		JSONObject virtualEnd = maps.getJSONObject(minEndId);
-		Coord startVirtualCoord = new Coord((float)virtualStart.getDouble("x"), (float)virtualStart.getDouble("y"),(float)virtualStart.getDouble("z"));
-		Coord endVirtualCoord = new Coord((float)virtualEnd.getDouble("x"), (float)virtualEnd.getDouble("y"),(float)virtualEnd.getDouble("z"));
-		float startH = g_AStar.calcH(startVirtualCoord, endVirtualCoord);
+		// 起始点
+		float startX = dto.getSource_longitude();
+		float startY = dto.getSource_latitude();
+		float startZ = dto.getSource_z();
 
-		start = new Node(minStartId,0,startVirtualCoord, null, 0, startH);
-		end = new Node(minEndId,0,endVirtualCoord, null, 0, 0);
+		// 终点
+		float endX = dto.getDestination_longitude();
+		float endY = dto.getDestination_latitude();
+		float endZ = dto.getDestination_z();
 
-		return maps;
-	}
 
-	private static JSONArray convertFromPath(List<Node> path) {
-		if(path == null||path.size() == 0) {
-			return null;
+		List<Node> path = new ArrayList<Node>();
+		for(int i = mappath.size()-1;i>-1;--i) {
+			Node node = mappath.get(i);
+			path.add(node);
 		}
 
-
 		JSONArray route = new JSONArray();
 
 		//起点不在path上,path的第一个点对应的是格子
 		JSONObject start = new JSONObject();
+//		start.put("longitude", startX);
+//		start.put("latitude", startY);
+
 		double[] startPosition = {startX,startY};
-		startPosition = TransformGPS.convert(startPosition);
+		startPosition = TransformGPS.convert(startPosition, controlPoint);
 		start.put("longitude", startPosition[0]);
 		start.put("latitude", startPosition[1]);
 		start.put("z", startZ);
 		float[] location = new float[3];
+//		location[0] = startX;
+//		location[1] = startY;
+
 		location[0] = (float)startPosition[0];
 		location[1] = (float)startPosition[1];
 		location[2] = startZ;
@@ -199,24 +196,30 @@ public class GetRoute {
 		start.put("instruction", null);
 		route.add(start);
 
-		float[] virtualendPosition = new float[3];
-
+		float[] virtualEndPosition = new float[3];
 		for(int i=0;i<path.size();++i) {
 			Node node = path.get(i);
 			JSONObject item = new JSONObject();
+
 			//转经纬度
 			double[] position = {node.coord.x,node.coord.y};
-			position = TransformGPS.convert(position);
+			position = TransformGPS.convert(position, controlPoint);
 			item.put("longitude", position[0]);
 			item.put("latitude", position[1]);
 
+//			item.put("longitude", node.coord.x);
+//			item.put("latitude", node.coord.y);
 			item.put("z", node.coord.z);
 			location = new float[3];
+//			location[0] = node.coord.x;
+//			location[1] = node.coord.y;
 
 			location[0] = (float)position[0];
 			location[1] = (float)position[1];
+
 			location[2] = node.coord.z;
 			item.put("location", location);
+			item.put("id", node.id);
 
 			JSONObject instruction = null;
 
@@ -230,9 +233,8 @@ public class GetRoute {
 				item.put("instruction", instruction);
 			}
 			else {
-				int j = i-1;
-				Node prenode = path.get(j);
-				JSONObject preitem = route.getJSONObject(j);
+				Node prenode = path.get(i-1);
+				JSONObject preitem = route.getJSONObject(i);
 				float distance_to_previous = g_AStar.calcH(node.coord,prenode.coord);
 				item.put("distance_to_previous", distance_to_previous);
 				float distance = (float)preitem.getDouble("distance")+distance_to_previous;
@@ -242,21 +244,25 @@ public class GetRoute {
 					instruction.put("type", "destination_projection_to_navgraph");
 					item.put("instruction", instruction);
 
-					virtualendPosition[0] = (float)node.coord.x;
-					virtualendPosition[1] = (float)node.coord.y;
-					virtualendPosition[2] = (float)node.coord.z;
+					virtualEndPosition[0] = node.coord.x;
+					virtualEndPosition[1] = node.coord.y;
+					virtualEndPosition[2] = node.coord.z;
+
 				}
 				else {
 					item.put("instruction", instruction);
 				}
+				System.out.println("distance:"+distance_to_previous);
 			}
+
 			route.add(item);
 		}
 
 		JSONObject endItem = route.getJSONObject(route.size()-1);
 		JSONObject end = new JSONObject();
 		double[] endPosition = {endX,endY};
-		endPosition = TransformGPS.convert(endPosition);
+		endPosition = TransformGPS.convert(endPosition, controlPoint);
+
 		end.put("longitude", endPosition[0]);
 		end.put("latitude", endPosition[1]);
 		end.put("z", endZ);
@@ -265,8 +271,8 @@ public class GetRoute {
 		location[1] = (float)endPosition[1];
 		location[2] = endZ;
 		end.put("location", location);
-		float enddistance = g_AStar.calcH(new Coord(virtualendPosition[0],virtualendPosition[1],virtualendPosition[2]),new Coord(endX,endY,endZ));
-		end.put("distance", enddistance+(float)endItem.getDouble("distance_to_previous"));
+		float enddistance = g_AStar.calcH(new Coord(virtualEndPosition[0],virtualEndPosition[1],virtualEndPosition[2]),new Coord(endX,endY,endZ));
+		end.put("distance", enddistance+(float)endItem.getDouble("distance"));
 		end.put("distance_to_previous", enddistance);
 		end.put("instruction", null);
 		route.add(end);
@@ -275,166 +281,159 @@ public class GetRoute {
 	}
 
 
-
-	private static JSONArray convertFromPath(List<Node> path, RouteInputDto dto) {
-		if(path == null||path.size() == 0) {
+	private static JSONArray readMap() throws Exception {
+		List<String> list = FileUtil.readFileByLines2(inputFilePath);
+		JSONArray maps = new JSONArray();
+		
+		Coord _start = new Coord(startX,startY,startZ);
+		Coord _end = new Coord(endX,endY,endZ);
+		
+		float startDistance=1000f;
+		float endDistance = 1000f;
+		
+		for(int i=0;i<list.size();++i) {
+			String str = list.get(i);
+			String[] strArray = str.trim().split(" ");
+			JSONObject item = new JSONObject();
+			//item.put("id", i);
+			item.put("x", strArray[0]);
+			item.put("y", strArray[1]);
+			item.put("z", strArray[2]);
+			item.put("weight", strArray[3]);
+			
+			String linkedIds = "";
+			for(int j = 4;j<strArray.length;++j) {
+				if(Integer.valueOf(strArray[j])>0) {
+					linkedIds += strArray[j]+",";
+				}
+			}
+			
+			item.put("linkedIds", linkedIds.substring(0, linkedIds.length()-1));
+			maps.add(item);
+			
+			Coord coord = new Coord(Float.valueOf(strArray[0]),Float.valueOf(strArray[1]),Float.valueOf(strArray[2]));
+			float _startDistance = g_AStar.calcH(_start, coord);
+			if(_startDistance<startDistance) {
+				minStartId = i;
+				startDistance = _startDistance;
+			}
+			float _endDistance = g_AStar.calcH(_end, coord);
+			if(_endDistance<endDistance) {
+				minEndId = i;
+				endDistance = _endDistance;
+			}
+		}
+		
+		JSONObject virtualStart = maps.getJSONObject(minStartId);
+		JSONObject virtualEnd = maps.getJSONObject(minEndId);
+		Coord startVirtualCoord = new Coord((float)virtualStart.getDouble("x"), (float)virtualStart.getDouble("y"),(float)virtualStart.getDouble("z"));
+		Coord endVirtualCoord = new Coord((float)virtualEnd.getDouble("x"), (float)virtualEnd.getDouble("y"),(float)virtualEnd.getDouble("z"));
+		float startH = g_AStar.calcH(startVirtualCoord, endVirtualCoord);		
+		
+		start = new Node(minStartId,0,startVirtualCoord, null, 0, startH);
+		end = new Node(minEndId,0,endVirtualCoord, null, 0, 0);
+		
+		return maps;
+	}
+	
+	private static JSONArray convertFromPath(List<Node> mappath) {
+		if(mappath == null||mappath.size() == 0) {
 			return null;
 		}
-
-		// 起始点
-		float startX = dto.getSource_longitude();
-		float startY = dto.getSource_latitude();
-		float startZ = dto.getSource_z();
-
-		// 终点
-		float endX = dto.getDestination_longitude();
-		float endY = dto.getDestination_latitude();
-		float endZ = dto.getDestination_z();
-
+		
+		List<Node> path = new ArrayList<Node>();
+		for(int i = mappath.size()-1;i>-1;--i) {
+			Node node = mappath.get(i);
+			path.add(node);
+		}
+		
 		JSONArray route = new JSONArray();
-
-		//起点不在path上,path的第一个点对应的是格子
+		
+		//��㲻��path�ϣ�path�ĵ�һ�����Ӧ���Ǹ���
 		JSONObject start = new JSONObject();
-		double[] startPosition = {startX,startY};
-		startPosition = TransformGPS.convert(startPosition);
-		start.put("longitude", startPosition[0]);
-		start.put("latitude", startPosition[1]);
+		start.put("longitude", startX);
+		start.put("latitude", startY);
 		start.put("z", startZ);
 		float[] location = new float[3];
-		location[0] = (float)startPosition[0];
-		location[1] = (float)startPosition[1];
+		location[0] = startX;
+		location[1] = startY;
 		location[2] = startZ;
-
 		start.put("location", location);
 		start.put("distance", 0);
 		start.put("distance_to_previous", 0);
 		start.put("instruction", null);
 		route.add(start);
-
-		float[] endVirPosition = new float[3];
-		JSONObject endItem = new JSONObject();
-
+		
 		for(int i=0;i<path.size();++i) {
 			Node node = path.get(i);
 			JSONObject item = new JSONObject();
-			//转经纬度
-			double[] position = {node.coord.x,node.coord.y};
-			position = TransformGPS.convert(position);
-			item.put("longitude", position[0]);
-			item.put("latitude", position[1]);
-
+			item.put("longitude", node.coord.x);
+			item.put("latitude", node.coord.y);
 			item.put("z", node.coord.z);
 			location = new float[3];
-
-			location[0] = (float)position[0];
-			location[1] = (float)position[1];
+			location[0] = node.coord.x;
+			location[1] = node.coord.y;
 			location[2] = node.coord.z;
 			item.put("location", location);
-
+			item.put("id", node.id);
+			
 			JSONObject instruction = null;
-
+			
 			if(i == 0) {
 				item.put("distance", g_AStar.calcH(node.coord,new Coord(startX,startY,startZ)));
 				item.put("distance_to_previous", g_AStar.calcH(node.coord,new Coord(startX,startY,startZ)));
 				item.put("instruction", instruction);
-
+				
 				instruction = new JSONObject();
 				instruction.put("type", "source_projection_to_navgraph");
 				item.put("instruction", instruction);
 			}
 			else {
-				int j = i-1;
-				Node prenode = path.get(j);
-				JSONObject preitem = route.getJSONObject(j);
-				float distance = g_AStar.calcH(node.coord,prenode.coord);
-				item.put("distance", distance);
-				float distance_to_previous = (float)preitem.getDouble("distance_to_previous")+distance;
+				Node prenode = path.get(i-1);
+				JSONObject preitem = route.getJSONObject(i);
+				float distance_to_previous = g_AStar.calcH(node.coord,prenode.coord);
 				item.put("distance_to_previous", distance_to_previous);
+				float distance = (float)preitem.getDouble("distance")+distance_to_previous;
+				item.put("distance", distance);
 				if(i == path.size()-1) {
 					instruction = new JSONObject();
 					instruction.put("type", "destination_projection_to_navgraph");
 					item.put("instruction", instruction);
-
-					endVirPosition[0] = node.coord.x;
-					endVirPosition[1] = node.coord.y;
-					endVirPosition[2] = node.coord.z;
-					endItem.put("distance_to_previous",distance_to_previous);
 				}
 				else {
 					item.put("instruction", instruction);
 				}
+				System.out.println("distance:"+distance_to_previous);
 			}
+			
 			route.add(item);
 		}
-
-
+		
+		JSONObject endItem = route.getJSONObject(route.size()-1);
 		JSONObject end = new JSONObject();
-		double[] endPosition = {endX,endY};
-		endPosition = TransformGPS.convert(endPosition);
-		end.put("longitude", endPosition[0]);
-		end.put("latitude", endPosition[1]);
+		end.put("longitude", endX);
+		end.put("latitude", endY);
 		end.put("z", endZ);
 		location = new float[3];
-		location[0] = (float)endPosition[0];
-		location[1] = (float)endPosition[1];
+		location[0] = endX;
+		location[1] = endY;
 		location[2] = endZ;
 		end.put("location", location);
-		float enddistance = g_AStar.calcH(new Coord(endVirPosition[0],endVirPosition[1],endVirPosition[2]),new Coord(endX,endY,endZ));
+		float enddistance = g_AStar.calcH(new Coord((float)endItem.getDouble("longitude"),(float)endItem.getDouble("latitude"),(float)endItem.getDouble("z")),new Coord(endX,endY,endZ));
 		end.put("distance", enddistance+(float)endItem.getDouble("distance_to_previous"));
 		end.put("distance_to_previous", enddistance);
 		end.put("instruction", null);
 		route.add(end);
-
+		
 		return route;
 	}
-
-	/**
-	 * 读取文件,获取文件内容
-	 * @param inPath F:\test\project\age_laser\routeMap.txt
-	 * @return
-	 */
-//	public static JSONArray createRoute(String inPath){
-//		try {
-//			JSONArray maps = readMap(inPath);
-//			return maps;
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
-//		return null;
-//	}
-
-	/**
-	 * 读取文件,获取文件内容
-	 *   F:\test\project\age_laser\routeMap.txt
-	 *
-	 *   list 是routeMap的结果集
-	 * @return
-	 */
-	public static JSONArray getRoute(List<String> list, RouteInputDto dto){
-		try {
-			JSONArray maps = init(list, dto);
-			MapInfo info=new MapInfo(maps,start,end);
-			List<Node> path = g_AStar.start(info);
-			JSONArray jsonArray = convertFromPath(path, dto);
-			return jsonArray;
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return null;
+	
+	public static void main(String[] args) throws Exception
+	{
+		JSONArray maps = readMap();
+		MapInfo info=new MapInfo(maps,start,end);
+		List<Node> path = g_AStar.start(info);
+		convertFromPath(path);
 	}
 
-	public static void main(String[] args) {
-		String inputFilePath = "F:\\test\\project\\age_laser\\routeMap.txt";
-		try {
-			JSONArray maps = init();
-
-			MapInfo info=new MapInfo(maps,start,end);
-			List<Node> path = g_AStar.start(info);
-			JSONArray jsonArray = convertFromPath(path);
-			System.out.println(jsonArray);
-		}
-		catch(Exception e){
-			e.printStackTrace();
-		}
-	}
 }

+ 40 - 39
laser/src/main/java/com/fdkankan/indoor/base/convert/ModifyCloud.java

@@ -3,6 +3,7 @@ package com.fdkankan.indoor.base.convert;
 import java.io.IOException;
 
 
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 
@@ -46,22 +47,22 @@ public class ModifyCloud {
 	}
 
 	//把原点(0,0,0)的坐标转换成gps坐标
-	public static double[] convertFromOrigin() {
+	public static double[] convertFromOrigin(ControlPointEntity dto) {
 		double[] location = {0,0,0};
-		location = TransformGPS.convert(location);
+		location = TransformGPS.convert(location, dto);
 		return location;
 	}
 
 	//把boundingbox的顶点和中心点转换成gps坐标
-	public static JSONObject convertFromBoundingBox(JSONObject boundingBox) {
+	public static JSONObject convertFromBoundingBox(JSONObject boundingBox, ControlPointEntity dto) {
 		double[] max = {boundingBox.getDouble("maxX"),boundingBox.getDouble("maxY"),boundingBox.getDouble("maxZ")};
 		double[] min = {boundingBox.getDouble("minX"),boundingBox.getDouble("minY"),boundingBox.getDouble("minZ")};
 		double[] centre = {boundingBox.getDouble("centreX"),boundingBox.getDouble("centreY"),boundingBox.getDouble("centreZ")};
 
 
-		max = TransformGPS.convert(max);
-		min = TransformGPS.convert(min);
-		centre = TransformGPS.convert(centre);
+		max = TransformGPS.convert(max, dto);
+		min = TransformGPS.convert(min, dto);
+		centre = TransformGPS.convert(centre, dto);
 		
 		JSONObject result = new JSONObject();
 		result.put("max", max);
@@ -70,37 +71,37 @@ public class ModifyCloud {
 		return result;
 	}
 	
-	public static void main(String args[]) {
-		String inputFilePath = "F:\\test\\project\\age_laser\\cloud.js";
-		try
-		{
-			//修改cloud.js文件
-			JSONObject info = fixCloud(inputFilePath);
-			//将原点转换成gis坐标,后续要写到datasets里
-			double[] doubles = convertFromOrigin();//原点 0,0,0 key:origin
-//将boundingbox坐标转换成gis坐标,site_model(第二张表)需要 , 这个获取z_max, z_min
-			JSONObject boundingbox = getBoundingBox(info);
-
-			Object minZ = boundingbox.get("minZ");
-
-
-			JSONObject resJson = convertFromBoundingBox(boundingbox);//boundingbox_min,boundingbox_max,centre
-			Object max = resJson.get("max");
-			Object min = resJson.get("min");
-			Object centre = resJson.get("centre");
-
-			JSONArray object = resJson.getJSONArray("max");
-			System.out.println();
-			// 0:113, 1:22
-			double[] max1 = {object.getDouble(0), object.getDouble(1)};
-
-			System.out.println();
-
-		}
-		catch(Exception e)
-		{
-			e.printStackTrace();
-		}
-		
-	}
+//	public static void main(String args[]) {
+//		String inputFilePath = "F:\\test\\project\\age_laser\\cloud.js";
+//		try
+//		{
+//			//修改cloud.js文件
+//			JSONObject info = fixCloud(inputFilePath);
+//			//将原点转换成gis坐标,后续要写到datasets里
+//			double[] doubles = convertFromOrigin();//原点 0,0,0 key:origin
+////将boundingbox坐标转换成gis坐标,site_model(第二张表)需要 , 这个获取z_max, z_min
+//			JSONObject boundingbox = getBoundingBox(info);
+//
+//			Object minZ = boundingbox.get("minZ");
+//
+//
+//			JSONObject resJson = convertFromBoundingBox(boundingbox);//boundingbox_min,boundingbox_max,centre
+//			Object max = resJson.get("max");
+//			Object min = resJson.get("min");
+//			Object centre = resJson.get("centre");
+//
+//			JSONArray object = resJson.getJSONArray("max");
+//			System.out.println();
+//			// 0:113, 1:22
+//			double[] max1 = {object.getDouble(0), object.getDouble(1)};
+//
+//			System.out.println();
+//
+//		}
+//		catch(Exception e)
+//		{
+//			e.printStackTrace();
+//		}
+//
+//	}
 }

+ 48 - 3
laser/src/main/java/com/fdkankan/indoor/base/convert/TransformGPS.java

@@ -1,6 +1,8 @@
 package com.fdkankan.indoor.base.convert;
 
 
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
+
 /***
  * 控制点(三维坐标)坐标转经纬度
  */
@@ -14,14 +16,57 @@ public class TransformGPS {
 	
 	public static double[] controlLocation2 = {6.059886f,-12.197689f}; // 四维看看坐标
 	public static double[] controlCoordinate2 = {113.59571900944f,22.366554639591f};  //gps坐标
+
+
+	public static double[] convert(double[] position, ControlPointEntity dto) {
+		double[] controlLocation1 = dto.getAgeControlLocation1();
+		double[] controlLocation2 = dto.getAgeControlLocation2();
+
+		double[] controlCoordinate1 = dto.getGpsControlCoordinate1();
+		double[] controlCoordinate2 = dto.getGpsControlCoordinate2();
+
+
+		GisCoordinateUtil.calculateVariable (
+				controlCoordinate1[0],controlCoordinate1[1],
+				controlLocation1[0],controlLocation1[1],
+				controlCoordinate2[0],controlCoordinate2[1],
+				controlLocation2[0],controlLocation2[1]);
+		double[] d = GisCoordinateUtil.transformLocationToBL(position[0], position[1]);
+		return d;
+	}
+
+	public static double[][] convert(double[][] positions,  ControlPointEntity dto){
+
+		double[] controlLocation1 = dto.getAgeControlLocation1();
+		double[] controlLocation2 = dto.getAgeControlLocation2();
+
+		double[] controlCoordinate1 = dto.getGpsControlCoordinate1();
+		double[] controlCoordinate2 = dto.getGpsControlCoordinate2();
+
+
+		GisCoordinateUtil.calculateVariable (
+				controlCoordinate1[0],controlCoordinate1[1],
+				controlLocation1[0],controlLocation1[1],
+				controlCoordinate2[0],controlCoordinate2[1],
+				controlLocation2[0],controlLocation2[1]);
+		double[][] result = new double[positions.length][2];
+		for(int i=0;i<positions.length;++i) {
+			double[] d = GisCoordinateUtil.transformLocationToBL(positions[i][0], positions[i][1]);
+			result[i] = d;
+
+		}
+
+		return result;
+	}
+
 	
-	public static double[] convert(double[] position) {
+	private static double[] convert(double[] position) {
     	GisCoordinateUtil.calculateVariable (controlCoordinate1[0],controlCoordinate1[1],controlLocation1[0],controlLocation1[1],controlCoordinate2[0],controlCoordinate2[1],controlLocation2[0],controlLocation2[1]);
         double[] d = GisCoordinateUtil.transformLocationToBL(position[0], position[1]);
         return d;
 	}
-	
-	public static double[][] convert(double[][] positions){
+
+	private static double[][] convert(double[][] positions){
 	   	GisCoordinateUtil.calculateVariable (controlCoordinate1[0],controlCoordinate1[1],controlLocation1[0],controlLocation1[1],controlCoordinate2[0],controlCoordinate2[1],controlLocation2[0],controlLocation2[1]);
         double[][] result = new double[positions.length][2];
 	   	for(int i=0;i<positions.length;++i) {

+ 115 - 36
laser/src/main/java/com/fdkankan/indoor/base/convert/kesar/AStar.java

@@ -10,21 +10,21 @@ import net.sf.json.JSONObject;
 /**
  * 
  * ClassName: AStar 
- * @Description: A星算法
+ * @Description: A鏄熺畻娉�
  * @author kesar
  */
 public class AStar
 {
-	//public final static int BAR = 1; // 障碍值
-	//public final static int PATH = 2; // 路径
-	//public final static int DIRECT_VALUE = 10; // 横竖移动代价
-	//public final static int OBLIQUE_VALUE = 14; // 斜移动代价
+	public final static int BAR = 1; // 闅滅鍊�
+	public final static int PATH = 2; // 璺緞
+	public final static int DIRECT_VALUE = 10; // 妯珫绉诲姩浠d环
+	public final static int OBLIQUE_VALUE = 14; // 鏂滅Щ鍔ㄤ唬浠�
 	
-	Queue<Node> openList = new PriorityQueue<Node>(); // 优先队列(升序)
+	Queue<Node> openList = new PriorityQueue<Node>(); // 浼樺厛闃熷垪(鍗囧簭)
 	List<Node> closeList = new ArrayList<Node>();
 	
 	/**
-	 * 开始算法
+	 * 寮�濮嬬畻娉�
 	 */
 	public List<Node> start(MapInfo mapInfo)
 	{
@@ -32,13 +32,13 @@ public class AStar
 		// clean
 		openList.clear();
 		closeList.clear();
-		// 开始搜索
+		// 寮�濮嬫悳绱�
 		openList.add(mapInfo.start);
 		return moveNodes(mapInfo);
 	}
 
 	/**
-	 * 移动当前结点
+	 * 绉诲姩褰撳墠缁撶偣
 	 */
 	private List<Node> moveNodes(MapInfo mapInfo)
 	{
@@ -49,8 +49,7 @@ public class AStar
 			addNeighborNodeInOpen(mapInfo,current);
 			if (isCoordInClose(mapInfo.end.id))
 			{
-				List<Node> list = getPath(mapInfo.maps, mapInfo.start);
-				//break;
+				List<Node> list = drawPath(mapInfo.maps, mapInfo.end);
 				return list;
 			}
 		}
@@ -58,24 +57,26 @@ public class AStar
 	}
 	
 	/**
-	 * 在二维数组中绘制路径
+	 * 鍦ㄤ簩缁存暟缁勪腑缁樺埗璺緞
 	 */
-	private List<Node> getPath(JSONArray maps, Node start)
+	private List<Node> drawPath(JSONArray maps, Node end)
 	{
-		if(start==null||maps==null) return null;
+		if(end==null||maps==null) return null;
+		System.out.println("路线" + end.id);
 		List<Node> list = new ArrayList<Node>();
-		while (start != null)
+		while (end != null)
 		{
-			System.out.println("路线:" + start.id);
-			list.add(start);
-			Coord c = start.coord;
-			start = start.child;
+			System.out.println("路线" + end.id);
+			list.add(end);
+			Coord c = end.coord;
+			//maps[c.y][c.x] = PATH;
+			end = end.parent;
 		}
 		return list;
 	}
 
 	/**
-	 * 添加所有邻结点到open表
+	 * 娣诲姞鎵�鏈夐偦缁撶偣鍒皁pen琛�
 	 */
 	private void addNeighborNodeInOpen(MapInfo mapInfo,Node current)
 	{
@@ -84,46 +85,99 @@ public class AStar
 		String[] linkedIds = item.getString("linkedIds").split(",");
 		
 		for(int i=0;i<linkedIds.length;++i) {
-			int linkedId = Integer.valueOf(linkedIds[i]);
-			//是否在close表里
-			if (canAddNodeToOpen(mapInfo,linkedId)) {
+			int linkedId = Integer.valueOf(linkedIds[i])-1;
+			if (canAddNodeToOpen(mapInfo,linkedId))
+			{
 				Node end=mapInfo.end;
+				//Coord coord = new Coord(x, y);
 				float G = current.G + current.weight; // 计算邻结点的G值
 				Node child = findNodeInOpen(linkedId);
-
 				if (child == null)
 				{
-					// System.out.println("加入,linkedId:"+linkedId);
-					float H=calcH(end.coord,current.coord); // 计算H值
+					float H=calcH(end.coord,current.coord); // 璁$畻H鍊�
 					if(isEndNode(end.id,linkedId))
 					{
 						child=end;
-						//child.parent=current;
 						child.G=G;
 						child.H=H;
-
 					}
 					else
 					{
 						JSONObject neighItem = mapInfo.maps.getJSONObject(linkedId);
 						child = new Node(linkedId,(float)neighItem.getDouble("weight"),new Coord((float)neighItem.getDouble("x"), (float)neighItem.getDouble("y"),(float)neighItem.getDouble("z")), null, G, H);
 					}
-					current.child = child;
+					child.parent=current;
 					openList.add(child);
 				}
 				else if (child.G > G)
 				{
 					child.G = G;
-					current.child = child;
-					//child.parent = current;
+					child.parent = current;
 					openList.add(child);
 				}
 			}
 		}
+		/*
+		int x = current.coord.x;
+		int y = current.coord.y;
+		// 宸�
+		addNeighborNodeInOpen(mapInfo,current, x - 1, y, DIRECT_VALUE);
+		// 涓�
+		addNeighborNodeInOpen(mapInfo,current, x, y - 1, DIRECT_VALUE);
+		// 鍙�
+		addNeighborNodeInOpen(mapInfo,current, x + 1, y, DIRECT_VALUE);
+		// 涓�
+		addNeighborNodeInOpen(mapInfo,current, x, y + 1, DIRECT_VALUE);
+		// 宸︿笂
+		addNeighborNodeInOpen(mapInfo,current, x - 1, y - 1, OBLIQUE_VALUE);
+		// 鍙充笂
+		addNeighborNodeInOpen(mapInfo,current, x + 1, y - 1, OBLIQUE_VALUE);
+		// 鍙充笅
+		addNeighborNodeInOpen(mapInfo,current, x + 1, y + 1, OBLIQUE_VALUE);
+		// 宸︿笅
+		addNeighborNodeInOpen(mapInfo,current, x - 1, y + 1, OBLIQUE_VALUE);
+		*/
 	}
 
 	/**
-	 * 从Open列表中查找结点
+	 * 娣诲姞涓�涓偦缁撶偣鍒皁pen琛�
+	 */
+	/*
+	private void addNeighborNodeInOpen(MapInfo mapInfo,Node current, int x, int y, int value)
+	{
+		if (canAddNodeToOpen(mapInfo,x, y))
+		{
+			Node end=mapInfo.end;
+			Coord coord = new Coord(x, y);
+			int G = current.G + value; // 璁$畻閭荤粨鐐圭殑G鍊�
+			Node child = findNodeInOpen(coord);
+			if (child == null)
+			{
+				int H=calcH(end.coord,coord); // 璁$畻H鍊�
+				if(isEndNode(end.coord,coord))
+				{
+					child=end;
+					child.parent=current;
+					child.G=G;
+					child.H=H;
+				}
+				else
+				{
+					child = new Node(coord, current, G, H);
+				}
+				openList.add(child);
+			}
+			else if (child.G > G)
+			{
+				child.G = G;
+				child.parent = current;
+				openList.add(child);
+			}
+		}
+	}
+*/
+	/**
+	 * 浠嶰pen鍒楄〃涓煡鎵剧粨鐐�
 	 */
 	private Node findNodeInOpen(int id)
 	{
@@ -140,7 +194,7 @@ public class AStar
 
 
 	/**
-	 * 计算H的估值:“曼哈顿”法,坐标分别取差值相加
+	 * 璁$畻H鐨勪及鍊硷細鈥滄浖鍝堥】鈥濇硶锛屽潗鏍囧垎鍒彇宸�肩浉鍔�
 	 */
 	public float calcH(Coord end,Coord coord)
 	{
@@ -148,22 +202,31 @@ public class AStar
 	}
 	
 	/**
-	 * 判断结点是否是最终结点
+	 * 鍒ゆ柇缁撶偣鏄惁鏄渶缁堢粨鐐�
 	 */
 	private boolean isEndNode(int endId,int id)
 	{
 		return  endId == id;
 	}
 
+	/**
+	 * 鍒ゆ柇缁撶偣鑳藉惁鏀惧叆Open鍒楄〃
+	 */
 	private boolean canAddNodeToOpen(MapInfo mapInfo,int id)
 	{
-		// 判断结点是否存在close表
+		// 鏄惁鍦ㄥ湴鍥句腑
+		//if (x < 0 || x >= mapInfo.width || y < 0 || y >= mapInfo.hight) return false;
+		// 鍒ゆ柇鏄惁鏄笉鍙�氳繃鐨勭粨鐐�
+		//if (mapInfo.maps[y][x] == BAR) return false;
+		// 鍒ゆ柇缁撶偣鏄惁瀛樺湪close琛�
 		if (isCoordInClose(id)) return false;
 
 		return true;
 	}
 
-
+	/**
+	 * 鍒ゆ柇鍧愭爣鏄惁鍦╟lose琛ㄤ腑
+	 */
 	private boolean isCoordInClose(int id)
 	{
 		if (closeList.isEmpty()) return false;
@@ -176,4 +239,20 @@ public class AStar
 		}
 		return false;
 	}
+
+	/**
+	 * 鍒ゆ柇鍧愭爣鏄惁鍦╟lose琛ㄤ腑
+	 */
+	private boolean isCoordInClose(int x, int y)
+	{
+		if (closeList.isEmpty()) return false;
+		for (Node node : closeList)
+		{
+			if (node.coord.x == x && node.coord.y == y)
+			{
+				return true;
+			}
+		}
+		return false;
+	}
 }

+ 13 - 1
laser/src/main/java/com/fdkankan/indoor/base/convert/kesar/Coord.java

@@ -12,11 +12,23 @@ public class Coord
 	public float x;
 	public float y;
 	public float z;
-	
+
 	public Coord(float x, float y,float z)
 	{
 		this.x = x;
 		this.y = y;
 		this.z = z;
 	}
+
+	@Override
+	public boolean equals(Object obj)
+	{
+		if (obj == null) return false;
+		if (obj instanceof Coord)
+		{
+			Coord c = (Coord) obj;
+			return x == c.x && y == c.y;
+		}
+		return false;
+	}
 }

+ 17 - 7
laser/src/main/java/com/fdkankan/indoor/base/convert/kesar/MapInfo.java

@@ -5,19 +5,29 @@ import net.sf.json.JSONArray;
 /**
  * 
  * ClassName: MapInfo 
- * @Description: 包含地图所需的所有输入数据
+ * @Description: 鍖呭惈鍦板浘鎵�闇�鐨勬墍鏈夎緭鍏ユ暟鎹�
  * @author kesar
  */
 public class MapInfo
 {
-	//public int[][] maps; // 二维数组的地图
-	//public int width; // 地图的宽
-	//public int hight; // 地图的高
+	//public int[][] maps; // 浜岀淮鏁扮粍鐨勫湴鍥�
+	//public int width; // 鍦板浘鐨勫
+	//public int hight; // 鍦板浘鐨勯珮
 	public JSONArray maps;
-	public Node start; // 起始结点
-	public Node end; // 最终结点
+	public Node start; // 璧峰缁撶偣
+	public Node end; // 鏈�缁堢粨鐐�
+	
+	/*
+	public MapInfo(int[][] maps, int width, int hight, Node start, Node end)
+	{
+		this.maps = maps;
+		this.width = width;
+		this.hight = hight;
+		this.start = start;
+		this.end = end;
+	}
+	*/
 	
-	//public MapInfo(int[][] maps, int width, int hight, Node start, Node end)
 	public MapInfo(JSONArray maps, Node start, Node end)
 	{
 		this.maps = maps;

+ 15 - 7
laser/src/main/java/com/fdkankan/indoor/base/convert/kesar/Node.java

@@ -3,24 +3,32 @@ package com.fdkankan.indoor.base.convert.kesar;
  * 
  * ClassName: Node 
  * 
- * @Description: 路径结点
+ * @Description: 璺緞缁撶偣
  * @author kesar
  */
 public class Node implements Comparable<Node>
 {
 	public int id;
 	public float weight;
-	public Coord coord; // 坐标
-	public Node child; // 父结点
-	public float G; // G:是个准确的值,是起点到当前结点的代价
-	public float H; // H:是个估值,当前结点到目的结点的估计代价
+	public Coord coord; // 鍧愭爣
+	public Node parent; // 鐖剁粨鐐�
+	public float G; // G锛氭槸涓噯纭殑鍊硷紝鏄捣鐐瑰埌褰撳墠缁撶偣鐨勪唬浠�
+	public float H; // H锛氭槸涓及鍊硷紝褰撳墠缁撶偣鍒扮洰鐨勭粨鐐圭殑浼拌浠d环
 
-	public Node(int id ,float weight,Coord coord, Node child, float g, float h)
+	public Node(int id ,float weight,Coord coord, Node parent, float g, float h)
 	{
 		this.id = id;
 		this.weight = weight;
 		this.coord = coord;
-		this.child = child;
+		this.parent = parent;
+		G = g;
+		H = h;
+	}
+
+	public Node(Coord coord, Node parent, int g, int h)
+	{
+		this.coord = coord;
+		this.parent = parent;
 		G = g;
 		H = h;
 	}

+ 53 - 0
laser/src/main/java/com/fdkankan/indoor/core/controller/ControlPointController.java

@@ -0,0 +1,53 @@
+package com.fdkankan.indoor.core.controller;
+
+import com.fdkankan.indoor.base.aop.WebControllerLog;
+import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
+import com.fdkankan.indoor.core.service.ConfigService;
+import com.fdkankan.indoor.core.service.ControlPointService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Created by owen on 2021/7/29 0029 18:27
+ */
+@Api(tags = "控制点管理")
+@RestController
+@RequestMapping("indoor/api/controlPoint")
+public class ControlPointController {
+
+    @Autowired
+    ControlPointService entityService;
+
+
+    /**
+     * {
+     * 	"ageControlLocation1": [6.774144,-9.48061],
+     * 	"ageControlLocation2": [6.059886,-12.197689],
+     * 	"gpsControlCoordinate1": [113.595725873337,22.366579193007],
+     * 	"gpsControlCoordinate2": [113.59571900944,22.366554639591],
+     * 	"id": "t1"
+     * }
+     * @param param
+     * @return
+     */
+    @WebControllerLog(description = "控制点管理-新增/修改控制点")
+    @ApiOperation(value = "新增/修改控制点")
+    @PostMapping("save")
+    public Result save(@RequestBody ControlPointEntity param) {
+        return entityService.save(param);
+    }
+
+
+    @WebControllerLog(description = "控制点管理-详情")
+    @ApiOperation(value = "详情")
+    @PostMapping("detail/{id}")
+    public Result detail(@PathVariable String id) {
+        return Result.success(entityService.findById(id));
+    }
+
+
+
+}

+ 3 - 3
laser/src/main/java/com/fdkankan/indoor/core/controller/InitController.java

@@ -30,14 +30,14 @@ public class InitController {
      * 2021-7-
      * 将4dkk vision.txt 转 激光相机可用数据并出入数据库
      * 4dkk 调用
-     * @param sceneCode
+     * @param id 是场景码
      * @param path
      * @return
      */
     @WebControllerLog(description = "filter数据接口-创建初始数据")
     @ApiOperation(value = "创建初始数据")
     @GetMapping("init")
-    public Result initData(String sceneCode, String path) {
-        return initService.initData(sceneCode, path);
+    public Result initData(String id, String path) {
+        return initService.initData(id, path);
     }
 }

+ 0 - 164
laser/src/main/java/com/fdkankan/indoor/core/controller/SiteModelController.java

@@ -1,164 +0,0 @@
-//package com.fdkankan.indoor.core.controller;
-//
-//import com.alibaba.fastjson.JSONObject;
-//import com.fdkankan.indoor.base.aop.WebControllerLog;
-//import com.fdkankan.indoor.base.util.Result;
-//import com.fdkankan.indoor.core.dto.SiteModelSearchDto;
-//import com.fdkankan.indoor.core.entity.siteModel.SiteModel;
-//import com.fdkankan.indoor.core.service.SiteModelService;
-//import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-//import io.swagger.annotations.Api;
-//import io.swagger.annotations.ApiOperation;
-//import lombok.AllArgsConstructor;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.web.bind.annotation.*;
-//
-///**
-// * @author Admin
-// *
-// * http://127.0.0.1:9294/indoor/
-// *
-// * 2021-07-20
-// * site_model.json的原始数据是数组, 目前存数据库是对象
-// */
-//@Slf4j
-//@Api(tags = "SiteModel数据接口")
-//@RestController
-//@AllArgsConstructor
-//public class SiteModelController {
-//
-//
-//    @Autowired
-//    SiteModelService tSiteModel2Service;
-//
-//
-//    /**
-//     * http://127.0.0.1:9294/indoor/test1/api/site_model/within?location=120.58645186143931&location=29.991567318555767&location=1.1677126884460454&type=FLOOR
-//     * http://127.0.0.1:9294/indoor/test2/api/site_model/within?location=113.595542719717&location=22.366858049261&location=-0.299806&type=FLOOR
-//     *
-//     * https://testlaser.4dkankan.com/indoor
-//     *
-//     * https://testlaser.4dkankan.com/indoor/test2/api/site_model/within?location=113.595542719717&location=22.366858049261&location=-0.299806&type=FLOOR
-//     * @param code
-//     * @param location
-//     * @param type
-//     * @return
-//     */
-//    @ApiOperation(value = "siteModel数据")
-//    @GetMapping("indoor/{code}/api/site_model/within")
-//    public Object within(@PathVariable String code, Double[] location, String type) {
-//        log.info("code: {}", code);
-//        Result result = tSiteModel2Service.withinType(code, location, type);
-////        Result result = tSiteModel2Service.withinType_5(code, location, type);
-//        return result.getData();
-//    }
-//
-//
-//    /**
-//     * http://127.0.0.1:9294/indoor/test2/api/site_model/10
-//     * @param code
-//     * @param id
-//     * @return
-//     */
-//    @ApiOperation(value = "根据id获取数据")
-//    @ApiOperationSupport(order = 1)
-//    @GetMapping("indoor/{code}/api/site_model/{id}")
-//    public SiteModel getDataById(@PathVariable String code, @PathVariable Long id) {
-//        log.info("code: {}", code);
-//        return tSiteModel2Service.findById(id, code);
-//    }
-//
-//
-//    /**
-//     * test2
-//     * {
-//     * 	"polygon": {
-//     * 		"coordinates": [
-//     * 			[
-//     * 				[
-//     * 					121.61047162518044,
-//     * 					29.87658107486706
-//     * 				],
-//     * 				[
-//     * 					121.61130284124107,
-//     * 					29.876581077463503
-//     * 				],
-//     * 				[
-//     * 					121.61130284126927,
-//     * 					29.877426361048224
-//     * 				],
-//     * 				[
-//     * 					121.61047161819917,
-//     * 					29.8774263584517
-//     * 				],
-//     * 				[
-//     * 					121.61047162518044,
-//     * 					29.87658107486706
-//     * 				]
-//     * 			]
-//     * 		],
-//     * 		"type": "Polygon"
-//     *        },
-//     * 	"type": "BUILDING"
-//     * }
-//     * @param param
-//     * @param code
-//     * @return
-//     */
-//    @WebControllerLog(description = "SiteModel数据接口-获取building数据")
-//    @ApiOperation(value = "获取building数据",notes = "参数直接传个json对象")
-//    @PostMapping("indoor/{code}/api/site_model/within_polygon")
-//    public Result getData(@RequestBody JSONObject param, @PathVariable String code) {
-//        return tSiteModel2Service.getData(param, code);
-//    }
-//
-//
-//    /**
-//     * 2021-07-16
-//     * 参考api: http://indoor.popsmart.cn:8094/zdoblh/api/search/site_model?from=0&lang=zh&query=%E6%88%BF%E9%97%B4&size=5
-//     *
-//     * 测试:
-//     * http://127.0.0.1:9294/indoor/test1/api/search/site_model?from=0&lang=zh&query=%E4%B8%80%E6%A5%BC&size=5
-//     * @return
-//     */
-//    @WebControllerLog(description = "SiteModel查询")
-//    @ApiOperation(value = "查询",notes = "参数直接传个json对象")
-//    @GetMapping("indoor/{sceneCode}/api/search/site_model")
-//    public Object search(@PathVariable String sceneCode, SiteModelSearchDto searchDto) {
-//        Result search = tSiteModel2Service.search(sceneCode, searchDto);
-//        return search.getData();
-//    }
-//
-//
-//    /**
-//     * 2021-07-16
-//     * 参考: http://indoor.popsmart.cn:8094/zdoblh/api/site_model/closest?location=121.61088492160654&location=29.8770318786046&location=0.6624369924962523&radius=0.01
-//     *
-//     * 测试api
-//     *
-//     * http://127.0.0.1:9294/indoor/test2/api/site_model/closest?location=113.595495811839&location=22.3668188213553&location=0.6624369924962523&radius=0.01
-//     * location1=x
-//     * location2=y
-//     * location3=z 这个值目前还没判断
-//     * radius: 半径
-//     * @return
-//     */
-//    @WebControllerLog(description = "找最近的点")
-//    @ApiOperation(value = "查询",notes = "参数直接传个json对象")
-//    @GetMapping("indoor/{sceneCode}/api/site_model/closest")
-//    public Object latest(@PathVariable String sceneCode, Double[] location, Double radius) {
-//        Result search = tSiteModel2Service.latest(sceneCode, location, radius);
-//        return search.getData();
-//    }
-//
-//
-//    @WebControllerLog(description = "测试获取对象")
-//    @ApiOperation(value = "测试获取对象",notes = "参数直接传个json对象")
-//    @GetMapping("indoor/{sceneCode}/api/site_model/testData")
-//    public Object latest(@PathVariable String sceneCode) {
-//        Result search = tSiteModel2Service.testData(sceneCode);
-//        return search.getData();
-//    }
-//
-//}

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

@@ -1,17 +1,22 @@
 package com.fdkankan.indoor.core.controller;
 
 import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.OwenEntity;
+import com.fdkankan.indoor.core.service.OwenService;
 import com.fdkankan.indoor.core.service.TestService;
 import com.fdkankan.indoor.core.entity.vo.HaoVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
 /**
  * Created by owen on 2021/7/26 0026 15:13
+ *
+ * 建议使用场景码作为id, 因为他是主键
  */
 @Api(tags = "测试")
 @RestController
@@ -21,6 +26,9 @@ public class TestController {
     @Autowired
     TestService testService;
 
+    @Autowired
+    OwenService owenService;
+
     @ApiOperation("修改数据")
     @PostMapping("edit/{sceneCode}")
     public Result edit(@PathVariable String sceneCode, @RequestBody List<HaoVo> param){
@@ -28,4 +36,49 @@ public class TestController {
 
 
     }
+
+
+    @ApiOperation("添加数据:insert")
+    @GetMapping("insert/{sceneCode}")
+    public Result insert(@PathVariable String sceneCode){
+        return owenService.insert(sceneCode);
+
+
+    }
+
+    @ApiOperation("新增/修改:save")
+    @GetMapping("save")
+    public Result insert(OwenEntity param){
+        return owenService.save(param);
+
+
+    }
+
+
+    @ApiOperation("事务:transaction")
+    @GetMapping("transaction")
+    public Result transaction(OwenEntity param){
+        return owenService.transaction(param);
+
+
+    }
+
+    @ApiOperation("列表")
+    @GetMapping("list")
+    public Result list(){
+        return owenService.list();
+
+
+    }
+
+    @Transactional
+    @ApiOperation("删除")
+    @GetMapping("delete/{id}")
+    public Result delete(@PathVariable String id){
+        return owenService.delete(id);
+
+
+    }
+
+
 }

+ 35 - 0
laser/src/main/java/com/fdkankan/indoor/core/entity/ControlPointEntity.java

@@ -0,0 +1,35 @@
+package com.fdkankan.indoor.core.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * Created by owen on 2021/7/29 0029 18:34
+ * 控制点实体
+ * lat:113, [0], lon:22, [1]
+ */
+@Document(collection = "t_control_point")
+@Data
+public class ControlPointEntity {
+
+    @ApiModelProperty(value = "场景码", required = true )
+    private String id;
+
+    // 四维看看控制点
+    @ApiModelProperty(value = "四维看看控制点1",required = true)
+    private double[] ageControlLocation1;
+
+    @ApiModelProperty(value = "四维看看控制点2" , required = true)
+    private double[] ageControlLocation2;
+
+    // gps坐标
+    @ApiModelProperty(value = "GPS坐标1, 参数[0]:lat, [1]:lon" , required = true)
+    private double[] gpsControlCoordinate1;
+
+    @ApiModelProperty(value = "GPS坐标2", required = true )
+    private double[] gpsControlCoordinate2;
+
+
+
+}

+ 30 - 0
laser/src/main/java/com/fdkankan/indoor/core/entity/InitEntity.java

@@ -0,0 +1,30 @@
+package com.fdkankan.indoor.core.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.time.LocalDateTime;
+
+/**
+ * Created by owen on 2021/7/29 0029 16:55
+ */
+@Document(collection = "t_init")
+@Data
+public class InitEntity {
+
+    @ApiModelProperty(value = "场景码", required = true )
+    private String id;
+
+    @ApiModelProperty(value = "文件基础路径", required = true )
+    private String path;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "状态, 0:初始状态, 1:完成控制点" )
+    private Integer status;
+
+
+}

+ 16 - 0
laser/src/main/java/com/fdkankan/indoor/core/entity/OwenEntity.java

@@ -0,0 +1,16 @@
+package com.fdkankan.indoor.core.entity;
+
+import lombok.Data;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * Created by owen on 2021/7/29 0029 16:55
+ */
+@Document(collection = "t_owen")
+@Data
+public class OwenEntity {
+
+    private String id;
+
+    private String sceneCode;
+}

+ 13 - 0
laser/src/main/java/com/fdkankan/indoor/core/mapper/ControlPointMapper.java

@@ -0,0 +1,13 @@
+package com.fdkankan.indoor.core.mapper;
+
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by owen on 2021/7/27 0027 15:19
+ */
+@Component
+public interface ControlPointMapper extends MongoRepository<ControlPointEntity, String> {
+
+}

+ 14 - 0
laser/src/main/java/com/fdkankan/indoor/core/mapper/InitMapper.java

@@ -0,0 +1,14 @@
+package com.fdkankan.indoor.core.mapper;
+
+import com.fdkankan.indoor.core.entity.InitEntity;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by owen on 2021/7/27 0027 15:19
+ */
+@Component
+public interface InitMapper extends MongoRepository<InitEntity, String> {
+
+
+}

+ 14 - 0
laser/src/main/java/com/fdkankan/indoor/core/mapper/OwenMapper.java

@@ -0,0 +1,14 @@
+package com.fdkankan.indoor.core.mapper;
+
+import com.fdkankan.indoor.core.entity.OwenEntity;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by owen on 2021/7/27 0027 15:19
+ */
+@Component
+public interface OwenMapper extends MongoRepository<OwenEntity, String> {
+
+    OwenEntity findBySceneCode(String sceneCode);
+}

+ 15 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/ControlPointService.java

@@ -0,0 +1,15 @@
+package com.fdkankan.indoor.core.service;
+
+
+import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
+
+/**
+ * Created by owen on 2021/7/28 0028 20:05
+ */
+public interface ControlPointService {
+
+    Result save(ControlPointEntity param);
+
+    ControlPointEntity findById(String id);
+}

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

@@ -7,4 +7,6 @@ import com.fdkankan.indoor.base.util.Result;
  */
 public interface InitService {
     Result initData(String sceneCode, String path);
+
+    void initDataStep2(String sceneCode);
 }

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

@@ -0,0 +1,19 @@
+package com.fdkankan.indoor.core.service;
+
+import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.OwenEntity;
+
+/**
+ * Created by owen on 2021/7/28 0028 20:05
+ */
+public interface OwenService {
+    Result save(OwenEntity entity);
+
+    Result insert(String sceneCode);
+
+    Result transaction(OwenEntity param);
+
+    Result list();
+
+    Result delete(String id);
+}

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

@@ -1,31 +0,0 @@
-package com.fdkankan.indoor.core.service;
-
-import com.alibaba.fastjson.JSONObject;
-import com.fdkankan.indoor.base.util.Result;
-import com.fdkankan.indoor.core.entity.dto.SiteModelSearchDto;
-import com.fdkankan.indoor.core.entity.SiteModelEntity;
-import com.fdkankan.indoor.core.entity.siteModel.SiteModel;
-
-/**
- * @author Admin
- */
-public interface SiteModelService {
-
-
-
-    Result withinType(String code, Double[] location, String type);
-
-    SiteModel findById(Long id, String code);
-
-    Result getData(JSONObject param, String code);
-
-    Result search(String sceneCode, SiteModelSearchDto searchDto);
-
-    Result latest(String sceneCode, Double[] location, Double radius);
-
-    Result testData(String sceneCode);
-
-    Result withinType_5(String code, Double[] location, String type);
-
-    void save(SiteModelEntity entity);
-}

+ 2 - 0
laser/src/main/java/com/fdkankan/indoor/core/service/TestService.java

@@ -10,4 +10,6 @@ import java.util.List;
  */
 public interface TestService {
     Result edit(String sceneCode, List<HaoVo> param);
+
+
 }

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

@@ -0,0 +1,52 @@
+package com.fdkankan.indoor.core.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.ConfigEntity;
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
+import com.fdkankan.indoor.core.mapper.ConfigMapper;
+import com.fdkankan.indoor.core.mapper.ControlPointMapper;
+import com.fdkankan.indoor.core.service.ConfigService;
+import com.fdkankan.indoor.core.service.ControlPointService;
+import com.fdkankan.indoor.core.service.InitService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+/**
+ * Created by owen on 2021/7/28 0028 20:05
+ */
+@Service
+@Slf4j
+public class ControlPointServiceImpl implements ControlPointService {
+
+    @Autowired
+    ControlPointMapper entityMapper;
+
+    @Autowired
+    InitService initService;
+
+
+    @Override
+    public Result save(ControlPointEntity param) {
+        if (StrUtil.isAllEmpty(param.getId())){
+            return Result.failure("场景码不能为空");
+        }
+        entityMapper.save(param);
+        log.info("控制点保存完成");
+
+        // 初始化step2 数据
+        initService.initDataStep2(param.getId());
+        log.info("初始化step2 完成");
+
+        return Result.success();
+    }
+
+    @Override
+    public ControlPointEntity findById(String id) {
+        Optional<ControlPointEntity> optional = entityMapper.findById(id);
+        return optional.get();
+    }
+}

+ 77 - 26
laser/src/main/java/com/fdkankan/indoor/core/service/impl/InitServiceImpl.java

@@ -1,13 +1,16 @@
 package com.fdkankan.indoor.core.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.fdkankan.indoor.base.constant.TypeConstant;
 import com.fdkankan.indoor.base.convert.*;
+import com.fdkankan.indoor.base.exception.BaseRuntimeException;
 import com.fdkankan.indoor.base.util.FileUtils;
 import com.fdkankan.indoor.base.util.Result;
 import com.fdkankan.indoor.base.util.SnowFlakeUUidUtils;
 import com.fdkankan.indoor.core.entity.dto.*;
 import com.fdkankan.indoor.core.entity.*;
+import com.fdkankan.indoor.core.mapper.InitMapper;
 import com.fdkankan.indoor.core.service.*;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.json.JSONArray;
@@ -21,6 +24,7 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Created by owen on 2021/7/28 0028 9:10
@@ -30,6 +34,9 @@ import java.util.List;
 public class InitServiceImpl implements InitService {
 
     @Autowired
+    InitMapper initMapper;
+
+    @Autowired
     ConvertToPanoInfoFor4dkk convertToPanoInfoFor4dkk;
 
     @Autowired
@@ -59,7 +66,11 @@ public class InitServiceImpl implements InitService {
     @Autowired
     RouteService routeService;
 
+    @Autowired
+    ControlPointService controlPointService;
+
     /**
+     * initDataStep1
      * 有顺序分,不能乱
      * @param sceneCode
      * @param path
@@ -68,37 +79,75 @@ public class InitServiceImpl implements InitService {
     @Override
     public Result initData(String sceneCode, String path) {
 
-        // step1: 处理vision.txt 创建filter表, 处理firstView
-//        createFilter(sceneCode, path);
-//
-//        // step2 处理could.js 创建site_model, 处理原点、中心点、最大点、最小点
-//        processCould(sceneCode, path);
-//
-//        // step3 创建poi表, 热点,默认没有
-//        createPoi(sceneCode);
-//
-//        // step4 创建poi_type表
-//        createPoiType(sceneCode);
-//
-//        // step5 创建poi_type_group表
-//        createPoiTypeGroup(sceneCode);
-//
-//        // step6 创建t_configs表
-//        createConfig(sceneCode);
-//
-//        // step7 创建t_datasets表
-//        createDataSet(sceneCode);
+        if (StrUtil.isAllEmpty(sceneCode) || StrUtil.isAllEmpty(path)) {
+            return Result.failure("场景码或路径不能为空");
+        }
+
+        // step3 创建poi表, 热点,默认没有
+        createPoi(sceneCode);
+
+        // step4 创建poi_type表
+        createPoiType(sceneCode);
+
+        // step5 创建poi_type_group表
+        createPoiTypeGroup(sceneCode);
 
         // step8 创建t_route表
         createRoute(sceneCode, path);
 
 
+        // 保存initDataStep1 状态
+        InitEntity entity = new InitEntity();
+        entity.setId(sceneCode);
+        entity.setPath(path);
+        entity.setCreateTime(LocalDateTime.now());
+        entity.setStatus(0);
+        initMapper.save(entity);
+
         return Result.success();
     }
 
-    private void createFilter(String sceneCode, String path){
+
+    /**
+     * 需要控制点,才能完成以下操作
+     *
+     * @param sceneCode
+     */
+    @Override
+    public void initDataStep2(String sceneCode){
+
+        Optional<InitEntity> optional = initMapper.findById(sceneCode);
+        InitEntity init = optional.get();
+        if (init.getStatus() !=0) {
+            throw new BaseRuntimeException("数据初始化失败");
+        }
+
+        String path = init.getPath();
+
+        // step:0 获取控制点
+        ControlPointEntity controlPoint = getControlPoint(sceneCode);
+
+        // step1: 处理vision.txt 创建filter表, 处理firstView
+        createFilter(sceneCode, path, controlPoint);
+
+        // step2 处理could.js 创建site_model, 处理原点、中心点、最大点、最小点
+        processCould(sceneCode, path, controlPoint);
+
+        // step6 创建t_configs表 , 需要firstView;
+        createConfig(sceneCode);
+
+        // step7 创建t_datasets表, 需要处理原点之后执行
+        createDataSet(sceneCode);
+
+        // 更新 initDataStep2 状态
+        init.setUpdateTime(LocalDateTime.now());
+        init.setStatus(1);
+        initMapper.save(init);
+    }
+
+    private void createFilter(String sceneCode, String path, ControlPointEntity dto){
         path = path +"/vision.txt";
-        JSONArray jsonArray = convertToPanoInfoFor4dkk.createFilter(sceneCode, path);
+        JSONArray jsonArray = convertToPanoInfoFor4dkk.createFilter(sceneCode, path, dto);
         FilterEntity entity = new FilterEntity();
         entity.setId(SnowFlakeUUidUtils.getUuid("FR"));
         entity.setCreateTime(LocalDateTime.now());
@@ -114,10 +163,10 @@ public class InitServiceImpl implements InitService {
      * @param sceneCode
      * @param path
      */
-    private void processCould(String sceneCode, String path){
+    private void processCould(String sceneCode, String path, ControlPointEntity dto){
         path = path + "/cloud.js";
         // 处理原点,将原点坐标转为坐标
-        double[] doubles = ModifyCloud.convertFromOrigin();
+        double[] doubles = ModifyCloud.convertFromOrigin(dto);
         Double[] origin = {doubles[0] ,doubles[1]};
         // 将数据保存到db
         saveSpecialPoint(sceneCode, TypeConstant.POI_ORIGIN, origin);
@@ -131,7 +180,7 @@ public class InitServiceImpl implements InitService {
             Double minZ = boundingBox.getDouble("minZ");
             Double maxZ = boundingBox.getDouble("maxZ");
 
-            JSONObject resJson = ModifyCloud.convertFromBoundingBox(boundingBox);
+            JSONObject resJson = ModifyCloud.convertFromBoundingBox(boundingBox, dto);
 
             Double[] max = getKey(resJson, "max");
             Double[] min = getKey(resJson, "min");
@@ -354,6 +403,8 @@ public class InitServiceImpl implements InitService {
 
     }
 
-
+    private ControlPointEntity getControlPoint(String sceneCode){
+       return controlPointService.findById(sceneCode);
+    }
 
 }

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

@@ -0,0 +1,72 @@
+package com.fdkankan.indoor.core.service.impl;
+
+import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.OwenEntity;
+import com.fdkankan.indoor.core.mapper.OwenMapper;
+import com.fdkankan.indoor.core.service.OwenService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+//import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Created by owen on 2021/7/28 0028 20:05
+ */
+@Service
+@Slf4j
+public class OwenServiceImpl implements OwenService {
+
+    @Autowired
+    OwenMapper entityMapper;
+
+    /**
+     * save: 新增或修改,若id存在侧修改, id不存在则新增
+     * @param
+     */
+    @Override
+    public Result save(OwenEntity entity) {
+        entityMapper.save(entity);
+        return Result.success();
+    }
+
+    /**
+     * insert 只新增,若id重复,会报错
+     * @param sceneCode
+     * @return
+     */
+    @Override
+    public Result insert(String sceneCode) {
+        OwenEntity entity = new OwenEntity();
+        entity.setId(sceneCode);
+        entity.setSceneCode(sceneCode + "_222");
+        entityMapper.insert(entity);
+        return Result.success();
+    }
+
+
+    @Override
+    public Result transaction(OwenEntity param) {
+
+        entityMapper.save(param);
+
+        int a = 1/0;
+
+        param.setId(param.getId() + "_1");
+        param.setSceneCode(param.getSceneCode()+ "_1");
+        entityMapper.save(param);
+         return Result.success();
+    }
+
+    @Override
+    public Result list() {
+        return Result.success(entityMapper.findAll());
+    }
+
+    @Override
+    public Result delete(String id) {
+        entityMapper.deleteById(id);
+        return Result.success();
+    }
+
+
+}

+ 9 - 3
laser/src/main/java/com/fdkankan/indoor/core/service/impl/RouteServiceImpl.java

@@ -1,10 +1,13 @@
 package com.fdkankan.indoor.core.service.impl;
 
-import com.fdkankan.indoor.base.convert.GetRoute;
+import com.fdkankan.indoor.base.convert.GetRoute_1;
 import com.fdkankan.indoor.base.util.Result;
+import com.fdkankan.indoor.core.entity.ControlPointEntity;
 import com.fdkankan.indoor.core.entity.dto.RouteInputDto;
 import com.fdkankan.indoor.core.entity.RouteEntity;
 import com.fdkankan.indoor.core.mapper.RouteMapper;
+import com.fdkankan.indoor.core.service.ConfigService;
+import com.fdkankan.indoor.core.service.ControlPointService;
 import com.fdkankan.indoor.core.service.RouteService;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.json.JSONArray;
@@ -23,6 +26,9 @@ public class RouteServiceImpl implements RouteService {
     @Autowired
     RouteMapper entityMapper;
 
+    @Autowired
+    ControlPointService controlPointService;
+
     @Override
     public void save(RouteEntity entity) {
         entityMapper.save(entity);
@@ -32,8 +38,8 @@ public class RouteServiceImpl implements RouteService {
     public Result getRoute(String sceneCode, RouteInputDto param) {
         List<String> data = getDataBySceneCode(sceneCode);
 
-//        JSONArray map = JSONArray.fromObject(data);
-        JSONArray route = GetRoute.getRoute(data, param);
+        ControlPointEntity controlPointEntity = controlPointService.findById(sceneCode);
+        JSONArray route = GetRoute_1.getRoute(data, param, controlPointEntity);
         return Result.success(route);
     }
 

+ 0 - 410
laser/src/main/java/com/fdkankan/indoor/core/service/impl/SiteModelServiceImpl.java

@@ -1,410 +0,0 @@
-package com.fdkankan.indoor.core.service.impl;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.fdkankan.indoor.base.util.GisUtils;
-import com.fdkankan.indoor.base.util.JsonUtil;
-import com.fdkankan.indoor.base.util.Result;
-import com.fdkankan.indoor.core.entity.dto.SiteModelSearchDto;
-import com.fdkankan.indoor.core.entity.SiteModelEntity;
-import com.fdkankan.indoor.core.entity.siteModel.Polygon;
-import com.fdkankan.indoor.core.entity.siteModel.SiteModel;
-import com.fdkankan.indoor.core.mapper.SiteModelMapper;
-import com.fdkankan.indoor.core.service.SiteModelService;
-import com.fdkankan.indoor.core.entity.vo.BaseVo;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
-import java.awt.geom.Point2D;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Admin
- */
-@Service
-@Slf4j
-@AllArgsConstructor
-public class SiteModelServiceImpl implements SiteModelService {
-
-    private final MongoTemplate mongoTemplate;
-
-    @Autowired
-    SiteModelMapper entityMapper;
-
-    private SiteModelEntity findBySceneCode_5(String sceneCode){
-        Query query = new Query();
-        query.addCriteria(Criteria.where("sceneCode").is(sceneCode));
-        SiteModelEntity vo = mongoTemplate.findOne(query, SiteModelEntity.class, "t_site_model");
-        return vo;
-    }
-
-
-    @Override
-    public Result withinType_5(String code, Double[] location, String type) {
-
-        return null;
-    }
-
-    @Override
-    public void save(SiteModelEntity entity) {
-        entityMapper.insert(entity);
-    }
-
-
-    /**************************************************************************************************/
-
-
-    @Override
-    public Result withinType(String code, Double[] location, String type) {
-        log.info("code: {}", code);
-        log.info("location: {}", location);
-        log.info("code: {}", type);
-
-        // 总对象
-        List<SiteModel> models = new ArrayList<>();
-
-        SiteModel siteModel = findBySceneCode(code);
-        // copy实体对象
-        SiteModel newSiteModel = copyModelNotContainChildren(siteModel);
-        // 做为父节点的低一条
-        models.add(newSiteModel);
-        if (!CollectionUtils.isEmpty(siteModel.getChildren())) {
-            organizeModels2(siteModel, models);
-        }
-
-
-        // 按type封装成对象数组
-        List<SiteModel> resultList = new ArrayList<>();
-        SiteModel result = null;
-
-        Point2D.Double pointParam = new Point2D.Double(location[0], location[1]);
-        log.info("pointParam: {}", pointParam);
-        if ("BUILDING".equals(type)) {
-             resultList =  models.stream().filter(data -> "BUILDING".equals(data.getType())).collect(Collectors.toList());
-            result = resultList.stream().filter(sm -> getSm(sm, pointParam)).findAny()
-                    .orElseThrow(() -> new RuntimeException("没有找到符合多边形的点"));
-        } else if ("FLOOR".equals(type)) {
-            resultList =  models.stream().filter(data -> "FLOOR".equals(data.getType())).collect(Collectors.toList());
-            log.info("resultList.size: {}", resultList.size());
-
-            result = resultList.stream().filter(sm -> getSmByFloor(sm, pointParam)).findAny().orElseThrow(() -> new RuntimeException("没有找到符合多边形的点"));
-        } else if ("ROOM".equals(type)) {
-            resultList =  models.stream().filter(data -> "ROOM".equals(data.getType())).collect(Collectors.toList());
-            result = resultList.stream().filter(sm -> getSm(sm, pointParam)).findAny()
-                    .orElseThrow(() -> new RuntimeException("没有找到符合多边形的点"));
-            // type为空,返回全部数据
-        } else {
-            resultList =  models.stream().filter(data -> "ROOM".equals(data.getType())).collect(Collectors.toList());
-            result = resultList.stream().filter(sm -> getSm(sm, pointParam)).findAny()
-                    .orElseThrow(() -> new RuntimeException("没有找到符合多边形的点"));
-
-            List<SiteModel> roomChildren = new ArrayList<>();
-            roomChildren.add(result);
-            siteModel.setChildren(roomChildren);
-            result = siteModel;
-        }
-
-        log.info("result: {}", result);
-        ArrayList<Object> list = new ArrayList<>();
-        list.add(result);
-        return Result.success(list);
-
-    }
-
-
-    /**
-     * 2021-07-20
-     * 根据场景码查询对象
-     *
-     * 2021-07-28 目前表存的数据结构是对象, 正确应该是数组
-     * 返回结果对象也是一个数组
-     * @param sceneCode
-     * @return
-     */
-    private SiteModel findBySceneCode(String sceneCode){
-        Query query = new Query();
-        query.addCriteria(Criteria.where("sceneCode").is(sceneCode));
-        BaseVo vo = mongoTemplate.findOne(query, BaseVo.class, "t_site_model");
-        log.info("vo: {}", vo);
-        Object data = vo.getData();
-        String s = JSON.toJSONString(data);
-        SiteModel siteModel = JSONObject.parseObject(s, SiteModel.class);
-        return siteModel;
-    }
-
-    @Override
-    public SiteModel findById(Long id, String code) {
-
-        SiteModel siteModel = findBySceneCode(code);
-        return siteModel;
-    }
-
-    @Override
-    public Result getData(JSONObject param, String code) {
-        String type = param.getString("type");
-        if (!"BUILDING".equals(type)) {
-            throw new RuntimeException("非BUILDING类型");
-        }
-
-
-        SiteModel siteModel = findBySceneCode(code);
-
-        if (siteModel != null) {
-            siteModel.setChildren(new ArrayList<>());
-            return Result.success(siteModel);
-        }
-
-        return Result.success();
-    }
-
-    @Override
-    public Result search(String sceneCode, SiteModelSearchDto searchDto) {
-        SiteModel siteModel = findBySceneCode(sceneCode);
-
-        List<SiteModel> loopModel = getLoopModel(siteModel);
-        String searchKey = searchDto.getQuery();
-        Integer size = searchDto.getSize();
-        size = size==null?10: size;
-        List<SiteModel> collect = loopModel.stream().filter(p -> getContent(p, searchKey)).limit(size).collect(Collectors.toList());
-        log.info("返回collect数量: {}", collect.size());
-
-        // 映射实体名称
-        List<Object> result = ormSiteModel(collect);
-
-        return Result.success(result);
-    }
-
-    @Override
-    public Result latest(String sceneCode, Double[] location, Double radius) {
-        SiteModel siteModel = findBySceneCode(sceneCode);
-
-        // 递归为对象
-        List<SiteModel> loopModel = getLoopModel(siteModel);
-
-        // 获取点在多边形的集合
-        List<SiteModel> result = loopModel.stream().filter(p -> pointIsArea(location, p)).collect(Collectors.toList());
-
-        log.info("没有父级的数量:{}", result.size());
-        // 将父级有parenId的对象添加到result
-        addSiteMode(loopModel, result);
-        log.info("添加父级后的数量:{}", result.size());
-
-
-        return Result.success(loopModel);
-    }
-
-    @Override
-    public Result testData(String sceneCode) {
-        SiteModel SiteModel = findBySceneCode(sceneCode);
-        return Result.success(SiteModel);
-    }
-
-
-    /**
-     * 将父节点添加到结果集
-     * @param loopModel
-     * @param result
-     */
-    private void addSiteMode(List<SiteModel> loopModel, List<SiteModel> result) {
-        Set<SiteModel> parentSiteModel = getParentSiteModel(loopModel, result);
-        for (SiteModel siteModel : parentSiteModel) {
-            result.add(siteModel);
-        }
-    }
-
-    /**
-     * 获取父节点
-     * @param loopModel
-     * @param result
-     * @return
-     */
-    private Set<SiteModel> getParentSiteModel(List<SiteModel> loopModel, List<SiteModel> result){
-        Set<SiteModel>  parent = new HashSet<>();
-        for (SiteModel siteModel : loopModel) {
-            for (SiteModel model : result) {
-                if (model.getParentId() == siteModel.getId()) {
-                    parent.add(siteModel);
-                }
-            }
-        }
-        return parent;
-    }
-
-
-    /**
-     * 输入点是否在多边形内
-     * @param point
-     * @param param
-     * @return
-     */
-    private boolean pointIsArea(Double[] point, SiteModel param){
-        // 获取多边行点
-        Polygon polygon = param.getPolygon();
-        if (polygon == null) {
-            return false;
-        }
-        List<List<List<Double>>> coordinates = polygon.getCoordinates();
-        if (CollectionUtils.isEmpty(coordinates)){
-            return false;
-        }
-        List<List<Double>> lists = coordinates.get(0);
-        if (CollectionUtils.isEmpty(lists)){
-            return false;
-        }
-
-        Point2D.Double pointDouble = new Point2D.Double();
-        pointDouble.setLocation(point[0], point[1]);
-
-
-        List<Point2D.Double> allPoints = lists.stream()
-                .map(points -> new Point2D.Double(points.get(0), points.get(1))).collect(Collectors.toList());
-
-        Boolean inArea = GisUtils.rayCasting(allPoints, pointDouble);
-        log.info("是否在多边型内: {}",  inArea);
-
-        return inArea;
-    }
-
-
-
-
-
-    // 前端需要, 映射实体
-    private List<Object> ormSiteModel(List<SiteModel> collect){
-        List<Object> list = new ArrayList<>();
-        for (SiteModel siteModel : collect) {
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("id", siteModel.getId());
-            jsonObject.put("title", siteModel.getName());
-            jsonObject.put("matching_title", siteModel.getName());
-            jsonObject.put("matching_description", null);
-            list.add(jsonObject);
-        }
-        return list;
-
-    }
-
-    // 模糊匹配
-    private Boolean getContent(SiteModel p, String searchKey){
-        String name = p.getName();
-        log.info("name: {}, 配备结果:{}", name, name.contains(searchKey));
-        return name.contains(searchKey);
-    }
-
-
-
-    // 判断的坐标在那个空间位置
-    private boolean getSm(SiteModel model, Point2D.Double pointParam) {
-        if (CollectionUtils.isEmpty(model.getPolygon().getCoordinates())
-                || CollectionUtils.isEmpty(model.getPolygon().getCoordinates().get(0))
-                || CollectionUtils.isEmpty(model.getPolygon().getCoordinates().get(0).get(0))) {
-            return false;
-        }
-
-        List<Point2D.Double> allPoints = model.getPolygon().getCoordinates().get(0).stream()
-                .map(points -> new Point2D.Double(points.get(0), points.get(1))).collect(Collectors.toList());
-        if (JsonUtil.IsPtInPoly(pointParam, allPoints)) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * type=FLOOR 时,polygon=null
-     * @param model
-     * @param pointParam
-     * @return
-     */
-    private boolean getSmByFloor(SiteModel model, Point2D.Double pointParam) {
-        Polygon polygon = model.getPolygon();
-        if (polygon == null) {
-            return true;
-        }
-
-        List<Point2D.Double> allPoints = model.getPolygon().getCoordinates().get(0).stream()
-                .map(points -> new Point2D.Double(points.get(0), points.get(1))).collect(Collectors.toList());
-        if (JsonUtil.IsPtInPoly(pointParam, allPoints)) {
-            return true;
-        }
-        return false;
-    }
-
-
-    // 把当前节点的children 设为空数组
-    private SiteModel copyModelNotContainChildren(SiteModel siteModel) {
-        SiteModel newSiteModel = new SiteModel();
-        BeanUtils.copyProperties(siteModel, newSiteModel);
-        // 设置空数组
-        newSiteModel.setChildren(new ArrayList<>());
-        return newSiteModel;
-    }
-
-
-
-
-
-
-
-
-    /**
-     * 2021-07-14
-     * 获取原来的对象test1 一共是17条
-     * @param siteModel
-     * @param models 数量回保存到原来的数据
-     */
-    private void organizeModels2(SiteModel siteModel, List<SiteModel> models) {
-        for (SiteModel child : siteModel.getChildren()) {
-            models.add(copyModelNotContainChildren(child));
-            if (!CollectionUtils.isEmpty(child.getChildren())) {
-                organizeModels2(child, models);
-            }
-        }
-//        log.info("models.size: {}", models.size());
-    }
-
-
-    private void organizeModels3(SiteModel siteModel, List<SiteModel> models) {
-        for (SiteModel child : siteModel.getChildren()) {
-            Integer id = siteModel.getId();
-            child.setParentId(id);
-            models.add(copyModelNotContainChildren(child));
-            if (!CollectionUtils.isEmpty(child.getChildren())) {
-                organizeModels3(child, models);
-            }
-        }
-//        log.info("models.size: {}", models.size());
-    }
-
-
-    /**
-     * 2021-07-16
-     * 递归出每一个对象
-     * @param siteModel
-     * @return
-     */
-    private List<SiteModel> getLoopModel(SiteModel siteModel){
-        List<SiteModel> models = new ArrayList<>();
-        // copy实体对象
-        SiteModel newSiteModel = copyModelNotContainChildren(siteModel);
-        // 做为父节点的低一条
-        models.add(newSiteModel);
-        if (!CollectionUtils.isEmpty(siteModel.getChildren())) {
-//            organizeModels2(siteModel, models);
-            organizeModels3(siteModel, models);
-        }
-        log.info("models.size: {}", models.size());
-        return models;
-
-    }
-}