private RTree <byte[]> SetupAnRTreeWithMy4Shapes() { var options = new RTreeOptions() { Dimensions = 2, EnsureTightMBRs = true, TreeVariant = RTreeVariant.RStar, FillFactor = 0.9 }; var rtree = new RTree <byte[]>(options, new ManagedMemoryStorageManager()); var square1 = new Region(new[] { 5.0, -2.0 }, new[] { 12.0, 0.0 }); var square2 = new Region(new[] { -2.0, -5.0 }, new[] { 7, 0.0 }); var square3 = new Region(new[] { -5.0, 1.0 }, new[] { 0, 4.0 }); var circle = new Circle(new Point(new[] { 7.0, 3.0 }), 4); var sq1bytes = Encoding.UTF8.GetBytes("Square1"); rtree.Add(square1, sq1bytes); var sq2bytes = Encoding.UTF8.GetBytes("Square2"); rtree.Add(square2, sq2bytes); var sq3bytes = Encoding.UTF8.GetBytes("Square3"); rtree.Add(square3, sq3bytes); var circlebytes = Encoding.UTF8.GetBytes("Circle"); rtree.Add(circle, circlebytes); return(rtree); }
private RTree <byte[]> GetAFullTree(IStorageManager storageManager) { var options = new RTreeOptions() { Dimensions = 2, EnsureTightMBRs = false, TreeVariant = RTreeVariant.RStar, FillFactor = 0.9, IndexCapacity = 10000, SplitDistributionFactor = 0.5, NearMinimumOverlapFactor = 2 }; var rand = new Random(); var rtree = new RTree <byte[]>(options, storageManager); for (int i = 0; i < 10000; ++i) { if (rand.Next() % 2 != 0) { var randinsert = new Circle(rand.NextDouble() * 5000, rand.NextDouble() * 5000, rand.NextDouble() * 40); rtree.Add(randinsert, DataHelpers.GenerateSomeBytes(rand.Next())); } else { var coordMin = new[] { rand.NextDouble() * 5000, rand.NextDouble() * 5000 }; var coordMax = new[] { coordMin[0] + (rand.NextDouble() * 80), coordMin[1] + (rand.NextDouble() * 80) }; var regioninsert = new Region(coordMin, coordMax); rtree.Add(regioninsert, DataHelpers.GenerateSomeBytes(rand.Next())); } } return(rtree); }
public void RTreeCustomShapesCanBeRecycled() { var filename = Path.GetTempFileName(); long indexId = 0; // create the new storage manager using (var storageManager = new DiskStorageManager(filename)) { var options = new RTreeOptions() { Dimensions = 2, EnsureTightMBRs = true, TreeVariant = RTreeVariant.RStar, FillFactor = 0.9 }; storageManager.DatafileSuffix = "data"; storageManager.IndexfileSuffix = "index"; storageManager.Overwrite = true; storageManager.PageSize = 1024; using (var rtree = new RTree <byte[]>(options, storageManager)) { rtree.Add(new Circle(new Point(0, 0), 16), DataHelpers.GenerateSomeBytes(0x123021)); // verify that our circle is a circle var circle = rtree.IntersectsWith(new Point(0, 0)); Assert.Equal(1, circle.Count()); Assert.Equal(0, rtree.IntersectsWith(new Point(15.99, 15.99)).Count()); indexId = rtree.Options.IndexIdentifier; } } // recycle the storage manager using (var storageManager = new DiskStorageManager(filename)) { storageManager.DatafileSuffix = "data"; storageManager.IndexfileSuffix = "index"; storageManager.Overwrite = false; storageManager.PageSize = 1024; var options = new RTreeOptions(indexId) { Dimensions = 2, EnsureTightMBRs = true, TreeVariant = RTreeVariant.RStar, FillFactor = 0.9 }; using (var rtree = new RTree <byte[]>(options, storageManager)) { // verify that our circle is a circle Assert.Equal(1, rtree.IntersectsWith(new Point(0, 0)).Count()); Assert.Equal(0, rtree.IntersectsWith(new Point(15.5, 15.5)).Count()); } } }
public void TestWithActualObject() { var options = new RTreeOptions() { Dimensions = 2, EnsureTightMBRs = true, TreeVariant = RTreeVariant.RStar, FillFactor = 0.9 }; var rtree = new RTree <RTreeTestValueType>(options, new ManagedMemoryStorageManager()); var square1 = new Region(new[] { 5.0, -2.0 }, new[] { 12.0, 0.0 }); var square2 = new Region(new[] { -2.0, -5.0 }, new[] { 7, 0.0 }); var square3 = new Region(new[] { -5.0, 1.0 }, new[] { 0, 4.0 }); var circle = new Circle(new Point(new[] { 7.0, 3.0 }), 4); var sq1data = new RTreeTestValueType() { Id = Guid.NewGuid(), Name = "Square1", Index = 0, Description = "The Description for square1's Object" }; rtree.Add(square1, sq1data); var sq2data = new RTreeTestValueType() { Id = Guid.NewGuid(), Name = "Square2", Index = 1, Description = "The Description for square2's Object" }; rtree.Add(square2, sq2data); var sq3data = new RTreeTestValueType() { Id = Guid.NewGuid(), Name = "Square3", Index = 2, Description = "The Description for square3's Object" }; rtree.Add(square3, sq3data); var circledata = new RTreeTestValueType() { Id = Guid.NewGuid(), Name = "Circle", Index = 3, Description = "The Description for the only Circle Object" }; rtree.Add(circle, circledata); var neighbors = rtree.NearestNeighbors(1, new Point(new[] { 11.0, 7.0 })); var neighborCollection = neighbors.Select(node => node.Value).ToList(); Assert.Equal(1, neighborCollection.Count); Assert.Equal(3, neighborCollection[0].Index); var intersects = rtree.IntersectsWith(new Point(new[] { 7.0, -0.5 })); var intersectCollection = intersects.Select(node => node.Value.Index).ToList(); Assert.Equal(3, intersectCollection.Count); Assert.Contains(0, intersectCollection); Assert.Contains(1, intersectCollection); Assert.Contains(3, intersectCollection); Assert.DoesNotContain(2, intersectCollection); var intersectNameCollection = intersects.Select(node => node.Value.Name).ToList(); Assert.Contains("Square1", intersectNameCollection); Assert.Contains("Square2", intersectNameCollection); Assert.Contains("Circle", intersectNameCollection); Assert.DoesNotContain("Square3", intersectNameCollection); }
public void DoABunchOfStuffFromDisk() { var filename = Path.GetTempFileName(); long indexId = 0; // create the new storage manager using (var storageManager = new DiskStorageManager(filename)) { storageManager.DatafileSuffix = "data"; storageManager.IndexfileSuffix = "index"; storageManager.Overwrite = true; storageManager.PageSize = 1024; using (var rtree = GetAFullTree(storageManager)) { Assert.Equal(10000, rtree.Count); indexId = rtree.Options.IndexIdentifier; } } var stopWatch = new Stopwatch(); // recycle the storage manager using (var storageManager = new DiskStorageManager(filename)) { storageManager.DatafileSuffix = "data"; storageManager.IndexfileSuffix = "index"; storageManager.Overwrite = false; storageManager.PageSize = 1024; var options = new RTreeOptions(indexId) { Dimensions = 2, EnsureTightMBRs = false, TreeVariant = RTreeVariant.RStar, FillFactor = 0.9, IndexCapacity = 10000, SplitDistributionFactor = 0.5, NearMinimumOverlapFactor = 2 }; var rand = new Random(); using (var rtree = new RTree <byte[]>(options, storageManager)) { Assert.Equal(10000, rtree.Count); stopWatch.Start(); long totalMatch = 0; for (int i = 0; i < 10000; ++i) { var count = CountAnIntersection(rtree, rand); Assert.True(count < 10000); totalMatch += count; } stopWatch.Stop(); PrintPerformanceReport(stopWatch.ElapsedMilliseconds, 500, totalMatch); } } }
public void RTreeCanBeRecoveredFromDisk() { var filename = Path.GetTempFileName(); long indexId = 0; // create the new storage manager using (var storageManager = new DiskStorageManager(filename)) { var options = new RTreeOptions() { Dimensions = 2, EnsureTightMBRs = true, TreeVariant = RTreeVariant.RStar, FillFactor = 0.9 }; storageManager.DatafileSuffix = "data"; storageManager.IndexfileSuffix = "index"; storageManager.Overwrite = true; storageManager.PageSize = 1024; using (var rtree = new RTree <byte[]>(options, storageManager)) { rtree.Add(new Circle(new Point(-8, 2), 4), DataHelpers.GenerateSomeBytes(0x123021)); rtree.Add(new Circle(new Point(0, 2), 4), DataHelpers.GenerateSomeBytes(0x723321)); rtree.Add(new Circle(new Point(8, 2), 4), DataHelpers.GenerateSomeBytes(0x325721)); rtree.Add(new Circle(new Point(-4, -4), 0), DataHelpers.GenerateSomeBytes(0x452910)); rtree.Add(new Circle(new Point(4, -4), 0), DataHelpers.GenerateSomeBytes(0x7290900)); // sanity check Assert.Equal(5, rtree.Count()); indexId = rtree.Options.IndexIdentifier; } } // recycle the storage manager using (var storageManager = new DiskStorageManager(filename)) { storageManager.DatafileSuffix = "data"; storageManager.IndexfileSuffix = "index"; storageManager.Overwrite = false; storageManager.PageSize = 1024; var options = new RTreeOptions(indexId) { Dimensions = 2, EnsureTightMBRs = true, TreeVariant = RTreeVariant.RStar, FillFactor = 0.9 }; using (var rtree = new RTree <byte[]>(options, storageManager)) { // make sure my objects are still there Assert.Equal(5, rtree.Count()); // make sure they are still correct var intersection = rtree.IntersectsWith(new Circle(new Point(4, -4), 4)); Assert.Equal(3, intersection.Count()); } } }