Пример #1
0
  // 二叉路合并
  public void mergerBinaryRoad() {
    for (NodeNew node : nodeList) {
      // node只连接两条路
      if (node.roads.size() == 2) {
        RoadNew roadFirst = node.roads.get(0);
        RoadNew roadSecond = node.roads.get(1);
        if (node.canMerge() == true) { // 是否可以合并
          RoadNew roadMergedFrom = roadSecond; // 被合并掉的道路
          RoadNew roadMergedTo = roadFirst; // 合并后的新道路
          // 头&头
          if (roadFirst.startNode.equals(roadSecond.startNode)) {
            // 把点少的道路反转方向
            if (roadFirst.coordinate.size() >= roadSecond.coordinate.size()) {
              Collections.reverse(roadSecond.coordinate);

              roadSecond.coordinate.remove(roadSecond.coordinate.size() - 1);
              roadSecond.coordinate.addAll(roadFirst.coordinate);
              roadFirst.coordinate = roadSecond.coordinate;

              roadFirst.startNode = roadSecond.endNode;
              roadFirst.startNode.roads.remove(roadSecond);
              roadSecond.delFlag = true;
              roadFirst.startNode.roads.add(roadFirst);
              roadFirst.startAngle30m = roadSecond.endAngle30m;
              roadFirst.startAngle60m = roadSecond.endAngle60m;
            } else {
              Collections.reverse(roadFirst.coordinate);

              roadFirst.coordinate.remove(roadFirst.coordinate.size() - 1);
              roadFirst.coordinate.addAll(roadSecond.coordinate);
              roadSecond.coordinate = roadFirst.coordinate;

              roadSecond.startNode = roadFirst.endNode;
              roadSecond.startNode.roads.remove(roadFirst);
              roadFirst.delFlag = true;
              roadSecond.startNode.roads.add(roadSecond);
              roadSecond.startAngle30m = roadFirst.endAngle30m;
              roadSecond.startAngle60m = roadFirst.endAngle60m;
              roadMergedFrom = roadFirst;
              roadMergedTo = roadSecond;
            }
            // 尾&尾
          } else if (roadFirst.endNode.equals(roadSecond.endNode)) {
            // 把点少的道路反转方向
            if (roadFirst.coordinate.size() >= roadSecond.coordinate.size()) {
              Collections.reverse(roadSecond.coordinate);

              roadFirst.coordinate.remove(roadFirst.coordinate.size() - 1);
              roadFirst.coordinate.addAll(roadSecond.coordinate);

              roadFirst.endNode = roadSecond.startNode;
              roadFirst.endNode.roads.remove(roadSecond);
              roadSecond.delFlag = true;
              roadFirst.endNode.roads.add(roadFirst);

              roadFirst.endAngle30m = roadSecond.startAngle30m;
              roadFirst.endAngle60m = roadSecond.startAngle60m;

            } else {
              Collections.reverse(roadFirst.coordinate);

              roadSecond.coordinate.remove(roadSecond.coordinate.size() - 1);
              roadSecond.coordinate.addAll(roadFirst.coordinate);

              roadSecond.endNode = roadFirst.startNode;
              roadSecond.endNode.roads.remove(roadFirst);
              roadFirst.delFlag = true;
              roadSecond.endNode.roads.add(roadSecond);

              roadSecond.endAngle30m = roadFirst.startAngle30m;
              roadSecond.endAngle60m = roadFirst.startAngle60m;
              roadMergedFrom = roadFirst;
              roadMergedTo = roadSecond;
            }
            // 头&尾
          } else if (roadFirst.startNode.equals(roadSecond.endNode)) {
            roadFirst.startNode = roadSecond.startNode;
            roadFirst.startNode.roads.remove(roadSecond);
            roadSecond.delFlag = true;
            roadFirst.startNode.roads.add(roadFirst);

            roadSecond.coordinate.remove(roadSecond.coordinate.size() - 1);
            roadSecond.coordinate.addAll(roadFirst.coordinate);
            roadFirst.coordinate = roadSecond.coordinate;

            roadFirst.startAngle30m = roadSecond.startAngle30m;
            roadFirst.startAngle60m = roadSecond.startAngle60m;
          } else if (roadFirst.endNode.equals(roadSecond.startNode)) {
            roadFirst.endNode = roadSecond.endNode;
            roadFirst.endNode.roads.remove(roadSecond);
            roadSecond.delFlag = true;
            roadFirst.endNode.roads.add(roadFirst);

            roadFirst.coordinate.remove(roadFirst.coordinate.size() - 1);
            roadFirst.coordinate.addAll(roadSecond.coordinate);

            roadFirst.endAngle30m = roadSecond.endAngle30m;
            roadFirst.endAngle60m = roadSecond.endAngle60m;
          } else {
            System.err.println("二叉路合并时发生错误!");
          }
          // 如果roadMergedTo是虚拟道理,要把roadMergedFrom的属性(长度、形状、拓扑关系除外)克隆过来
          if (roadMergedTo.fow == defineFOW.JunctionLink) {
            roadMergedTo.copy(roadMergedFrom);
          }
          // 属性赋值
          roadMergedTo.length += roadMergedFrom.length;
          roadMergedTo.lb.x = Math.min(roadMergedTo.lb.x, roadMergedFrom.lb.x);
          roadMergedTo.lb.y = Math.min(roadMergedTo.lb.y, roadMergedFrom.lb.y);
          roadMergedTo.rt.x = Math.max(roadMergedTo.rt.x, roadMergedFrom.rt.x);
          roadMergedTo.rt.y = Math.max(roadMergedTo.rt.y, roadMergedFrom.rt.y);

          // 添加删除标记
          node.delFlag = true;
        }
      }
    }
    // System.out.println("--------------");
    clearRoadList();
    clearNodeList();
    clearIntersectionList();
  }