internal static void GetMetric(Envelope self,
                                out Interval xrange, out Interval yrange,
                                out Interval zrange, out Interval mrange)
 {
     xrange = Interval.Create(self.MinX, self.MaxX);
     yrange = Interval.Create(self.MinY, self.MaxY);
     zrange = Interval.Create();
     mrange = Interval.Create();
 }
        /// <summary>
        /// Method to query all features that intersect a given <see cref="extent"/>
        /// </summary>
        /// <param name="extent">The area used to look for features</param>
        /// <returns>An enumeration of features</returns>
        public System.Collections.Generic.IEnumerable <IFeature> Intersect(Extent extent)
        {
            var env = new SharpSbn.DataStructures.Envelope(extent.MinX, extent.MaxX, extent.MinY, extent.MaxY);

            foreach (var queryFid in _tree.QueryFids(env))
            {
                var fid = (int)queryFid - 1;
                yield return(_featureSet.GetFeature(fid));
            }
        }
Example #3
0
        /// <summary>
        /// Method to remove the feature <paramref name="fid"/>
        /// </summary>
        /// <param name="fid">The id of the feature</param>
        /// <param name="envelope">The envelope in which to search for the feature</param>
#pragma warning disable 3001
        public void Remove(uint fid, Envelope envelope = null)
#pragma warning restore 3001
        {
            Monitor.Enter(_syncRoot);

            envelope = envelope ?? _header.Extent;
            var searchFeature = new SbnFeature(_header, fid, envelope);

            Root.Remove(searchFeature);

            Monitor.Exit(_syncRoot);
        }
        /// <summary>
        /// Method to query all features that intersect a given <see cref="geometry"/>
        /// </summary>
        /// <param name="geometry">The geometry used to look for features</param>
        /// <returns>An enumeration of features</returns>
        public System.Collections.Generic.IEnumerable <IFeature> Intersect(Topology.IGeometry geometry)
        {
            var dsEnv = geometry.EnvelopeInternal.ToExtent();
            var env   = new SharpSbn.DataStructures.Envelope(dsEnv.MinX, dsEnv.MaxX, dsEnv.MinY, dsEnv.MaxY);

            foreach (var queryFid in _tree.QueryFids(env))
            {
                var fid = (int)queryFid - 1;
                var f   = _featureSet.GetFeature(fid);
                if (geometry.Intersects(Topology.Geometry.FromBasicGeometry(f)))
                {
                    yield return(f);
                }
            }
        }
Example #5
0
        /// <summary>
        /// Method to insert a new feature to the tree
        /// </summary>
        /// <param name="fid">The feature's id</param>
        /// <param name="envelope">The feature's geometry</param>
        /// <param name="zRange">The z-ordinate extent</param>
        /// <param name="mRange">The m-ordinate extent</param>
#pragma warning disable 3001
        public void Insert(uint fid, Envelope envelope, Interval?zRange = null, Interval?mRange = null)
#pragma warning restore 3001
        {
            // lock the tree
            Monitor.Enter(_syncRoot);

            // Convert to an sbnfeature
            var sbnFeature = ToSbnFeature(fid, envelope);

            var inserted = false;

            // Has the tree already been built?
            if (Built)
            {
                // Does the feature fit into the current tree, signal that
                // the tree needs to be recreated in order to function properly.
                if (!_header.Extent.Contains(envelope))
                {
                    OnRebuildRequired(new SbnTreeRebuildRequiredEventArgs(fid, envelope, zRange, mRange));
                    Monitor.Exit(_syncRoot);
                    return;
                }

                // Compute number of features in tree
                var featureCount = FeatureCount + 1;

                // Does the new number of features require more levels?
                if (GetNumberOfLevels(featureCount) != NumLevels)
                {
                    // This can be done inplace.
                    RebuildTree(featureCount, sbnFeature);
                    inserted = true;
                }
            }

            //Insert the feature
            if (!inserted)
            {
                Insert(sbnFeature);
            }

            // Update the header metrics
            _header.AddFeature(fid, envelope, zRange ?? Interval.Create(), mRange ?? Interval.Create());

            // unlock the tree
            Monitor.Exit(_syncRoot);
        }
Example #6
0
        /// <summary>
        /// Method to query the ids of features that intersect with <paramref name="extent"/>
        /// </summary>
        /// <param name="extent">The extent</param>
        /// <returns>An enumeration of feature ids</returns>
        public IEnumerable <uint> QueryFids(Envelope extent)
        {
            var res = new List <uint>();

            Monitor.Enter(_syncRoot);

            extent = _header.Extent.Intersection(extent);
            byte minx, miny, maxx, maxy;

            ClampUtility.Clamp(_header.Extent, extent,
                               out minx, out miny, out maxx, out maxy);

            Root.QueryFids(minx, miny, maxx, maxy, res);

            Monitor.Exit(_syncRoot);

            res.Sort();

            return(res);
        }
Example #7
0
 /// <summary>
 /// Method to create an <see cref="SbnFeature"/> from an id and an envelope
 /// </summary>
 /// <param name="fid">The feature's id</param>
 /// <param name="envelope">The geometry</param>
 /// <returns>A sbnfeature</returns>
 private SbnFeature ToSbnFeature(uint fid, Envelope envelope)
 {
     return(new SbnFeature(_header.Extent, fid, envelope));
 }