ThinkGeo.com    |     Documentation    |     Premium Support

WindowsMap.Refresh()

Hi,


Using DesktopEdition and MapSuiteRouting (both 5.0.96.0), WindowsMap.Refresh() method throws KeyNotFoundException. It doesn't specify the overlay to refresh by a key, but just refreshing any overlay in the control, I believe, then, why does it happen?


I have no clue and got stuck in this part.. I really appreciate your help.


Kaori


 




 The error seems to happen when I use InMemoryFeatureLayer.


1) Add a clolumn when you initialize InMemoryFeatureLayer.


2) Add features dynamically, incluing the column value.


3) Show the feature using WinformMap.Refresh()


4) clear the feature using InMemoryFeatureLayer.InternalFeatures.Clear()


5) WinformMap.Refresh() --> Error


 


Refresh() crashes after erasing all the features. 


What I'm trying to do is clearing the features when routing stopping points are showed. 


Hoping this would help.


 



Kaori, 
  
 Thank you for your post, is that possible to provide a sample to recreate this fast? 
  
 Regards, 
  
 Gary

Hi Gary,


 


There was one more step to cause the error.


 


 


--- When loading the form : 


1) Add a clolumn when you initialize InMemoryFeatureLayer.


2) Add features dynamically, incluing the column value.


3) Show the feature using WinformMap.Refresh()


--- After the form loaded :


4) Zoom out 2 levels, using the mouse wheel manually.


5) clear the feature using InMemoryFeatureLayer.InternalFeatures.Clear() (Click the button on the form)


6) WinformMap.Refresh() --> Error


 

 


Or you can do the other way around, doing everything but 4), then zoom out 2 levels will cause the error too. But in that case the debugger doesn't show the line where the error occurred althrough it shows the same error message.


 


Here's the link to the project. 


dl.dropbox.com/u/11338429/ThinkGeoTest_ClearFeatures.zip


 


 


Thanks for your help.


 


Kaori


 



Kaori, 
  
 Thank you for your information, could you please provide your full stacktrace that we can now which class throw the exception. 
  
 Regards, 
  
 Gary

You could run the project above click one button to see it, though.  




   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at ThinkGeo.MapSuite.Core.GeoCollection`1.get_Item(String key)
   at ThinkGeo.MapSuite.Core.InMemoryFeatureSource.4C8=(RectangleShape 4S8=, IEnumerable`1 4i8=)
   at ThinkGeo.MapSuite.Core.InMemoryFeatureSource.GetFeaturesInsideBoundingBoxCore(RectangleShape boundingBox, IEnumerable`1 returningColumnNames)
   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawingCore(RectangleShape boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1 returningColumnNames)
   at ThinkGeo.MapSuite.Core.FeatureSource.GetFeaturesForDrawing(RectangleShape boundingBox, Double screenWidth, Double screenHeight, IEnumerable`1 returningColumnNames)
   at ThinkGeo.MapSuite.Core.FeatureLayer.DrawCore(GeoCanvas canvas, Collection`1 labelsInAllLayers)
   at ThinkGeo.MapSuite.Core.Layer.Draw(GeoCanvas canvas, Collection`1 labelsInAllLayers)
   at ThinkGeo.MapSuite.DesktopEdition.LayerOverlay.DrawCore(GeoCanvas canvas)
   at ThinkGeo.MapSuite.DesktopEdition.Overlay.tRM=(GeoCanvas thM=)
   at ThinkGeo.MapSuite.DesktopEdition.Overlay.Draw(GeoCanvas canvas)
   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.7RU=(IEnumerable`1 7hU=)
   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.6xU=(RectangleShape 7BU=)
   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.OhY=()
   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.NhY=(Int32 NxY=)
   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.Refresh()
   at ThinkGeoTest_ClearFeatures.ClearFeaturesTest.btnRout_Click(Object sender, EventArgs e) in C:\Users\Kaori\Documents\Data Storage\Bitopia\Projects\ThinkGeo\ThinkGeoTest_ClearFeatures\ClearFeaturesTest.vb:line 306
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(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(Int32 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 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
   at ThinkGeoTest_ClearFeatures.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Kaori, 
  
 Thank you for your further information, I’m working on this and will find out the root cause as soon as possible. 
  
 Regards, 
  
 Gary

Kaori, 
  
 Sorry for waiting, from your stacktrace, looks like the problem is caused when map try to find featrue by their Id. 
  
 Did you built featrueSource’s index? when you add feature, did you try to give them a clear Id? like: 
  
 internalFeatures.Add(feature.Id, feature) 
  
 Regards, 
  
 Gary

I don’t think so. 
  
 Well, please look at the code that I posted… Everything is in there. 
  
 Kaori

Hi Kaori,


Thanks for your sample, that helps to figure out what the problem is. Basically that error you got is about index. We have the in memory RTree index in InmemoryFeatureLayer to enhance the performance if there are thousands of features. 


There are 2 ways to add / remove features in InMemoryFeatureLayer,


1# is: 


inMemoryFeatureLayer.InternalFeatures.Add(newFeature)
inMemoryFeatureLayer.InternalFeatures.Clear()


 In this way, the index is disabled unless call inMemoryFeatureLayer.BuildIndex() method.


2# is:


inMemoryFeatureLayer.FeatureSource.BeginTransaction()
inMemoryFeatureLayer.AddFeature(newFeature)
inMemoryFeatureLayer.FeatureSource.CommitTransaction()



 This way the in memory index will be built automatically, so after you add / remove the features, have to call inMemoryFeatureLayer.BuildIndex() to refresh the in memory index.


In your code, using 2# but didn’t call BuildIndex() method after Clear internal features.


So, 2 way to fix that. 

1. Do NOT use BeginTransaction() / CommitTransaction() to dynamically adding features if you have only a few features in the layer.

2. Call pointLayer.BuildIndex()  in ClearMarkers method after clear InternalFeatures.


Please feel free to let us know if you have any questions.


Thanks,

Lee

 



Lee, you made it so clear. Thank you so much for the helpful information! 
  
 Kaori

You are wecome, it’s nice to hear that helps.  
  
 Thanks, 
 Lee