/** * 根据新产生的Block边界Node分割道路,维护原来路网关系 新产生道路splitRoad * * @param road 原道路 * @param index Node产生所在原道路中的位置 * @param splitPoint Node具体位置坐标点 */ private RoadNew createSplitRoad( RoadNew road, int Indexfrom, int indexTo, List<ShpPoint> points, ShpPoint headerSplitPoint, ShpPoint splitPoint, ShpPoint nodePoint) { // 新建Block边界Node NodeNew blockNode = new NodeNew(); blockNode.point = nodePoint; // 原始坐标 // 创建新的道路形状点 List<ShpPoint> splitPoints = new ArrayList<ShpPoint>( points.subList(Indexfrom, indexTo)); // 避免ConcurrentModificationException if (headerSplitPoint != null) { splitPoints.add(0, ShpPoint.valueOf(headerSplitPoint)); } splitPoints.add(ShpPoint.valueOf(splitPoint)); RoadNew splitRoad = new RoadNew(); splitRoad.copy(road); splitRoad.coordinate = splitPoints; // 第一个开始点有价值 splitRoad.startAngle30m = road.startAngle30m; splitRoad.startAngle60m = road.startAngle60m; // 在合并Rout时需要判断角度 splitRoad.endAngle30m = -90; splitRoad.endAngle60m = -90; road.startAngle30m = 90; road.startAngle60m = 90; // 建立,维护拓扑关系 splitRoad.startNode = road.startNode; road.startNode.roads.add(splitRoad); road.startNode.roads.remove(road); blockNode.roads.add(splitRoad); blockNode.roads.add(road); // road.startNode = splitRoad.endNode = blockNode; road.startNode = blockNode; splitRoad.endNode = blockNode; if (road.fow == defineFOW.JunctionLink) { road.endNode.intersection.allNodes.add(blockNode); blockNode.intersection = road.endNode.intersection; } this.nodeList.add(blockNode); return splitRoad; }
// 该方法是为了保证单个道路的形状点个数少于256 ,从而在格式输出的时候没有问题 void splitRoadByPointCount() { for (int i = this.roadList.size() - 1; i >= 0; i--) { RoadNew road = this.roadList.get(i); for (int count = 0; count < 100; count++) { if (road.coordinate.size() > 255) { NodeNew node = new NodeNew(); node.point = ShpPoint.valueOf(road.coordinate.get(254)); RoadNew splitRoad = new RoadNew(); splitRoad.copy(road); // 长度不需要计算 在分割完成后统一重新计算 splitRoad.coordinate.addAll(road.coordinate.subList(0, 254)); splitRoad.coordinate.add(ShpPoint.valueOf(road.coordinate.get(254))); road.coordinate = new ArrayList<ShpPoint>(road.coordinate.subList(255, road.coordinate.size())); // 第一个开始点有价值 splitRoad.startAngle30m = road.startAngle30m; splitRoad.startAngle60m = road.startAngle60m; // 在合并Rout时需要判断角度 splitRoad.endAngle30m = -90; splitRoad.endAngle60m = -90; road.startAngle30m = 90; road.startAngle60m = 90; // 维护拓扑关系 splitRoad.startNode = road.startNode; splitRoad.endNode = node; road.startNode = node; splitRoad.startNode.roads.remove(road); splitRoad.startNode.roads.add(splitRoad); node.roads.add(splitRoad); node.roads.add(road); this.nodeList.add(node); this.roadList.add(splitRoad); } else if (road.coordinate.size() < 2 || (road.coordinate.size() == 2 && road.coordinate.get(0).equals(road.coordinate.get(1)))) { road.delFlag = true; } else { break; } } } }