/** * 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); } } }
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); }
private boolean isRequiredWay(Way way) { long wayId = way.getId(); if (requiredWays.get(wayId)) return true; return usedByTag && !isEmptyTagSet(way.getTags()); }
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(); }
private boolean isRequiredNode(Node node) { long nodeId = node.getId(); if (requiredNodes.get(nodeId)) return true; return usedByTag && !isEmptyTagSet(node.getTags()); }
/** * 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(); }