Пример #1
0
        protected override int CompleteTileCore(TileInfo args)
        {
            var errorCount = 0;

            if (args.State == TileState.Initial)
            {
                return(errorCount);
            }

            errorCount += base.CompleteTileCore(args);
            if (ConnectedLinesList == null)
            {
                return(errorCount);
            }

            errorCount +=
                ConnectedLinesList.Sum(connectedRows => ResolveRows(connectedRows));

            List <LineList <DirectedRow> > outerRingList;
            List <LineList <DirectedRow> > innerRingList;
            List <DirectedRow>             innerLineList;
            IEnvelope outerRingsBox;

            IEnvelope processedEnvelope = args.ProcessedEnvelope ?? args.AllBox;

            Assert.NotNull(processedEnvelope, "processedEnvelope");

            PrepareOuterRings(processedEnvelope, out outerRingList, out outerRingsBox);
            if (outerRingsBox == null)
            {
                return(errorCount);
            }

            PrepareInnerRings(outerRingsBox, out innerRingList, out innerLineList);

            PolygonNet <DirectedRow> polyList =
                PolygonNet <DirectedRow> .Create(outerRingList,
                                                 outerRingsBox,
                                                 innerRingList,
                                                 innerLineList);

            errorCount += AssignCentroids(polyList);
            errorCount += CheckCentroids(polyList);

            if (_constraint != null)
            {
                errorCount += CheckConstraint(polyList);
            }

            Drop(polyList);

            return(errorCount);
        }
Пример #2
0
        private int AssignCentroids(
            [NotNull] PolygonNet <DirectedRow> net)
        {
            var errorCount = 0;

            var unprocessedCentroids = new List <IRow>();

            foreach (IRow pointRow in _centroids)
            {
                int             side;
                TopologicalLine line;
                LineListPolygon poly = net.AssignCentroid(pointRow, out line, out side);

                if (poly != null && poly.IsInnerRing)
                {
                    int last = poly.Centroids.Count - 1;
                    poly.Centroids.RemoveAt(last);
                    poly = null;
                }

                if (line != null && side == 0)
                {
                    Assert.Null(poly, "poly is not null");

                    const string description = "Centroid lies on border";
                    errorCount += ReportError(description, ((IFeature)pointRow).Shape,
                                              Codes[Code.CentroidLiesOnBorder],
                                              TestUtils.GetShapeFieldName(pointRow),
                                              pointRow);
                    continue;
                }

                if (poly == null)
                {
                    unprocessedCentroids.Add(pointRow);
                }
            }

            _centroids = unprocessedCentroids;

            return(errorCount);
        }