ThinkGeo.com    |     Documentation    |     Premium Support

Exception with message Cannot insert items into an STR packed R-tree after it has been built

     I get this exception from time to time when updating a LineShape (adding vertex). This is the stack trace:



GisSharpBlog.NetTopologySuite.Utilities.AssertionFailedException was unhandled


  Message="Cannot insert items into an STR packed R-tree after it has been built."


  Source="NetTopologySuite"


  StackTrace:


       at GisSharpBlog.NetTopologySuite.Utilities.Assert.IsTrue(Boolean assertion, String message)


       at GisSharpBlog.NetTopologySuite.Index.Strtree.AbstractSTRtree.Insert(Object bounds, Object item)


       at GisSharpBlog.NetTopologySuite.Index.Strtree.STRtree.Insert(IEnvelope itemEnv, Object item)


       at ThinkGeo.MapSuite.Core.InMemoryFeatureSource.BuildIndex()


       at ThinkGeo.MapSuite.Core.InMemoryFeatureSource.CommitTransactionCore(TransactionBuffer transactions)


       at ThinkGeo.MapSuite.Core.FeatureSource.CommitTransaction()


       at ThinkGeo.MapSuite.Core.EditTools.CommitTransaction()


       at MapView.frmMap.AddOrUpdateTrack(Int32 TargetID, Double Latitude, Double Longitude)


       at MapView.frmMap.PlotTracks()


       at System.Threading.ThreadHelper.ThreadStart_Context(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)


       at System.Threading.ThreadHelper.ThreadStart()


  InnerException: 



  What does it mean?




Carlos, 
  
 We have tried to reproduce the exception, but it works, we can not get any exception follow your screen-shot, and I also check the source code and find that it’s impossible, so could you provide a simple fully sample code that can exactly reproduce this exception? By the way, does your application is in multi thread mode, if so, you may need to add “lock” to make each CommitTransaction operation isolated. 
  
 Thanks, 
 James 


Hi James, 
  
  I don’t think I can prepare a simple demo only for this exception, as it occurs very randomly. It might be something multithread related as you point out, as this piece of code runs in a background thread, but is the only one modifying the layer, so I thought .BeginTransaction and .EndTransaction was taking care of the MapSuite thread “lock”. Every certain number of updates I’m telling WpfMap to refresh the overlay, so it might be that the background thread is continuing updating the InMemoryLayer while the map is still working on refresh, or it is supposed to have finished after the WpfMap1.Overlays(“TracksOverlay”).Refresh() returns?

Carlos,


We tested in background thread, it will throw exception because two threads access the same object that make the status of this object not follow the code flow sequence, and then we added a lock cover the five lines codes which your provide in our sample to solve the thread problem. Could you try to add lock and test again? 


BeginTransaction does not take care of thread lock, it just a sign to say “now, the FeatureSource allows editing”, there are some additional prerequisites to beginning a transaction, such as ensuring that a transaction is not already in progress. 


In my opinion, you could get features or operate map while map is refreshing, but don’t do any editing operation, such as update feature in InMemoryFeatureLayer. If you still want to do that, please send a simple sample to me, we can reproduce the problem and try to find a solution to solve it.


Thanks,


James