コード例 #1
0
  /**
   * Retrieves all nodes for the bounding box and populates the node id tracker.
   *
   * @param bboxCtx The bounding box data.
   */
  private void populateNodeIds(BoundingBoxContext bboxCtx) {
    IdTracker idTracker;

    idTracker = new DynamicIdTracker();

    // Search through all nodes in the tile range and add them to a
    // temporary id tracker. This temporary id tracker allows all node ids
    // to be sorted ascendingly prior to retrieving the nodes themselves
    // which improves index performance.
    try (ReleasableIterator<Long> nodeIdsForTileset =
        getNodeIdsForTileRange(bboxCtx.minimumTile, bboxCtx.maximumTile)) {
      while (nodeIdsForTileset.hasNext()) {
        idTracker.set(nodeIdsForTileset.next());
      }
    }

    // Check to see whether each applicable node lies within the bounding
    // box and add them to the result id list if they are.
    for (long nodeId : idTracker) {
      Node node = getNode(nodeId);

      // Determine if the node lies within the required bounding box.
      if (isNodeInsideBox(bboxCtx.boundingBox, node)) {
        bboxCtx.nodeIdTracker.set(nodeId);
      }
    }
  }
コード例 #2
0
  public void process(RelationContainer container) {
    for (RelationMember member : container.getEntity().getMembers()) {
      EntityType memberType = member.getMemberType();

      if (memberType.equals(EntityType.Way)) {
        requiredWays.set(member.getMemberId());
      } else if (memberType.equals(EntityType.Node)) {
        requiredNodes.set(member.getMemberId());
      }
    }

    allRelations.add(container);
  }
コード例 #3
0
  private boolean isRequiredWay(Way way) {
    long wayId = way.getId();

    if (requiredWays.get(wayId)) return true;

    return usedByTag && !isEmptyTagSet(way.getTags());
  }
コード例 #4
0
  private void sendNodes() {
    // mark all nodes as required
    ReleasableIterator<WayContainer> wayIterator = allWays.iterate();
    while (wayIterator.hasNext()) {
      Way way = wayIterator.next().getEntity();

      if (!isRequiredWay(way)) continue;

      for (WayNode nodeReference : way.getWayNodes()) {
        long nodeId = nodeReference.getNodeId();
        requiredNodes.set(nodeId);
      }
    }
    wayIterator.release();

    ReleasableIterator<NodeContainer> nodeIterator = allNodes.iterate();
    while (nodeIterator.hasNext()) {
      NodeContainer nodeContainer = nodeIterator.next();
      if (!isRequiredNode(nodeContainer.getEntity())) {
        continue;
      }
      sink.process(nodeContainer);
    }

    nodeIterator.release();
  }
コード例 #5
0
  private boolean isRequiredNode(Node node) {
    long nodeId = node.getId();

    if (requiredNodes.get(nodeId)) return true;

    return usedByTag && !isEmptyTagSet(node.getTags());
  }
コード例 #6
0
 /**
  * Creates a new instance.
  *
  * @param nodeIdList The set of nodes to be returned.
  * @param wayIdList The set of ways to be returned.
  * @param relationIdList The set of relations to be returned.
  */
 public ResultIterator(IdTracker nodeIdList, IdTracker wayIdList, IdTracker relationIdList) {
   nodeIds = nodeIdList.iterator();
   wayIds = wayIdList.iterator();
   relationIds = relationIdList.iterator();
 }