public void AddSegments([NotNull] ZRangeErrorSegments errorSegments)
        {
            _segments.AddRange(errorSegments.Segments);

            MinZ = Math.Min(MinZ, errorSegments.MinZ);
            MaxZ = Math.Max(MaxZ, errorSegments.MaxZ);
        }
Exemple #2
0
        private static IGeometry GetErrorGeometry(
            [NotNull] ZRangeErrorSegments errorSegments)
        {
            IPolyline polyline = errorSegments.CreatePolyline();

            GeometryUtils.SimplifyNetworkGeometry(polyline);

            return(polyline.IsEmpty
                                       ? (IGeometry)errorSegments.CreateStartPoint()
                                       : polyline);
        }
Exemple #3
0
        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));
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
            }
        }
Exemple #6
0
        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();
            }
        }
Exemple #7
0
        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);
            }
        }