/// <summary> /// Checking the difference between the two shapes /// </summary> /// <param name="shp"> /// The first shape /// </param> /// <param name="shp2"> /// The second shape /// </param> /// <param name="theForm"> /// The form /// </param> /// <returns> /// True when different /// </returns> internal static bool AreShapesDifferent(Shape shp, Shape shp2, ICallback theForm) { theForm.Progress(string.Empty, 100, "Checking the difference between the two shapes"); if (!shp.IsValid) { theForm.Error(string.Empty, "The first shape is invalid: " + shp.IsValidReason); return(false); } if (!shp2.IsValid) { theForm.Error(string.Empty, "The second shape is invalid: " + shp2.IsValidReason); return(false); } var wkt = shp.ExportToWKT(); var wkt2 = shp2.ExportToWKT(); if (wkt != wkt2) { theForm.Error(string.Empty, "Export to WKT for new shape is different from original one: \n" + wkt + "\n\n" + wkt2); return(false); } if (shp.ShapeType != shp2.ShapeType) { var msg = string.Format( "The first shape is a {0} and the second shape is a {1}", shp.ShapeType, shp2.ShapeType); theForm.Error(string.Empty, msg); return(false); } if (shp.numPoints != shp2.numPoints) { var msg = string.Format( "The first shape has {0} points and the second shape has {1} points", shp.numPoints, shp2.NumParts); theForm.Error(string.Empty, msg); return(false); } if (shp.NumParts != shp2.NumParts) { var msg = string.Format( "The first shape has {0} points and the second shape has {1} points", shp.NumParts, shp2.NumParts); theForm.Error(string.Empty, msg); return(false); } if (shp.ShapeType == ShpfileType.SHP_POLYGON || shp.ShapeType == ShpfileType.SHP_POLYGONM || shp.ShapeType == ShpfileType.SHP_POLYGONZ) { // Check area: if (Math.Abs(shp.Area - shp2.Area) > 0.001) { var msg = string.Format( "The first shape has an area of {0} and the second shape has an area of {1}", shp.Area, shp2.Area); theForm.Error(string.Empty, msg); return(false); } // Check perimeter: if (Math.Abs(shp.Perimeter - shp2.Perimeter) > 0.001) { var msg = string.Format( "The first shape has a perimeter of {0} and the second shape has a perimeter of {1}", shp.Perimeter, shp2.Perimeter); theForm.Error(string.Empty, msg); return(false); } } if (shp.ShapeType == ShpfileType.SHP_POLYLINE || shp.ShapeType == ShpfileType.SHP_POLYLINEM || shp.ShapeType == ShpfileType.SHP_POLYLINEZ) { // Check length: if (Math.Abs(shp.Length - shp2.Length) > 0.001) { var msg = string.Format( "The first shape has a length of {0} and the second shape has a length of {1}", shp.Length, shp2.Length); theForm.Error(string.Empty, msg); return(false); } } if (shp.SerializeToString() != shp2.SerializeToString()) { theForm.Error(string.Empty, "The SerializeToString methods return different values:"); theForm.Error(string.Empty, shp.SerializeToString()); theForm.Error(string.Empty, shp2.SerializeToString()); return(false); } if (Math.Abs(shp.Extents.xMax - shp2.Extents.xMax) > 0.0001 || Math.Abs(shp.Extents.yMax - shp2.Extents.yMax) > 0.0001 || Math.Abs(shp.Extents.zMax - shp2.Extents.zMax) > 0.0001 || Math.Abs(shp.Extents.mMax - shp2.Extents.mMax) > 0.0001) { theForm.Error(string.Empty, "The max values of X, Y, Z or M return different values"); } for (var i = 0; i < shp.numPoints; i++) { if (Math.Abs(shp.Point[i].M - shp2.Point[i].M) > 0.0001) { theForm.Error(string.Empty, "M values are different"); } } if (Math.Abs(shp.Extents.xMin - shp2.Extents.xMin) > 0.0001 || Math.Abs(shp.Extents.yMin - shp2.Extents.yMin) > 0.0001 || Math.Abs(shp.Extents.zMin - shp2.Extents.zMin) > 0.0001 || Math.Abs(shp.Extents.mMin - shp2.Extents.mMin) > 0.0001) { theForm.Error(string.Empty, "The min values of X, Y, Z or M return different values"); } if (!shp.Equals(shp2)) { theForm.Error(string.Empty, "Equals returns false"); return(false); } return(true); }