public void AddSegments([NotNull] ZRangeErrorSegments errorSegments) { _segments.AddRange(errorSegments.Segments); MinZ = Math.Min(MinZ, errorSegments.MinZ); MaxZ = Math.Max(MaxZ, errorSegments.MaxZ); }
private static IGeometry GetErrorGeometry( [NotNull] ZRangeErrorSegments errorSegments) { IPolyline polyline = errorSegments.CreatePolyline(); GeometryUtils.SimplifyNetworkGeometry(polyline); return(polyline.IsEmpty ? (IGeometry)errorSegments.CreateStartPoint() : polyline); }
private int ReportError([NotNull] IFeature feature, [NotNull] ZRangeErrorSegments errorSegments) { IGeometry errorGeometry = GetErrorGeometry(errorSegments); IssueCode issueCode; string message = GetErrorMessage(errorSegments, out issueCode); return(ReportError(message, errorGeometry, issueCode, _shapeFieldName, feature)); }
private static ZRangeErrorSegments MergeErrorSegments( [NotNull] ZRangeErrorSegments errorSegmentsAtEnd, [NotNull] ZRangeErrorSegments errorSegmentsAtStart) { const bool startsOnFirstSegment = false; var result = new ZRangeErrorSegments(errorSegmentsAtEnd.ZRangeRelation, errorSegmentsAtEnd.SpatialReference, startsOnFirstSegment) { EndsOnLastSegment = false }; result.AddSegments(errorSegmentsAtEnd); result.AddSegments(errorSegmentsAtStart); return(result); }
public static IEnumerable <ZRangeErrorSegments> GetErrorSegments( [NotNull] IRing ring, double minimumZ, double maximumZ, [CanBeNull] Predicate <double> isAllowed = null) { Assert.ArgumentNotNull(ring, nameof(ring)); var segments = (ISegmentCollection)ring; ZRangeErrorSegments errorSegmentsAtStart = null; foreach (ZRangeErrorSegments errorSegments in GetErrorSegments( segments, minimumZ, maximumZ, isAllowed)) { if (errorSegments.StartsOnFirstSegment && !errorSegments.EndsOnLastSegment) { // don't report yet, will be merged with another sequence at end point Assert.Null(errorSegmentsAtStart, "error segments at start point already assigned"); errorSegmentsAtStart = errorSegments; } else { if (errorSegments.EndsOnLastSegment && errorSegmentsAtStart != null && errorSegments.ZRangeRelation == errorSegmentsAtStart.ZRangeRelation) { // merge the error segment sequences yield return(MergeErrorSegments(errorSegments, errorSegmentsAtStart)); errorSegmentsAtStart = null; // merged and reported } else { yield return(errorSegments); } } } if (errorSegmentsAtStart != null) { yield return(errorSegmentsAtStart); } }
private string GetErrorMessage([NotNull] ZRangeErrorSegments errorSegments, [NotNull] out IssueCode issueCode) { string comparison; switch (errorSegments.ZRangeRelation) { case ZRangeRelation.AboveZMax: comparison = FormatComparison(errorSegments.MaxZ, ">", _maximumZValue, "N2"); issueCode = Assert.NotNull(Codes[Code.ZOutsideRange_AboveMaximum]); return(errorSegments.SegmentCount == 1 ? string.Format( "One segment above valid Z range. Highest Z value: {0}", comparison) : string.Format( "{0} segments above valid Z range. Highest Z value: {1}", errorSegments.SegmentCount, comparison)); case ZRangeRelation.BelowZMin: comparison = FormatComparison(errorSegments.MinZ, "<", _minimumZValue, "N2"); issueCode = Assert.NotNull(Codes[Code.ZOutsideRange_BelowMinimum]); return(errorSegments.SegmentCount == 1 ? string.Format( "One segment below valid Z range. Lowest Z value: {0}", comparison) : string.Format( "{0} segments below valid Z range. Lowest Z value: {1}", errorSegments.SegmentCount, comparison)); default: throw new ArgumentOutOfRangeException(); } }
private static IEnumerable <ZRangeErrorSegments> GetErrorSegments( [NotNull] ISegmentCollection segments, double minimumZ, double maximumZ, [CanBeNull] Predicate <double> isAllowed) { Assert.ArgumentNotNull(segments, nameof(segments)); IEnumSegment enumSegments = segments.EnumSegments; bool recycling = enumSegments.IsRecycling; enumSegments.Reset(); var partIndex = 0; var segmentIndex = 0; ISegment segment; enumSegments.Next(out segment, ref partIndex, ref segmentIndex); ISpatialReference spatialReference = ((IGeometry)segments).SpatialReference; // this will be null when no open sequence of error segments exist, // and non-null while such a sequence exists and has not yet been reported ZRangeErrorSegments currentErrorSegments = null; var firstSegment = true; while (segment != null) { double fromZ; double toZ; segment.QueryVertexAttributes(esriGeometryAttributes.esriAttributeZ, out fromZ, out toZ); ISegment fromSegment; ISegment toSegment; double splitPointZ; if (fromZ < minimumZ && !(isAllowed != null && isAllowed(fromZ))) { if (toZ < minimumZ && !(isAllowed != null && isAllowed(toZ))) { // fromZ below, toZ below // add whole segment (below) if (currentErrorSegments == null) { currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.BelowZMin, spatialReference, firstSegment); } currentErrorSegments.AddSegment(recycling ? GeometryFactory.Clone(segment) : segment, fromZ, toZ); } else if (toZ > maximumZ && !(isAllowed != null && isAllowed(toZ))) { // fromZ below, toZ above // interpolate from (below) SplitSegmentAtZValue(segment, fromZ, toZ, minimumZ, isAllowed, out fromSegment, out toSegment, out splitPointZ); if (currentErrorSegments == null) { currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.BelowZMin, spatialReference, firstSegment); } currentErrorSegments.AddSegment(fromSegment, fromZ, splitPointZ); yield return(currentErrorSegments); //interpolate to (above) SplitSegmentAtZValue(segment, fromZ, toZ, maximumZ, isAllowed, out fromSegment, out toSegment, out splitPointZ); currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.AboveZMax, spatialReference); currentErrorSegments.AddSegment(toSegment, splitPointZ, toZ); } else // to z ok { // fromZ below, toZ OK // interpolate from (below) SplitSegmentAtZValue(segment, fromZ, toZ, minimumZ, isAllowed, out fromSegment, out toSegment, out splitPointZ); if (currentErrorSegments == null) { currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.BelowZMin, spatialReference, firstSegment); } currentErrorSegments.AddSegment(fromSegment, fromZ, splitPointZ); yield return(currentErrorSegments); currentErrorSegments = null; } } else if (fromZ > maximumZ && !(isAllowed != null && isAllowed(fromZ))) { if (toZ < minimumZ) { // fromZ above, toZ below // interpolate from (above) SplitSegmentAtZValue(segment, fromZ, toZ, maximumZ, isAllowed, out fromSegment, out toSegment, out splitPointZ); if (currentErrorSegments == null) { currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.AboveZMax, spatialReference, firstSegment); } currentErrorSegments.AddSegment(fromSegment, fromZ, splitPointZ); yield return(currentErrorSegments); // interpolate to (below) SplitSegmentAtZValue(segment, fromZ, toZ, minimumZ, isAllowed, out fromSegment, out toSegment, out splitPointZ); currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.BelowZMin, spatialReference); currentErrorSegments.AddSegment(toSegment, splitPointZ, toZ); } else if (toZ > maximumZ && !(isAllowed != null && isAllowed(toZ))) { // fromZ above, toZ above // add whole segment if (currentErrorSegments == null) { currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.AboveZMax, spatialReference, firstSegment); } currentErrorSegments.AddSegment(segment, fromZ, toZ); } else { // fromZ above, toZ OK // interpolate from (above) SplitSegmentAtZValue(segment, fromZ, toZ, maximumZ, isAllowed, out fromSegment, out toSegment, out splitPointZ); if (currentErrorSegments == null) { currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.AboveZMax, spatialReference, firstSegment); } currentErrorSegments.AddSegment(fromSegment, fromZ, splitPointZ); yield return(currentErrorSegments); currentErrorSegments = null; } } else //from Z ok { if (toZ < minimumZ && !(isAllowed != null && isAllowed(toZ))) { // fromZ OK, toZ below // interpolate to (below) SplitSegmentAtZValue(segment, fromZ, toZ, minimumZ, isAllowed, out fromSegment, out toSegment, out splitPointZ); if (currentErrorSegments == null) { currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.BelowZMin, spatialReference); } currentErrorSegments.AddSegment(toSegment, splitPointZ, toZ); } else if (toZ > maximumZ && !(isAllowed != null && isAllowed(toZ))) { // fromZ OK, toZ above // interpolate to (above) SplitSegmentAtZValue(segment, fromZ, toZ, maximumZ, isAllowed, out fromSegment, out toSegment, out splitPointZ); if (currentErrorSegments == null) { currentErrorSegments = new ZRangeErrorSegments( ZRangeRelation.AboveZMax, spatialReference); } currentErrorSegments.AddSegment(toSegment, splitPointZ, toZ); } } if (recycling) { // release the segment, otherwise "pure virtual function call" occurs // when there are certain circular arcs (IsLine == true ?) Marshal.ReleaseComObject(segment); } enumSegments.Next(out segment, ref partIndex, ref segmentIndex); firstSegment = false; } if (currentErrorSegments != null) { currentErrorSegments.EndsOnLastSegment = true; yield return(currentErrorSegments); } }