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