コード例 #1
0
        public void Query(HashSet <ISpatialTreeNode> hashSet, CoordinateRectangle rectangle, IntersectResult parentResult, SpatialQueryIterator i)
        {
            //Query elements on the map by coordinate ractengle(indexed search)
            lock (this)
            {
                if (!IsBottomSheet)
                {
                    if (Sheets.HasChilds)
                    {
                        foreach (var sheet in Sheets.Values)
                        {
                            var res = parentResult == IntersectResult.Supersets ? IntersectResult.Supersets : IntersectResult.None;

                            if (res != IntersectResult.Supersets)
                            {
                                i.Next();

                                res = sheet.Rectangle.RectangleContains(rectangle);
                            }
                            if (res != IntersectResult.None)
                            {
                                sheet.Query(hashSet, rectangle, res, i);
                            }
                            if (res == IntersectResult.Contains)
                            {
                                break;
                            }
                        }
                    }
                }
                else if (Content.HasChilds)
                {
                    foreach (var node in Content.Values)
                    {
                        var res = parentResult == IntersectResult.Supersets ? IntersectResult.Supersets : IntersectResult.None;
                        if (res != IntersectResult.Supersets)
                        {
                            i.Next();

                            switch (node.NodeType)
                            {
                            case SpatialTreeNodeTypes.Point:
                                res = rectangle.PointContains(node.Coordinate);
                                break;

                            case SpatialTreeNodeTypes.Line:
                                res = rectangle.LineContains(node.Rectangle);
                                break;

                            case SpatialTreeNodeTypes.Rectangle:
                                res = rectangle.RectangleContains(node.Rectangle);
                                break;

                            case SpatialTreeNodeTypes.Poligon:
                                res = rectangle.PoligonContains(node.Poligon);
                                break;
                            }
                        }
                        if (res != IntersectResult.None)
                        {
                            hashSet.Add(node);
                        }
                    }
                }
            }
        }