Пример #1
0
  private void attachRoadSegments(
      RoutingContext ctx, List<RouteSegmentResult> result, int routeInd, int pointInd, boolean plus)
      throws IOException {
    RouteSegmentResult rr = result.get(routeInd);
    RouteDataObject road = rr.getObject();
    long nextL = pointInd < road.getPointsLength() - 1 ? getPoint(road, pointInd + 1) : 0;
    long prevL = pointInd > 0 ? getPoint(road, pointInd - 1) : 0;

    // attach additional roads to represent more information about the route
    RouteSegmentResult previousResult = null;

    // by default make same as this road id
    long previousRoadId = road.getId();
    if (pointInd == rr.getStartPointIndex() && routeInd > 0) {
      previousResult = result.get(routeInd - 1);
      previousRoadId = previousResult.getObject().getId();
      if (previousRoadId != road.getId()) {
        if (previousResult.getStartPointIndex() < previousResult.getEndPointIndex()
            && previousResult.getEndPointIndex()
                < previousResult.getObject().getPointsLength() - 1) {
          rr.attachRoute(
              pointInd,
              new RouteSegmentResult(
                  previousResult.getObject(),
                  previousResult.getEndPointIndex(),
                  previousResult.getObject().getPointsLength() - 1));
        } else if (previousResult.getStartPointIndex() > previousResult.getEndPointIndex()
            && previousResult.getEndPointIndex() > 0) {
          rr.attachRoute(
              pointInd,
              new RouteSegmentResult(
                  previousResult.getObject(), previousResult.getEndPointIndex(), 0));
        }
      }
    }
    Iterator<RouteSegment> it;
    if (rr.getPreAttachedRoutes(pointInd) != null) {
      final RouteSegmentResult[] list = rr.getPreAttachedRoutes(pointInd);
      it =
          new Iterator<BinaryRoutePlanner.RouteSegment>() {
            int i = 0;

            @Override
            public boolean hasNext() {
              return i < list.length;
            }

            @Override
            public RouteSegment next() {
              RouteSegmentResult r = list[i++];
              return new RouteSegment(r.getObject(), r.getStartPointIndex());
            }

            @Override
            public void remove() {}
          };
    } else {
      RouteSegment rt =
          ctx.loadRouteSegment(
              road.getPoint31XTile(pointInd),
              road.getPoint31YTile(pointInd),
              ctx.config.memoryLimitation);
      it = rt.getIterator();
    }
    // try to attach all segments except with current id
    while (it.hasNext()) {
      RouteSegment routeSegment = it.next();
      if (routeSegment.road.getId() != road.getId()
          && routeSegment.road.getId() != previousRoadId) {
        RouteDataObject addRoad = routeSegment.road;
        checkAndInitRouteRegion(ctx, addRoad);
        // TODO restrictions can be considered as well
        int oneWay = ctx.getRouter().isOneWay(addRoad);
        if (oneWay >= 0 && routeSegment.getSegmentStart() < addRoad.getPointsLength() - 1) {
          long pointL = getPoint(addRoad, routeSegment.getSegmentStart() + 1);
          if (pointL != nextL && pointL != prevL) {
            // if way contains same segment (nodes) as different way (do not attach it)
            rr.attachRoute(
                pointInd,
                new RouteSegmentResult(
                    addRoad, routeSegment.getSegmentStart(), addRoad.getPointsLength() - 1));
          }
        }
        if (oneWay <= 0 && routeSegment.getSegmentStart() > 0) {
          long pointL = getPoint(addRoad, routeSegment.getSegmentStart() - 1);
          // if way contains same segment (nodes) as different way (do not attach it)
          if (pointL != nextL && pointL != prevL) {
            rr.attachRoute(
                pointInd, new RouteSegmentResult(addRoad, routeSegment.getSegmentStart(), 0));
          }
        }
      }
    }
  }