Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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());
                }
            }
        }
Example #4
0
        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);
        }
Example #5
0
        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);
                }
            }
        }
Example #6
0
        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());
                }
            }
        }