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 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(); }
/** * 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); } } }