Пример #1
0
        public void CanGetCrossingGapsCombined()
        {
            const double maxArea = 200;

            Box allBox = GeomUtils.CreateBox(0, 0, 100, 100);

            var knownGaps = new KnownGaps(maxArea, _tolerance, allBox);

            var gapPolygons =
                new[]
            {
                CreatePoly(-5, 10, 5, 20),                         // < limit, cross L t11 (no gap)
                CreatePoly(10, 10, 15, 20),                        // < limit, inside t11 (gap)
                CreatePoly(10, 10, 51, 20),                        // > limit, cross t11 and t12, <limit in t12
                CreatePoly(49, 40, 51, 41),                        // < limit, cross t11 and t12 (gap)
                CreatePoly(50, 49, 51, 51),                        // < limit, cross t12 and t22 (gap)
                CreatePoly(10, 49, 11, 51),                        // < limit, cross t11 and t21 (gap)
                CreatePoly(80, 80, 110, 110),                      // > limit, exceed allbox (no gap)
                CreatePoly(99, 99, 101, 101)                       // < limit, exceed allbox (no gap)
            };

            IList <IPolygon> gaps11 = GetGaps(knownGaps, _tile11, gapPolygons);
            IList <IPolygon> gaps12 = GetGaps(knownGaps, _tile12, gapPolygons);
            IList <IPolygon> gaps21 = GetGaps(knownGaps, _tile21, gapPolygons);
            IList <IPolygon> gaps22 = GetGaps(knownGaps, _tile22, gapPolygons);

            LogGaps(gaps11, gaps12, gaps21, gaps22);
            Assert.AreEqual(1, gaps11.Count);
            Assert.AreEqual(1, gaps12.Count);
            Assert.AreEqual(1, gaps21.Count);
            Assert.AreEqual(1, gaps22.Count);
        }
Пример #2
0
        public void CanGetCrossingGaps()
        {
            const double maxArea = 1000;             // larger than all polygons

            Box allBox = GeomUtils.CreateBox(0, 0, 100, 100);

            var knownGaps = new KnownGaps(maxArea, _tolerance, allBox);

            // 4 polygons 20x20, each one centered on the LL corner of a tile
            var gapPolygons = new[]
            {
                CreatePoly(-10, -10, 10, 10),
                CreatePoly(40, -10, 60, 10),
                CreatePoly(-10, 40, 10, 60),
                CreatePoly(40, 40, 60, 60)
            };

            IList <IPolygon> gaps11 = GetGaps(knownGaps, _tile11, gapPolygons);
            IList <IPolygon> gaps12 = GetGaps(knownGaps, _tile12, gapPolygons);
            IList <IPolygon> gaps21 = GetGaps(knownGaps, _tile21, gapPolygons);
            IList <IPolygon> gaps22 = GetGaps(knownGaps, _tile22, gapPolygons);

            LogGaps(gaps11, gaps12, gaps21, gaps22);
            Assert.AreEqual(0, gaps11.Count);
            Assert.AreEqual(0, gaps12.Count);
            Assert.AreEqual(0, gaps21.Count);
            Assert.AreEqual(1, gaps22.Count);
        }
Пример #3
0
        private IList <IPolygon> GetGaps(
            [NotNull] KnownGaps knownGaps,
            [NotNull] IEnvelope tileEnvelope,
            params IPolygon[] gaps)
        {
            IEnvelope clipEnvelope = GetClipEnvelope(tileEnvelope, knownGaps.Tolerance);

            var clippedGaps = new List <IPolygon>();

            foreach (IPolygon polygon in gaps)
            {
                IPolygon clippedPolygon = GeometryUtils.GetClippedPolygon(polygon, clipEnvelope);

                if (!clippedPolygon.IsEmpty)
                {
                    clippedGaps.Add(GeometryFactory.Clone(clippedPolygon));
                }
            }

            return(new List <IPolygon>(
                       knownGaps.GetCompletedGaps(clippedGaps, clipEnvelope, tileEnvelope)));
        }
Пример #4
0
        public void CanIgnoreLargeCrossingGap3()
        {
            const double maxArea = 100;

            Box allBox = GeomUtils.CreateBox(0, 0, 100, 100);

            var knownGaps = new KnownGaps(maxArea, _tolerance, allBox);

            // t22 intersection is larger than limit, t12 is smaller than limit
            var gapPolygons = new[] { CreatePoly(60, 49, 70, 90) };

            IList <IPolygon> gaps11 = GetGaps(knownGaps, _tile11, gapPolygons);
            IList <IPolygon> gaps12 = GetGaps(knownGaps, _tile12, gapPolygons);
            IList <IPolygon> gaps21 = GetGaps(knownGaps, _tile21, gapPolygons);
            IList <IPolygon> gaps22 = GetGaps(knownGaps, _tile22, gapPolygons);

            LogGaps(gaps11, gaps12, gaps21, gaps22);
            Assert.AreEqual(0, gaps11.Count);
            Assert.AreEqual(0, gaps12.Count);
            Assert.AreEqual(0, gaps21.Count);
            Assert.AreEqual(0, gaps22.Count);
        }
Пример #5
0
        public void CanIgnoreLargeCrossingGap1()
        {
            const double maxArea = 100;

            Box allBox = GeomUtils.CreateBox(0, 0, 100, 100);

            var knownGaps = new KnownGaps(maxArea, _tolerance, allBox);

            // tile intersections are all smaller than limit, but the entire gap is larger
            var gapPolygons = new[] { CreatePoly(45, 45, 55, 55.1) };

            IList <IPolygon> gaps11 = GetGaps(knownGaps, _tile11, gapPolygons);
            IList <IPolygon> gaps12 = GetGaps(knownGaps, _tile12, gapPolygons);
            IList <IPolygon> gaps21 = GetGaps(knownGaps, _tile21, gapPolygons);
            IList <IPolygon> gaps22 = GetGaps(knownGaps, _tile22, gapPolygons);

            LogGaps(gaps11, gaps12, gaps21, gaps22);
            Assert.AreEqual(0, gaps11.Count);
            Assert.AreEqual(0, gaps12.Count);
            Assert.AreEqual(0, gaps21.Count);
            Assert.AreEqual(0, gaps22.Count);
        }
Пример #6
0
        public void CanGetSmallGapTouchingTileBoundary()
        {
            const double maxArea = 200;

            Box allBox = GeomUtils.CreateBox(0, 0, 100, 100);

            var knownGaps = new KnownGaps(maxArea, _tolerance, allBox);

            // < limit, in UR corner of t11
            var gapPolygons = new[] { CreatePoly(49, 49, 50, 50) };

            IList <IPolygon> gaps11 = GetGaps(knownGaps, _tile11, gapPolygons);
            IList <IPolygon> gaps12 = GetGaps(knownGaps, _tile12, gapPolygons);
            IList <IPolygon> gaps21 = GetGaps(knownGaps, _tile21, gapPolygons);
            IList <IPolygon> gaps22 = GetGaps(knownGaps, _tile22, gapPolygons);

            LogGaps(gaps11, gaps12, gaps21, gaps22);
            Assert.AreEqual(0, gaps11.Count);
            Assert.AreEqual(0, gaps12.Count);
            Assert.AreEqual(0, gaps21.Count);
            Assert.AreEqual(1, gaps22.Count);             // reported in last tile
        }
Пример #7
0
        public void CanGetSmallCrossingGapAtTileBoundary2()
        {
            const double maxArea = 200;

            Box allBox = GeomUtils.CreateBox(0, 0, 100, 100);

            var knownGaps = new KnownGaps(maxArea, _tolerance, allBox);

            // < limit, xmin at left boundary of t12
            var gapPolygons = new[] { CreatePoly(50, 10, 51, 11) };

            IList <IPolygon> gaps11 = GetGaps(knownGaps, _tile11, gapPolygons);
            IList <IPolygon> gaps12 = GetGaps(knownGaps, _tile12, gapPolygons);
            IList <IPolygon> gaps21 = GetGaps(knownGaps, _tile21, gapPolygons);
            IList <IPolygon> gaps22 = GetGaps(knownGaps, _tile22, gapPolygons);

            LogGaps(gaps11, gaps12, gaps21, gaps22);
            Assert.AreEqual(0, gaps11.Count);
            Assert.AreEqual(1, gaps12.Count);
            Assert.AreEqual(0, gaps21.Count);
            Assert.AreEqual(0, gaps22.Count);
        }