示例#1
0
        public void CanExecuteContainerLineNearTileBoundary()
        {
            IFeatureClass featureClass =
                CreatePolylineFeatureClass("CanExecuteContainerLineNearTileBoundary", 0.01);

            // Create error Feature
            const double x    = 2600000;
            const double y    = 1200000;
            IFeature     row1 = featureClass.CreateFeature();

            row1.Shape = GeometryFactory.CreateLine(
                GeometryFactory.CreatePoint(x, y),
                GeometryFactory.CreatePoint(x, y + 800));
            row1.Store();

            IFeature row2 = featureClass.CreateFeature();

            row2.Shape = GeometryFactory.CreateLine(
                GeometryFactory.CreatePoint(x + 1000, y),
                GeometryFactory.CreatePoint(x + 1000, y + 800));
            row2.Store();

            // row3 is within tile[0,0], but within the search tolerance from tile[0,1]
            IFeature row3 = featureClass.CreateFeature();

            row3.Shape = GeometryFactory.CreateLine(
                GeometryFactory.CreatePoint(x + 300, y),
                GeometryFactory.CreatePoint(x + 300, y + 599.000));
            row3.Store();

            var helper = new CanExecuteContainerHelper();

            helper.ExpectedMaximumRowCountPerTile = 2;

            var test = new VerifyingContainerTest((ITable)featureClass)
            {
                OnExecuteCore  = helper.ExecuteRow,
                OnCompleteTile = helper.CompleteTile,
                OnCachedRow    = helper.CachedRow
            };

            test.SetSearchDistance(2);

            var container = new TestContainer.TestContainer {
                TileSize = 600
            };

            container.AddTest(test);
            container.MaxCachedPointCount = 1;             // disable caching
            container.Execute();

            Assert.AreEqual(4 + 1, helper.CompleteTileCount); // + 1 : wegen initialem Tile
            Assert.AreEqual(
                5, helper.ExecuteRowCount);                   // row1,row in 2 Tiles, row3 only executed in first Tile
            Assert.AreEqual(6, helper.CachedRowCount);        // 3 features x 2 intersected tiles
        }
示例#2
0
        public void CanExecuteContainerTwoVerticalLines()
        {
            IFeatureClass featureClass =
                CreatePolylineFeatureClass("CanExecuteContainerTwoVerticalLines", 0.01);

            // Create error Feature
            const double x    = 2600000;
            const double y    = 1200000;
            IFeature     row1 = featureClass.CreateFeature();

            row1.Shape = GeometryFactory.CreateLine(
                GeometryFactory.CreatePoint(x, y),
                GeometryFactory.CreatePoint(x, y + 800));
            row1.Store();

            IFeature row2 = featureClass.CreateFeature();

            row2.Shape = GeometryFactory.CreateLine(
                GeometryFactory.CreatePoint(x + 1000, y),
                GeometryFactory.CreatePoint(x + 1000, y + 800));
            row2.Store();

            var helper = new CanExecuteContainerHelper();

            helper.ExpectedMaximumRowCountPerTile = 1;

            var test = new VerifyingContainerTest((ITable)featureClass)
            {
                OnExecuteCore  = helper.ExecuteRow,
                OnCompleteTile = helper.CompleteTile
            };

            test.SetSearchDistance(10);

            var container = new TestContainer.TestContainer {
                TileSize = 600
            };

            container.AddTest(test);

            container.Execute();

            Assert.AreEqual(4 + 1, helper.CompleteTileCount);       // + 1 : wegen initialem Tile
            Assert.AreEqual(4, helper.ExecuteRowCount);             // 2 features x 2 intersected tiles
        }
示例#3
0
        public void CanExecuteContainePointFeatures()
        {
            IFeatureClass featureClass =
                CreatePointFeatureClass("CanExecuteContainePointFeatures", 0.01);

            // Create error Feature
            const double x = 2600000;
            const double y = 1200000;

            AddPointFeature(featureClass, x, y);
            AddPointFeature(featureClass, x + 1000, y + 1000);

            // create a point 1m south of the upper tile boundary, in the second tile of the first row
            AddPointFeature(featureClass, x + 599, y + 900);

            var helper = new CanExecuteContainerHelper();

            helper.ExpectedMaximumRowCountPerTile = 1;

            var test = new VerifyingContainerTest((ITable)featureClass)
            {
                OnExecuteCore  = helper.ExecuteRow,
                OnCompleteTile = helper.CompleteTile
            };

            test.SetSearchDistance(0.5);

            var container = new TestContainer.TestContainer {
                TileSize = 600
            };

            container.AddTest(test);
            container.Execute();

            Assert.AreEqual(4 + 1, helper.CompleteTileCount);             // + 1 : wegen initialem Tile
            Assert.AreEqual(3, helper.ExecuteRowCount);
        }
        public void CheckWasAlreadyTested()
        {
            var overlaps = new OverlappingFeatures();

            var      fc = new FeatureClassMock(1, "", esriGeometryType.esriGeometryPolyline);
            IFeature f1 = fc.CreateFeature(new Pt(100, 0), new Pt(109.95, 9.95));
            IFeature f2 = fc.CreateFeature(new Pt(100, 0), new Pt(109.8, 9.8));
            IFeature fx = fc.CreateFeature(new Pt(100, 0), new Pt(109.95, 9.8));
            IFeature fy = fc.CreateFeature(new Pt(100, 0), new Pt(109.8, 9.95));
            var      c1 = new CachedRow(f1);

            var test = new VerifyingContainerTest(fc);
            var t2   = new VerifyingContainerTest(fc);
            var t3   = new VerifyingContainerTest(fc);

            overlaps.RegisterTestedFeature(c1, new ContainerTest[] { test });

            Assert.IsTrue(overlaps.WasAlreadyTested(f1, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(f2, test));

            overlaps.RegisterTestedFeature(new CachedRow(f2), new ContainerTest[] { test });
            Assert.IsTrue(overlaps.WasAlreadyTested(f2, test));
            overlaps.RegisterTestedFeature(new CachedRow(f2),
                                           new ContainerTest[] { test, t2 });
            Assert.IsTrue(overlaps.WasAlreadyTested(f2, test));
            Assert.IsTrue(overlaps.WasAlreadyTested(f2, t2));
            Assert.IsFalse(overlaps.WasAlreadyTested(f2, t3));

            overlaps.RegisterTestedFeature(new CachedRow(fx), new ContainerTest[] { test });
            overlaps.RegisterTestedFeature(new CachedRow(fy), new ContainerTest[] { test });

            overlaps.SetCurrentTile(CreateBox(100, 0, 105, 5));

            Assert.IsTrue(overlaps.WasAlreadyTested(f1, test));
            Assert.IsTrue(overlaps.WasAlreadyTested(f2, test));
            Assert.IsTrue(overlaps.WasAlreadyTested(fx, test));
            Assert.IsTrue(overlaps.WasAlreadyTested(fy, test));

            overlaps.AdaptSearchTolerance(fc, 0.1);
            overlaps.SetCurrentTile(CreateBox(110, 0, 120, 10));
            Assert.IsTrue(overlaps.WasAlreadyTested(f1, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(f2, test));
            Assert.IsTrue(overlaps.WasAlreadyTested(fx, test));
            Assert.IsTrue(overlaps.WasAlreadyTested(fy, test));

            overlaps.SetCurrentTile(CreateBox(100, 10, 110, 20));
            Assert.IsTrue(overlaps.WasAlreadyTested(f1, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(f2, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(fx, test));
            Assert.IsTrue(overlaps.WasAlreadyTested(fy, test));

            overlaps.SetCurrentTile(CreateBox(110, 10, 120, 20));
            Assert.IsTrue(overlaps.WasAlreadyTested(f1, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(f2, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(fx, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(fy, test));

            overlaps.SetCurrentTile(CreateBox(110.1, 10, 120, 20));
            Assert.IsFalse(overlaps.WasAlreadyTested(f1, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(f2, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(fx, test));
            Assert.IsFalse(overlaps.WasAlreadyTested(fy, test));
        }
示例#5
0
        public void CanHandleCachedPointCount()
        {
            IFeatureClass featureClass = CreatePolylineFeatureClass(
                "CanHandleCachedPointCount", 0.01);

            const double x = 2600000;
            const double y = 1200000;
            // Create features

            IFeature in4Tiles = featureClass.CreateFeature();

            in4Tiles.Shape =
                GeometryFactory.CreateLine(
                    GeometryFactory.CreatePoint(x, y),
                    GeometryFactory.CreatePoint(x + 1000, y + 800));
            in4Tiles.Store();

            IFeature inTiles_00_01 = featureClass.CreateFeature();

            inTiles_00_01.Shape =
                GeometryFactory.CreateLine(
                    GeometryFactory.CreatePoint(x + 100, y + 100),
                    GeometryFactory.CreatePoint(x + 800, y + 200));
            inTiles_00_01.Store();

            IFeature inTiles_00_10 = featureClass.CreateFeature();

            inTiles_00_10.Shape =
                GeometryFactory.CreateLine(
                    GeometryFactory.CreatePoint(x + 100, y + 100),
                    GeometryFactory.CreatePoint(x + 200, y + 200),
                    GeometryFactory.CreatePoint(x + 200, y + 300),
                    GeometryFactory.CreatePoint(x + 100, y + 400),
                    GeometryFactory.CreatePoint(x + 100, y + 500),
                    GeometryFactory.CreatePoint(x + 200, y + 600),
                    GeometryFactory.CreatePoint(x + 200, y + 700),
                    GeometryFactory.CreatePoint(x + 300, y + 800));
            inTiles_00_10.Store();

            IFeature inTiles_01_11 = featureClass.CreateFeature();

            inTiles_01_11.Shape =
                GeometryFactory.CreateLine(
                    GeometryFactory.CreatePoint(x + 800, y + 100),
                    GeometryFactory.CreatePoint(x + 800, y + 500),
                    GeometryFactory.CreatePoint(x + 900, y + 1400));
            inTiles_01_11.Store();

            var helper = new CanHandleCachedPointCountHelper();
            var test   = new VerifyingContainerTest((ITable)featureClass)
            {
                OnExecuteCore  = helper.HandleRows,
                OnCompleteTile = helper.HandleTiles
            };

            test.SetSearchDistance(10);

            // Unlimited Cache
            var container1 = new TestContainer.TestContainer
            {
                TileSize            = 600,
                MaxCachedPointCount = -1
            };

            // Assert.IsTrue(container1.MaxCachedPointCount < 0);

            helper.Reset();
            helper.Container          = container1;
            helper.ExpectedCacheCount = new[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
            container1.AddTest(test);
            container1.Execute(GeometryFactory.CreateEnvelope(x, y, x + 1500, y + 1500));

            // Very large Cache
            var container2 = new TestContainer.TestContainer
            {
                MaxCachedPointCount = int.MaxValue,
                TileSize            = 600
            };

            helper.Reset();
            helper.Container          = container2;
            helper.ExpectedCacheCount = new[] { 0, 0, 8, 13, 3, 0, 3, 3, 0, 0 };
            container2.AddTest(test);
            container2.Execute(GeometryFactory.CreateEnvelope(x, y, x + 1500, y + 1500));

            // small feature Cache
            var container3 = new TestContainer.TestContainer
            {
                MaxCachedPointCount = 10,
                TileSize            = 600
            };

            helper.Reset();
            helper.Container          = container3;
            helper.ExpectedCacheCount = new[] { 0, 0, 8, 5, 3, 0, 3, 3, 0, 0 };
            // in the 5. tile, feature 'inTiles_01_11' with 3 points is used and hence not part of the cache
            container3.AddTest(test);
            container3.Execute(GeometryFactory.CreateEnvelope(x, y, x + 1500, y + 1500));

            // very small feature Cache
            var container4 = new TestContainer.TestContainer
            {
                MaxCachedPointCount = 4,
                TileSize            = 600
            };

            helper.Reset();
            helper.Container          = container4;
            helper.ExpectedCacheCount = new[] { 0, 0, 0, 2, 0, 0, 3, 3, 0, 0 };
            // in the 3. tile, feature 'inTiles_01_11' with 3 points gets unloaded because of cache limitation
            // in the 5. tile, feature 'inTiles_01_11' gets loaded again, so that in the 6. and 7. tile it is cached
            container4.AddTest(test);
            container4.Execute(GeometryFactory.CreateEnvelope(x, y, x + 1500, y + 1500));
            // no feature Cache
            var container5 = new TestContainer.TestContainer
            {
                MaxCachedPointCount = 0,
                TileSize            = 600
            };

            helper.Reset();
            helper.Container          = container5;
            helper.ExpectedCacheCount = new[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            container5.AddTest(test);
            container5.Execute(GeometryFactory.CreateEnvelope(x, y, x + 1500, y + 1500));
        }