Ejemplo n.º 1
0
  public void loadRoutes(final RoutingContext ctx, int tileX, int tileY) throws IOException {
    int tileC = (tileX << ctx.getZoomToLoadTileWithRoads()) + tileY;
    if (ctx.loadedTiles.contains(tileC)) {
      return;
    }
    long now = System.nanoTime();

    int zoomToLoad = 31 - ctx.getZoomToLoadTileWithRoads();
    SearchFilter searchFilter =
        new BinaryMapIndexReader.SearchFilter() {
          @Override
          public boolean accept(TIntArrayList types, MapIndex index) {
            for (int j = 0; j < types.size(); j++) {
              int wholeType = types.get(j);
              TagValuePair pair = index.decodeType(wholeType);
              if (pair != null) {
                int t = wholeType & 3;
                if (t == MapRenderingTypes.POINT_TYPE) {
                  if (ctx.getRouter().acceptPoint(pair)) {
                    return true;
                  }
                } else if (t == MapRenderingTypes.POLYLINE_TYPE) {
                  if (ctx.getRouter().acceptLine(pair)) {
                    return true;
                  }
                }
              }
            }
            return false;
          }
        };
    SearchRequest<BinaryMapDataObject> request =
        BinaryMapIndexReader.buildSearchRequest(
            tileX << zoomToLoad,
            (tileX + 1) << zoomToLoad,
            tileY << zoomToLoad,
            (tileY + 1) << zoomToLoad,
            15,
            searchFilter);
    for (BinaryMapIndexReader r : map) {
      r.searchMapIndex(request);
      for (BinaryMapDataObject o : request.getSearchResults()) {
        BinaryMapDataObject old = ctx.idObjects.get(o.getId());
        // sometimes way are presented only partially in one index
        if (old != null && old.getPointsLength() >= o.getPointsLength()) {
          continue;
        }
        ctx.idObjects.put(o.getId(), o);
        for (int j = 0; j < o.getPointsLength(); j++) {
          long l = (((long) o.getPoint31XTile(j)) << 31) + (long) o.getPoint31YTile(j);
          RouteSegment segment = new RouteSegment();
          segment.road = o;
          segment.segmentEnd = segment.segmentStart = j;
          if (ctx.routes.get(l) != null) {
            segment.next = ctx.routes.get(l);
          }
          ctx.routes.put(l, segment);
        }
      }
      ctx.loadedTiles.add(tileC);
      ctx.timeToLoad += (System.nanoTime() - now);
    }
  }
Ejemplo n.º 2
0
  public RouteSegment findRouteSegment(double lat, double lon, RoutingContext ctx)
      throws IOException {
    double tileX = MapUtils.getTileNumberX(ctx.getZoomToLoadTileWithRoads(), lon);
    double tileY = MapUtils.getTileNumberY(ctx.getZoomToLoadTileWithRoads(), lat);
    loadRoutes(ctx, (int) tileX, (int) tileY);

    RouteSegment road = null;
    double sdist = 0;
    int px = MapUtils.get31TileNumberX(lon);
    int py = MapUtils.get31TileNumberY(lat);
    for (BinaryMapDataObject r : ctx.values()) {
      if (r.getPointsLength() > 1) {
        double priority = ctx.getRouter().getRoadPriorityToCalculateRoute(r);
        for (int j = 1; j < r.getPointsLength(); j++) {
          double mDist =
              squareRootDist(
                  r.getPoint31XTile(j),
                  r.getPoint31YTile(j),
                  r.getPoint31XTile(j - 1),
                  r.getPoint31YTile(j - 1));
          double projection =
              calculateProjection(
                  r.getPoint31XTile(j - 1),
                  r.getPoint31YTile(j - 1),
                  r.getPoint31XTile(j),
                  r.getPoint31YTile(j),
                  px,
                  py,
                  mDist);
          double currentsDist;
          if (projection
              < 0) { // TODO: first 2 and last 2 points of a route should be only near and not based
                     // on road priority (I.E. a motorway road node unreachable near my house)
            currentsDist =
                squareDist(r.getPoint31XTile(j - 1), r.getPoint31YTile(j - 1), px, py)
                    / (priority * priority);
          } else if (projection > mDist) {
            currentsDist =
                squareDist(r.getPoint31XTile(j), r.getPoint31YTile(j), px, py)
                    / (priority * priority);
          } else {
            currentsDist =
                calculatesquareDistance(
                        r.getPoint31XTile(j - 1),
                        r.getPoint31YTile(j - 1),
                        r.getPoint31XTile(j),
                        r.getPoint31YTile(j),
                        px,
                        py,
                        mDist)
                    / (priority * priority);
          }

          if (road == null || currentsDist < sdist) {
            road = new RouteSegment();
            road.road = r;
            road.segmentStart =
                j
                    - 1; // TODO: first 2 and last 2 segments should be based on projection. my
                         // start/finish point S/F, fake point P between j-1 & j -> SP, PJ; should
                         // end at finish point: JP,PF

            road.segmentEnd = j;
            sdist = currentsDist;
          }
        }
      }
    }
    return road;
  }