We have a rectangular extent that we are trying to buffer as shown in the code below. We have significant percentage of cases where this is failing, throwing an exception in the highlighted line below, where the extent and bufferedExtent objects are ThinkGeo.MapSuite.Core.RectangleShape objects.
RectangleShape extent = _standardLayers.GetBestExtent(MapParameters.View);
if (extent != null)
{
double margin = Math.Round(Math.Max(extent.Height, extent.Width) * MapParameters.MarginPercent / 100.0, 2);
try
{
RectangleShape bufferedExtent = extent.Buffer(margin, GeographyUnit.Meter, DistanceUnit.Meter).GetBoundingBox();
extent = bufferedExtent;
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine("Exception: " + ex.Message);
System.Diagnostics.Trace.WriteLine("Failed Extent as WKT:");
System.Diagnostics.Trace.WriteLine(extent.ToPolygon().GetWellKnownText());
System.Diagnostics.Trace.WriteLine("Margin: " + margin.ToString());
System.Diagnostics.Trace.WriteLine("Stack Trace:");
System.Diagnostics.Trace.WriteLine(ex.StackTrace);
}
}
The exception and stack trace is shown below, along with the WKT for the extent we are trying to buffer.
Exception: IComparer (or the IComparable methods it relies upon) did not return zero when Array.Sort called x. CompareTo(x). x: 'GisSharpBlog.NetTopologySuite.Index.Strtree.ItemBoundable' x's type: 'ItemBoundable' The IComparer: 'GisSharpBlog.NetTopologySuite.Index.Strtree.STRtree+AnonymousYComparerImpl'.
Failed Extent as WKT:
POLYGON((827014.17127848 4430478.43293349,827326.686253674 4430478.43293349,827326.686253674 4430052.53863433,827014.17127848 4430052.53863433,827014.17127848 4430478.43293349))
Margin: 21.29
Stack Trace:
at System.Array.SorterObjectArray.QuickSort(Int32 left, Int32 right)
at System.Array.Sort(Array keys, Array items, Int32 index, Int32 length, IComparer comparer)
at System.Collections.ArrayList.Sort(Int32 index, Int32 count, IComparer comparer)
at System.Collections.ArrayList.Sort(IComparer comparer)
at GisSharpBlog.NetTopologySuite.Index.Strtree.AbstractSTRtree.CreateParentBoundables(IList childBoundables, Int32 newLevel)
at GisSharpBlog.NetTopologySuite.Index.Strtree.STRtree.CreateParentBoundablesFromVerticalSlices(IList[] verticalSlices, Int32 newLevel)
at GisSharpBlog.NetTopologySuite.Index.Strtree.STRtree.CreateParentBoundables(IList childBoundables, Int32 newLevel)
at GisSharpBlog.NetTopologySuite.Index.Strtree.AbstractSTRtree.CreateHigherLevels(IList boundablesOfALevel, Int32 level)
at GisSharpBlog.NetTopologySuite.Index.Strtree.AbstractSTRtree.Build()
at GisSharpBlog.NetTopologySuite.Index.Strtree.AbstractSTRtree.Query(Object searchBounds)
at GisSharpBlog.NetTopologySuite.Index.Strtree.STRtree.Query(IEnvelope searchEnv)
at GisSharpBlog.NetTopologySuite.Noding.MCIndexNoder.IntersectChains()
at GisSharpBlog.NetTopologySuite.Noding.MCIndexNoder.ComputeNodes(IList inputSegStrings)
at GisSharpBlog.NetTopologySuite.Operation.Buffer.BufferBuilder.ComputeNodedEdges(IList bufferSegStrList, IPrecisionModel precisionModel)
at GisSharpBlog.NetTopologySuite.Operation.Buffer.BufferBuilder.Buffer(IGeometry g, Double distance)
at GisSharpBlog.NetTopologySuite.Operation.Buffer.BufferOp.BufferOriginalPrecision()
at GisSharpBlog.NetTopologySuite.Operation.Buffer.BufferOp.ComputeGeometry()
at GisSharpBlog.NetTopologySuite.Operation.Buffer.BufferOp.GetResultGeometry(Double distance)
at GisSharpBlog.NetTopologySuite.Operation.Buffer.BufferOp.Buffer(IGeometry g, Double distance, Int32 quadrantSegments, BufferStyle endCapStyle)
at GisSharpBlog.NetTopologySuite.Geometries.Geometry.Buffer(Double distance, Int32 quadrantSegments, BufferStyle endCapStyle)
at ThinkGeo.MapSuite.Core.BaseShape.BufferCore(Double distance, Int32 quadrantSegments, BufferCapType bufferCapType, GeographyUnit shapeUnit, DistanceUnit distanceUnit)
at ThinkGeo.MapSuite.Core.BaseShape.Buffer(Double distance, GeographyUnit shapeUnit, DistanceUnit distanceUnit)