public void CanGetChangedVerticesNoChanges()
        {
            const int fewPointsPerPart = 400;
            const int holes            = 3;

            IPolygon poly1a = GeometryUtilsTest.CreatePunchedSquarePolygon("1a",
                                                                           fewPointsPerPart,
                                                                           holes, 1);
            IPolygon poly1b = GeometryUtilsTest.CreatePunchedSquarePolygon("1b",
                                                                           fewPointsPerPart,
                                                                           holes, -1);

            var vertexComparer = new GeometryComparison(poly1a, poly1b, 0.001, 0.01);

            const bool symmetric = true;
            //bool reportDuplicateVertices = false;
            IList <WKSPointZ> changes =
                vertexComparer.GetDifferentVertices(symmetric, false);

            Assert.AreEqual(0, changes.Count);

            //bool reportDuplicateVertices = true;
            changes = vertexComparer.GetDifferentVertices(symmetric, true);

            int ringCount = ((IGeometryCollection)poly1a).GeometryCount +
                            ((IGeometryCollection)poly1b).GeometryCount;

            Assert.AreEqual(ringCount, changes.Count);

            Assert.True(vertexComparer.HaveSameVertices());
            Assert.False(vertexComparer.HaveSameVertices(false));
        }
        public void CanGetChangedVerticesInLargeGeometry()
        {
            const int manyPointsPerPart = 123456;
            const int holes             = 3;

            IPolygon poly2a = GeometryUtilsTest.CreatePunchedSquarePolygon("2a",
                                                                           manyPointsPerPart,
                                                                           holes, 1);
            IPolygon poly2b = GeometryUtilsTest.CreatePunchedSquarePolygon("2b",
                                                                           manyPointsPerPart,
                                                                           holes, -1);

            var watch = new Stopwatch();

            watch.Start();

            var vertexComparer = new GeometryComparison(poly2a, poly2b, 0.001, 0.01);

            const bool symmetric = true;
            //bool reportDuplicateVertices = false;
            IList <WKSPointZ> changes =
                vertexComparer.GetDifferentVertices(symmetric, false);

            watch.Stop();

            Assert.AreEqual(0, changes.Count);
            Assert.Less(watch.ElapsedMilliseconds, 1000.0);
            Console.WriteLine(@"Calculate changed vertices (no changes) in {0} ms",
                              watch.ElapsedMilliseconds);

            Assert.True(vertexComparer.HaveSameVertices());
            Assert.False(vertexComparer.HaveSameVertices(false));
        }
        public void CanGetTwoDuplicateMultipointPointsInSequence()
        {
            const double xyTolerance = 0.1;
            const double zTolerance  = 0.1;

            // the second duplicate is NOT the last one in the sorted coordinate list...
            IMultipoint original = GeometryFactory.CreateMultipoint(
                GeometryFactory.CreatePoint(100, 1000, 5000),                 // duplicate 1
                GeometryFactory.CreatePoint(100, 1000, 5000),                 // duplicate 1
                GeometryFactory.CreatePoint(150, 1000, 5000),                 // duplicate 2
                GeometryFactory.CreatePoint(150, 1000, 5000),                 // duplicate 2
                GeometryFactory.CreatePoint(200, 1000, 5000),
                GeometryFactory.CreatePoint(100, 2000, 5000),
                GeometryFactory.CreatePoint(100, 3000, 5000)
                );

            original.SpatialReference = CreateSpatialReference(xyTolerance, zTolerance);

            IMultipoint clone = GeometryFactory.Clone(original);

            GeometryUtils.Simplify(clone);

            var vertexComparer = new GeometryComparison(original, clone,
                                                        xyTolerance, zTolerance);

            IList <WKSPointZ> result = vertexComparer.GetDifferentVertices(true);

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(100, result[0].X);
            Assert.AreEqual(1000, result[0].Y);
            Assert.AreEqual(5000, result[0].Z);
            Assert.AreEqual(150, result[1].X);
            Assert.AreEqual(1000, result[1].Y);
            Assert.AreEqual(5000, result[1].Z);

            // Flip geometries:
            vertexComparer = new GeometryComparison(clone, original,
                                                    xyTolerance, zTolerance);

            result = vertexComparer.GetDifferentVertices(true);

            Assert.AreEqual(2, result.Count);
            Assert.AreEqual(100, result[0].X);
            Assert.AreEqual(1000, result[0].Y);
            Assert.AreEqual(5000, result[0].Z);
            Assert.AreEqual(150, result[1].X);
            Assert.AreEqual(1000, result[1].Y);
            Assert.AreEqual(5000, result[1].Z);

            Assert.True(vertexComparer.HaveSameVertices());
            Assert.False(vertexComparer.HaveSameVertices(false));
        }
        public void CanGetDuplicatedMultipointPoint()
        {
            const double xyTolerance = 0.1;
            const double zTolerance  = 0.1;

            IMultipoint original = GeometryFactory.CreateMultipoint(
                GeometryFactory.CreatePoint(100, 1000, 5000),                // duplicate
                GeometryFactory.CreatePoint(100, 1000, 5000)                 // duplicate
                );

            original.SpatialReference = CreateSpatialReference(xyTolerance, zTolerance);

            IMultipoint clone = GeometryFactory.Clone(original);

            GeometryUtils.Simplify(clone);

            var vertexComparer = new GeometryComparison(original, clone,
                                                        xyTolerance, zTolerance);

            IList <WKSPointZ> result = vertexComparer.GetDifferentVertices(true);

            Assert.AreEqual(1, result.Count);
            Assert.AreEqual(100, result[0].X);
            Assert.AreEqual(1000, result[0].Y);
            Assert.AreEqual(5000, result[0].Z);

            // Flip geometries:
            vertexComparer = new GeometryComparison(clone, original,
                                                    xyTolerance, zTolerance);

            result = vertexComparer.GetDifferentVertices(true);

            Assert.AreEqual(1, result.Count);
            Assert.AreEqual(100, result[0].X);
            Assert.AreEqual(1000, result[0].Y);
            Assert.AreEqual(5000, result[0].Z);

            Assert.True(vertexComparer.HaveSameVertices());
            Assert.False(vertexComparer.HaveSameVertices(false));
        }
        public void CanGetChangedVerticesSingleSegmentLine()
        {
            IPolyline sourcePolyline =
                GeometryFactory.CreatePolyline(450, 10, 50, 100, 80, 50);
            IPolyline targetPolyline =
                GeometryFactory.CreatePolyline(0, 0, 20, 100, 0, 20);

            ISpatialReference lv95 = CreateSpatialReference(0.0125, 0.0125);

            sourcePolyline.SpatialReference = lv95;
            targetPolyline.SpatialReference = lv95;

            var vertexComparer = new GeometryComparison(
                sourcePolyline, targetPolyline, 0.001,
                0.01);
            IList <WKSPointZ> result = vertexComparer.GetDifferentVertices(true);

            Assert.AreEqual(4, result.Count);

            Assert.False(vertexComparer.HaveSameVertices());
            Assert.False(vertexComparer.HaveSameVertices(false));
        }
        public void CanGetChangedVerticesNonZaware()
        {
            string path = TestData.GetIntersectingLineNonZawarePath();

            IGeometry baseGeometry   = GeometryUtils.FromXmlFile(path);
            IGeometry simpleGeometry = GeometryFactory.Clone(baseGeometry);

            GeometryUtils.Simplify(simpleGeometry, true, true);

            double       xyTolerance = GeometryUtils.GetXyResolution(baseGeometry);
            const double zTolerance  = double.NaN;

            var vertexComparer = new GeometryComparison(baseGeometry, simpleGeometry,
                                                        xyTolerance, zTolerance);

            IList <WKSPointZ> changes = vertexComparer.GetDifferentVertices(true, false);

            // NOTE: the feature gets split into 2 parts which is, however not detected
            //		 due to the duplicate vertices being ignored.
            Assert.AreEqual(0, changes.Count);

            var basePoints = (IPointCollection)baseGeometry;

            // simulate the following behavior: when a FGDB-Feature is fiddled around with
            // it is returned with Z=0 (probably because it got the map's spatial ref)
            for (int i = 0; i < basePoints.PointCount; i++)
            {
                IPoint point = basePoints.get_Point(i);
                point.Z = 0;
                basePoints.UpdatePoint(i, point);
            }

            changes = vertexComparer.GetDifferentVertices(true, false);

            Assert.AreEqual(0, changes.Count);

            Assert.True(vertexComparer.HaveSameVertices());
            Assert.False(vertexComparer.HaveSameVertices(false));
        }
        public void CanGetChangedVerticesPolylineWithDuplicateDifferencesAtLastCoord()
        {
            ISpatialReference lv95 =
                SpatialReferenceUtils.CreateSpatialReference(WellKnownHorizontalCS.LV95);

            IPolyline referencePolyline = GeometryFactory.CreatePolyline(
                lv95,
                GeometryFactory.CreatePoint(0, 0),
                GeometryFactory.CreatePoint(10, 0),
                GeometryFactory.CreatePoint(20, 0),
                GeometryFactory.CreatePoint(10, 0),
                GeometryFactory.CreatePoint(20, 0),
                GeometryFactory.CreatePoint(30, 10));

            IPolyline comparePolyline = GeometryFactory.Clone(referencePolyline);

            var geometryComparison = new GeometryComparison(
                referencePolyline, comparePolyline, 0.0125, 0.0125);

            // now make the difference really big
            IPoint point = ((IPointCollection)referencePolyline).get_Point(2);

            point.X = 50.0;
            ((IPointCollection)referencePolyline).UpdatePoint(2, point);

            // And an additional point with a duplicate coordinate:
            ((IPointCollection)referencePolyline).AddPoint(point);

            const bool reportDuplicateVertices = true;
            const bool ignoreDuplicateVertices = false;

            const bool symmetric    = true;
            const bool nonSymmetric = false;

            IList <WKSPointZ> changes = geometryComparison.GetDifferentVertices(symmetric,
                                                                                reportDuplicateVertices);

            Assert.AreEqual(3, changes.Count);

            Assert.False(geometryComparison.HaveSameVertices());
            Assert.False(geometryComparison.HaveSameVertices(false));

            changes = geometryComparison.GetDifferentVertices(symmetric,
                                                              ignoreDuplicateVertices);
            Assert.AreEqual(1, changes.Count);

            changes = geometryComparison.GetDifferentVertices(nonSymmetric,
                                                              reportDuplicateVertices);
            Assert.AreEqual(2, changes.Count);

            changes = geometryComparison.GetDifferentVertices(nonSymmetric,
                                                              ignoreDuplicateVertices);
            Assert.AreEqual(1, changes.Count);

            // Now swap the geometries
            geometryComparison = new GeometryComparison(
                comparePolyline, referencePolyline, 0.0125, 0.0125);

            changes = geometryComparison.GetDifferentVertices(symmetric,
                                                              reportDuplicateVertices);
            Assert.AreEqual(3, changes.Count);
            Assert.False(geometryComparison.HaveSameVertices());
            Assert.False(geometryComparison.HaveSameVertices(false));

            changes = geometryComparison.GetDifferentVertices(symmetric,
                                                              ignoreDuplicateVertices);
            Assert.AreEqual(1, changes.Count);

            changes = geometryComparison.GetDifferentVertices(nonSymmetric,
                                                              reportDuplicateVertices);
            Assert.AreEqual(1, changes.Count);

            changes = geometryComparison.GetDifferentVertices(nonSymmetric,
                                                              ignoreDuplicateVertices);
            Assert.AreEqual(0, changes.Count);
        }
        public void CanGetChangedDuplicateVerticesPolygonWithSameStartPoint()
        {
            ISpatialReference lv95 =
                SpatialReferenceUtils.CreateSpatialReference(WellKnownHorizontalCS.LV95);

            IPolyline polyline = GeometryFactory.CreatePolyline(
                lv95,
                GeometryFactory.CreatePoint(0, 0),
                GeometryFactory.CreatePoint(10, 0),
                GeometryFactory.CreatePoint(20, 0),
                GeometryFactory.CreatePoint(10, 0),
                GeometryFactory.CreatePoint(20, 0),
                GeometryFactory.CreatePoint(30, 10));

            IPolygon sourcePolygon     = GeometryFactory.CreatePolygon(polyline);
            IPolygon simplifiedPolygon = GeometryFactory.Clone(sourcePolygon);

            const bool allowNonPlanarLines = false;
            string     nonSimpleReasonDescription;
            GeometryNonSimpleReason?nonSimpleReason;
            bool isSimple = GeometryUtils.IsGeometrySimple(sourcePolygon,
                                                           lv95,
                                                           allowNonPlanarLines,
                                                           out nonSimpleReasonDescription,
                                                           out nonSimpleReason);

            Assert.IsFalse(isSimple);

            // do not allow reorder so we can check that parallel duplicates are not
            GeometryUtils.Simplify(simplifiedPolygon, false, !allowNonPlanarLines);

            var geometryComparison = new GeometryComparison(
                sourcePolygon, simplifiedPolygon, 0.00125, 0.0125);

            const bool        reportDuplicateVertices = true;
            IList <WKSPointZ> changes = geometryComparison.GetDifferentVertices(false,
                                                                                reportDuplicateVertices);

            Assert.AreEqual(2, changes.Count);
            Assert.True(geometryComparison.HaveSameVertices());
            Assert.False(geometryComparison.HaveSameVertices(false));

            changes =
                geometryComparison.GetDifferentVertices(true, reportDuplicateVertices);
            Assert.AreEqual(2, changes.Count);

            changes = geometryComparison.GetDifferentVertices(true, false);
            Assert.AreEqual(0, changes.Count);

            geometryComparison = new GeometryComparison(
                simplifiedPolygon, sourcePolygon, 0.00125, 0.0125);

            changes =
                geometryComparison.GetDifferentVertices(false, reportDuplicateVertices);
            Assert.AreEqual(0, changes.Count);

            changes =
                geometryComparison.GetDifferentVertices(true, reportDuplicateVertices);
            Assert.AreEqual(2, changes.Count);

            changes = geometryComparison.GetDifferentVertices(true, false);
            Assert.AreEqual(0, changes.Count);
        }