Esempio n. 1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="searchEnv"></param>
 /// <param name="visitor"></param>
 private void VisitItems(Envelope searchEnv, IItemVisitor <T> visitor)
 {
     // would be nice to filter items based on search envelope, but can't until they contain an envelope
     for (IEnumerator <T> i = _items.GetEnumerator(); i.MoveNext();)
     {
         visitor.VisitItem(i.Current);
     }
 }
        public override void Query(double queryMin, double queryMax, IItemVisitor <T> visitor)
        {
            if (!Intersects(queryMin, queryMax))
            {
                return;
            }

            visitor.VisitItem(_item);
        }
        /// <inheritdoc cref="ISpatialIndex{T}.Query(Envelope, IItemVisitor{T})"/>
        public void Query(Envelope searchBounds, IItemVisitor <T> visitor)
        {
            // if the tree has not been built, do it now.
            if (_pos != _boxes.Length)
            {
                Build();
            }

            int nodeIndex = _boxes.Length - 1;
            int level     = _levelBounds.Length - 1;

            // stack for traversing nodes
            var  stack = new Stack <int>();
            bool done  = false;

            while (!done)
            {
                // find the end index of the node
                int end = Math.Min(nodeIndex + _nodeSize, UpperBound(nodeIndex, _levelBounds));

                // search through child nodes
                for (int pos = nodeIndex; pos < end; pos++)
                {
                    int index = _indices[pos];

                    // check if node bbox intersects with query bbox
                    if (!searchBounds.Intersects(_boxes[pos]))
                    {
                        continue;
                    }

                    if (nodeIndex < _numItems)
                    {
                        visitor.VisitItem(_items[index]);
                    }
                    else
                    {
                        // push node index and level for further traversal
                        stack.Push(index);
                        stack.Push(level - 1);
                    }
                }

                if (stack.Count > 1)
                {
                    level     = stack.Pop();
                    nodeIndex = stack.Pop();
                }
                else
                {
                    done = true;
                }
            }
        }
Esempio n. 4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="searchEnv"></param>
 /// <param name="visitor"></param>
 protected virtual void VisitItems(Rectangle searchEnv, IItemVisitor <TItem> visitor)
 {
     // would be nice to filter items based on search envelope, but can't until they contain an envelope
     // lytico: what about having IItemVisitor.GetEnvelope(TItem item)
     if (HasItems)
     {
         foreach (var current in Items)
         {
             visitor.VisitItem(current);
         }
     }
 }
Esempio n. 5
0
 private void Query(T searchBounds, AbstractNode <T, TItem> node, IItemVisitor <TItem> visitor)
 {
     foreach (var childBoundable in node.ChildBoundables)
     {
         if (!IntersectsOp.Intersects(childBoundable.Bounds, searchBounds))
         {
             continue;
         }
         if (childBoundable is AbstractNode <T, TItem> )
         {
             Query(searchBounds, (AbstractNode <T, TItem>)childBoundable, visitor);
         }
         else if (childBoundable is ItemBoundable <T, TItem> )
         {
             visitor.VisitItem(((ItemBoundable <T, TItem>)childBoundable).Item);
         }
         else
         {
             Assert.ShouldNeverReachHere();
         }
     }
 }
Esempio n. 6
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="searchBounds"></param>
 /// <param name="node"></param>
 /// <param name="visitor"></param>
 private void Query(object searchBounds, AbstractNode node, IItemVisitor visitor)
 {
     foreach (object obj in node.ChildBoundables)
     {
         IBoundable childBoundable = (IBoundable)obj;
         if (!IntersectsOp.Intersects(childBoundable.Bounds, searchBounds))
         {
             continue;
         }
         if (childBoundable is AbstractNode)
         {
             Query(searchBounds, (AbstractNode)childBoundable, visitor);
         }
         else if (childBoundable is ItemBoundable)
         {
             visitor.VisitItem(((ItemBoundable)childBoundable).Item);
         }
         else
         {
             Assert.ShouldNeverReachHere();
         }
     }
 }
Esempio n. 7
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="searchEnv"></param>
 /// <param name="visitor"></param>
 private void VisitItems(IEnvelope searchEnv, IItemVisitor visitor)
 {
     // would be nice to filter items based on search envelope, but can't until they contain an envelope
     for (IEnumerator i = _items.GetEnumerator(); i.MoveNext(); )
         visitor.VisitItem(i.Current);
 }
Esempio n. 8
0
 private void Query(object searchBounds, AbstractNode node, IItemVisitor visitor)
 {
     foreach (var obj in node.ChildBoundables)
     {
         var childBoundable = (IBoundable)obj;
         if (!IntersectsOp.Intersects(childBoundable.Bounds, searchBounds))
             continue;
         if (childBoundable is AbstractNode)
             Query(searchBounds, (AbstractNode)childBoundable, visitor);
         else if (childBoundable is ItemBoundable)
             visitor.VisitItem(((ItemBoundable)childBoundable).Item);
         else Assert.ShouldNeverReachHere();
     }
 }