private static IGeometry GetIntersectionGeometry([NotNull] IGeometry shape1,
                                                             [NotNull] IGeometry shape2)
            {
                IGeometry result = null;

                foreach (IGeometry intersection in
                         IntersectionUtils.GetAllIntersections(shape1, shape2))
                {
                    if (result == null || result.Dimension < intersection.Dimension)
                    {
                        if (result != null)
                        {
                            Marshal.ReleaseComObject(result);
                        }

                        result = intersection;
                    }
                    else
                    {
                        Marshal.ReleaseComObject(intersection);
                    }
                }

                return(Assert.NotNull(result));
            }
Пример #2
0
        public static int ReportIntersections(
            [NotNull] IRow row1, int tableIndex1,
            [NotNull] IRow row2, int tableIndex2,
            [NotNull] IErrorReporting errorReporting,
            [CanBeNull] IssueCode issueCode,
            [CanBeNull] IValidRelationConstraint validRelationConstraint,
            bool reportIndividualParts,
            [CanBeNull] GeometryConstraint validIntersectionGeometryConstraint = null,
            GeometryComponent geomComponent1 = GeometryComponent.EntireGeometry,
            GeometryComponent geomComponent2 = GeometryComponent.EntireGeometry)
        {
            Assert.ArgumentNotNull(row1, nameof(row1));
            Assert.ArgumentNotNull(row2, nameof(row2));
            Assert.ArgumentNotNull(errorReporting, nameof(errorReporting));

            if (row1 == row2)
            {
                return(_noError);
            }

            string errorDescription;

            if (HasFulfilledConstraint(row1, tableIndex1,
                                       row2, tableIndex2,
                                       validRelationConstraint, "Features intersect",
                                       out errorDescription))
            {
                return(_noError);
            }

            IGeometry shape1 = ((IFeature)row1).Shape;
            IGeometry shape2 = ((IFeature)row2).Shape;

            var g1 = GeometryComponentUtils.GetGeometryComponent(shape1, geomComponent1);
            var g2 = GeometryComponentUtils.GetGeometryComponent(shape2, geomComponent2);

            var errorCount = 0;

            if (g1 != null && g2 != null)
            {
                foreach (IGeometry errorGeometry in
                         IntersectionUtils.GetAllIntersections(g1, g2))
                {
                    if (validIntersectionGeometryConstraint == null ||
                        !validIntersectionGeometryConstraint.IsFulfilled(errorGeometry))
                    {
                        errorCount += errorReporting.Report(errorDescription,
                                                            errorGeometry,
                                                            issueCode, reportIndividualParts,
                                                            row1, row2);
                    }
                }
            }

            return(errorCount);
        }
Пример #3
0
 private static IEnumerable <IGeometry> GetRelevantIntersections(
     [NotNull] IGeometry g1,
     [NotNull] IGeometry g2,
     Dimension maximumDimension)
 {
     foreach (IGeometry geometry in IntersectionUtils.GetAllIntersections(g1, g2))
     {
         if (HasEqualOrLowerDimension(geometry, maximumDimension))
         {
             Simplify(geometry);
             yield return(geometry);
         }
         else
         {
             Marshal.ReleaseComObject(geometry);
         }
     }
 }