ThinkGeo.com    |     Documentation    |     Premium Support

Error during GetFeaturesWithinDistanceOf

I am getting an error on a few customer machines during the GetFeaturesWithinDistanceOf() method. It seems to be coming from a sort method run within the NetTopologySuite DLL. The DLL version is 1.7.3.31740, which looks like it hasn’t changed in a long time, so I doubt it’s a bug in that code. 




parcels = parcelLayer.QueryTools.GetFeaturesWithinDistanceOf( selectedShape.GetShape(),
                                    Map.MapUnit, unit, radius,
                                    ReturningColumnsType.NoColumns );

This is the code I’m using, pretty straight forward. I cannot reproduce this on my dev machine, so I am not sure what’s going on. This happens on windows 7 client machines.



I noticed There are a couple unresolved threads also with this issue:  thinkgeo.com/forums/MapSuite/tabid/143/aft/8725/Default.aspx and thinkgeo.com/forums/MapSuite/tabid/143/aft/10614/Default.aspx



Neither of which were reproducible, which is the predicament I’m in as well. 





Here’s the massive call stack: 



Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results. x: ‘GisSharpBlog.NetTopologySuite.Index.Strtree.ItemBoundable’,  x’s type: ‘ItemBoundable’, IComparer: ‘GisSharpBlog.NetTopologySuite.Index.Strtree.STRtree+AnonymousXComparerImpl’.

   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.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.Buffer(IGeometry g, Double distance, Int32 quadrantSegments, BufferStyle endCapStyle)

   at ThinkGeo.MapSuite.Core.BaseShape./xo=(Double ABs=, Int32 ARs=, BufferCapType Ahs=)

   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)

   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesWithinDistanceOfCore(BaseShape targetShape, GeographyUnit unitOfData, DistanceUnit distanceUnit, Double distance, IEnumerable`1 returningColumnNames)

   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesWithinDistanceOf(BaseShape targetShape, GeographyUnit unitOfData, DistanceUnit distanceUnit, Double distance, IEnumerable`1 returningColumnNames)

   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesWithinDistanceOf(BaseShape targetShape, GeographyUnit unitOfData, DistanceUnit distanceUnit, Double distance, ReturningColumnsType returningColumnNamesType)

   at ThinkGeo.MapSuite.Core.QueryTools.GetFeaturesWithinDistanceOf(BaseShape targetShape, GeographyUnit unitOfData, DistanceUnit distanceUnit, Double distance, ReturningColumnsType returningColumnNamesType)

   at BSASoftware.GIS.Forms.Controls.Base.MapControlBase.TrackOverlay_TrackEnded(Object sender, TrackEndedTrackInteractiveOverlayEventArgs e)

   at ThinkGeo.MapSuite.WpfDesktopEdition.TrackInteractiveOverlay.OnTrackEnded(TrackEndedTrackInteractiveOverlayEventArgs e)

   at ThinkGeo.MapSuite.WpfDesktopEdition.TrackInteractiveOverlay.eBk=()

   at ThinkGeo.MapSuite.WpfDesktopEdition.TrackInteractiveOverlay.MouseClickCore(InteractionArguments interactionArguments)

   at ThinkGeo.MapSuite.WpfDesktopEdition.InteractiveOverlay.MouseClick(InteractionArguments interactionArguments)

   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.zBY=(InteractionArguments zRY=)

   at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.yRY=(Object yhY=, MouseButtonEventArgs yxY=)

   at ohM=.qhg=.OnSingleClick(Object sender, MouseButtonEventArgs e)

   at ohM=.qhg=.Ixk=(Object JBk=, MouseButtonEventArgs JRk=)

   at ohM=.qhg=.Jhk=(Object Jxk=, EventArgs KBk=)

   at System.Windows.Threading.DispatcherTimer.FireTick(Object unused)

   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)

   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

   at System.Windows.Threading.DispatcherOperation.InvokeImpl()

   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)

   at System.Threading.ExecutionContext.runTryCode(Object userData)

   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)

   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)

   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

   at System.Windows.Threading.DispatcherOperation.Invoke()

   at System.Windows.Threading.Dispatcher.ProcessQueue()

   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)

   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)

   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)

   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)

   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)

   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)

   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)

   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)

   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)

   at System.Windows.Forms.Application.Run(Form mainForm)

   at BSASoftware.Assessing.Program.Main(String[] args)

Hi Kevin,



Thanks for reporting the issue, and like we can see it does throw from NTS but I am afraid to say it is hard for us to debug. Also, another reason is it is not easy to recreate as it is related some special shape I guess. 



You are right that the NTS version we are referring doesn’t upgrade for a long time, but as I know, we might have a plan on the upgrade after the Map Suite 8.0 release. But not sure if the upgrade would be helpful on this issue. Before that, I am afraid we can do less unless you can send us parceLayer shape file and the shape wkt which you are passing in the method to recreate the issue.



Sorry for any inconvenience.

Thanks,

Troy




Troy,



I’d be happy to send the shape information through FTP. Do you have a way I can do that?



Thanks,



Kevin

Hi Kevin,



We would like to setup a ftp account for you, please send the request to support@thinkgeo.com and they will send you the your user name and password. more guidance please follow wiki.thinkgeo.com/wiki…to_Support



Btw, excepting the shape file, it is better you can recreate the issue and send us a sample for it. That would be very easier to debug it.



Thanks,

Troy


Troy, 
  
 I uploaded the shapefile I’m having trouble with to your FTP. It is in the subdirectory “Shapefiles” for user bsasoftware. 
  
 I will attempt to get a sample working, but I’m thinking there is something specifically wrong with this shapefile. Perhaps if you take a look you could find the issue? Thanks!

Hi Kevin, 
  
 We’v gotten the shape file, but we have no any idea to recreate it and there is nothing wrong with the shape file. But like I guessed before, I think the key is the parameters which are passing in the method GetFeaturesWithinDistanceOf( selectedShape.GetShape(),.MapUnit, unit, radius, ReturningColumnsType.NoColumns ); Especial the “selectedShape”. 
  
 In order to help you to recreate the exception, from the exception stack, we can see it happens when we try to buffer the select shape and nothing wrong with the shape file I guess. So I just guess the selected shape must be a special shape and once we got this shape, then we can recreate it. Also, we can store the shape wkt by calling “selectedShape.GetWellKnownText()”. 
  
 Thanks, 
 Troy 


I am encountering the same exception shown above within the NetTopologySuite.dll from within an application using 8.0.0.11 of the DesktopEdition of MapSuite 8.0.   I am a little confused about the error because when I run our application on a computer with Visual Studio 2010 Professional and Sql Server Express installed the sort is never a problem.  However when I run on an identical (hardware) machine without Visual Studio or Sql Server, it fails consistently with the sort  reporting the error above an the top portion of the call stack identical to the call stack above.  This seems to indicate that the exception is dependent on some other .NET dll installed by Visual Studio or SQL Server.  I have been trying to track down NetTopologySuite dependencies related to the sort exception but I have not found anything except Microsoft.SQLServer.Types.dll.   This dll is in the GAC on the Visual Studio/Sql Server environment but is not found in the GAC on the machine with the failure.  



Can anyone tell me if this dll could be an issue?  Could there be other dependencies for the .NET sort that may not be part of the non-Visual Studio/SQl Server environment?



I am trying to avoid having to install Visual Studio or SQL Server on the machine which is throwing the exception.  One other note that might be related.  The machine with Visual Studio 2010 and SQl Server shows that seven .Net Framework packages are installed which are

Microsoft .NET Framework 4 Multi-Targeting Pack

Microsoft .NET Framework 4.5 Multi-Targeting Pack

Microsoft .NET Framework 4.5.1 Multi-Targeting Pack

Microsoft .NET Framework 4.5.1 Multi-Targeting Pack (ENU)

Microsoft .NET Framework 4.5 SDK

Microsoft .NET Framework 4.5.1 SDK

Microsoft .NET Framework 4.5.1



The machine with the exception only has 

Microsoft .NET Framework 4.5.1






Hi Richard, 
  
 We have a wiki page about the dependencies: wiki.thinkgeo.com/wiki/Map_Suite_WPF_Desktop_Edition_Dependencies_Guide 
  
 It looks the Microsoft.SqlServer.Types.dll is work for Sql CLR Type Topology but not for NTS Topology. 
  
 Have you tried to install our Map Suite Unmanaged Dependencies Setup x.x.x.x.msi for solve that? 
  
 Regards, 
  
 Don

Don,



Thanks for the quick response and the info on the dependencies.



The machine on which the exception with the sort is occurring is a “Locked-down” machine meaning I do not have any installation permissions and that I do not have permission to copy files anywhere in the Windows folders (System32 or SYSWOW64).  I have tried placing all the indicated dependencies:



Microsoft.SQLServer.Types.DLL

SQLServerSpatial100.dll

SQLServerSpatial.dll

msvcp100.dll

msvcp100d.dll

msvcr100.dll

msvcr100d.dll



in the bin folder with the .exe file for our application (directory that the application is executing out of).    It did not make a difference as the exception is still the same.   I do not know if this is because the Microsoft.SQLServer.Types.dll is not installed into the GAC (c:\windows\assembly) or if these other dependencies are not in the search path for the application (my.exe and NetTopologySuite.dll).   I can ask to get permissions to install on the “locked down” machine but it is a lengthy process that can takes weeks.   I was hoping to identify the actual “fix” more definitively before I go to the length of requesting permissions so that I don’t have to request permissions more than once.  From the discussions in this thread above it appears that the NetTopologySuite.dll is a little out of date and that a new version might be integrated into MapSuite 8.0.  I was wondering if there is any progress on this front and if the “Sort” exception might be a known correction in the newer versions.



Thanks for the info.  I’ll let you know if I get the access and can experiment with these dlls.



Richard




Hi Kevin, 
  
 1. We won’t search bin folder but only search system folder. 
  
 2. If your process is so long, I think you should want to test that in a clean Virtual Machine, copy the dlls and see whether that will works. Please make the environment looks just the same like your target machine. If you found copy the dlls make that works, please just ignore my item 3. 
  
 3. That’s very strange because I think you haven’t used any special data source like ECW/MrSid/GDAL RasterLayer etc.  
 when you render them it required support from msvcxxxx.dll. But if you only use shape file, we don’t need them.  
 And if you don’t use SQL related feature, you don’t need SQLServerSpatialxxx.dll.  
 So I review your call stack and search that again, I found a original topic here: thinkgeo.com/forums/MapSuite/tabid/143/aft/11011/Default.aspx 
 Please see the last reply from Ben, do you think you get the same exception just like it?  
 Ben mentioned this exception only be thrown in X86 machine with .net 4.0 (It looks your machine is with .net 4.5).  
 So please do some try in your VM for different .net framework. 
  
 Please let me know if you have any news about it. 
  
 Regards, 
  
 Don

Don,



I don’t believe I had actually included my stack trace So here it is:



[1] 2014-08-26 13:05:18,774 ERROR STTI.FAC.MapManager2d.Gui.MRTMapHelpersDelegates Exception while GetRingAroundPolygon. Exception: System.ArgumentException: Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results. IComparer: ‘GisSharpBlog.NetTopologySuite.Index.Strtree.STRtree+AnonymousYComparerImpl’.

   at System.Array.SorterObjectArray.DepthLimitedQuickSort(Int32 left, Int32 right, Int32 depthLimit)

   at System.Array.SorterObjectArray.DepthLimitedQuickSort(Int32 left, Int32 right, Int32 depthLimit)

   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.Buffer(IGeometry g, Double distance, Int32 quadrantSegments, BufferStyle endCapStyle)

   at ThinkGeo.MapSuite.Core.BaseShape.LB0=(Double LR0=, Int32 Lh0=, BufferCapType Lx0=)

   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)

   at STTI.FAC.MapControl2d.MapSuiteHelpers.GetRingAroundPolygon(Double ringBufferDistance, Double[]& polygonLatitude, Double[]& polygonLongitude, Double[]& ringPolygonLatitude, Double[]& ringPolygonLongitude) in C:\P4V\Richard.Styer_MRT_dev\depot\SXXIO\Trunk\Products\SM-ESP\Development\Source_20130418\MRT_MapControl2d\MapSuiteSrc\MapSuiteHelpers.cs:line 587

   at STTI.FAC.MapManager2d.Gui.MRTMapHelpersDelegates.GetRingAroundPolygon(Double ringBufferDistance, Double[]& polygonLatitude, Double[]& polygonLongitude, Double[]& ringPolygonLatitude, Double[]& ringPolygonLongitude) in C:\P4V\Richard.Styer_MRT_dev\depot\SXXIO\Trunk\Products\SM-ESP\Development\Source_20130418\MRT_MapControl2d.GUI\MRTMapHelpersDelegate.cs:line 464





I am running an x86 version of our application on 64-bit Windows 7 Professional operating system.  I tried to run a 64-bit version of our application but it will not run because I have a 32-bit version of Office installed and our application is dependent on Access.  So I cannot test to see if the Sort exception above occurs on a 64-bit version on this computer.     



It does appear to me that this computer has .NET Framework 4.5 and does not have .NET framework 4.0 so the error must occur in both .NET 4.0 and 4.5.   From what you have indicated it must not involve the SqlServerSpatial.dll or Microsoft.SQLServer.Types.dll.  I tried to switch my database connection as suggested in the other post as a workaround but it errors when it tries to connect with the Microsoft.Jet.OLEDB.4.0 with a message that  “Unrecognized database Format” on the Access database.   



I will try to create a virtual machine when I have the time to generate one.



Thanks for your help



Richard


Hi Richard, 
  
 Thanks for your detail call stack, sorry I thought your call stack exception just the same like Kevin’s. 
  
 From your text, it looks the problem is just the same as the post I mentioned. (thinkgeo.com/forums/MapSuite/tabid/143/aft/11011/Default.aspx
  
 I think you can install a VirtualBox and it install a VM really fast. VM test is helpful for make sure whether copy the dlls is useful for your target machine. 
  
 It looks Ben attached a sample for test the issue, maybe you can try it for make sure whether it’s the same issue. 
  
 Regards, 
  
 Don