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); }
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); }