Example #1
0
  /**
   * 根据新产生的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;
  }