ThinkGeo.com    |     Documentation    |     Premium Support

Disable Automatic Map Refreshing

Is there a way to set the winforms component to not automatically update (refresh layers)?


I have buttons over the map component and one of the them makes the other buttons slide off to the side to get them out of the way when the user wants to see more of the map.  When the buttons are sliding (moving 10 pixels every 100 ms or so) the map underneath is trying to update all layers at that speed which is too much for the CPU and the application and sliding action slow down tremendously.


I disabled all of my Refresh calls and yet all layers are still being refreshed when this action occurs over the map component.



Nate,




Thanks for your post and questions.  Which version are you trying to use against? You could get the version information by calling the following static API:





string version = WinformsMap.GetVersion();

This problem is caused because Refresh is called when the Map Control is on painted which is happening automatically when sliding the buttons. Could you take a try on the latest version of the Map Control in which this problem should be fixed?

Any more questions please feel free to let me know.

Thanks.

Yale

 



Interesting.  I don't know yet if it's old, but my string is:


MapSuiteCore:4.0.40.0;DesktopEdition:4.0.40.0



Nate, 
  
 Could you have a try on the latest daily build development version (4.0.145.0)? Hope this has be fixed:). 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


I removed the four old references and then added the dev build references, but now I get an error on compile:



Error 1 The type 'System.Collections.Specialized.INotifyCollectionChanged' is defined in an assembly that is not referenced. You must add a reference to assembly 'WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. 1791


 
I get this error on the starred line below:
 

        worldMapKitRenderLayer = new WorldMapKitRenderLayer(WORLD_MAP_KIT_LOCATION);
        worldMapKitRenderLayer.LoadLayers();
 
        LayerOverlay worldMapKitRenderLayerOverlay = new LayerOverlay();
        worldMapKitRenderLayerOverlay.TileCache = fileBitmapTileCache;
*        worldMapKitRenderLayerOverlay.Layers.Add(worldMapKitRenderLayer);
        winformsMap.Overlays.Add(worldMapKitRenderLayerOverlay);
 



 I tried adding the WindowsBase reference, which got rid of the previous error, but now gives JIT errors at program start-up:


 


 


************** Exception Text **************


System.InvalidOperationException: This method will return too many cells that might cause performance problem. Please using GetIntersectingRowColumnRange method instead.


   at ThinkGeo.MapSuite.Core.Matrix.GetIntersectingCells(RectangleShape worldExtent)


   at ThinkGeo.MapSuite.DesktopEdition.Overlay.x1fe1bcb48ae9c277(GeoCanvas x31c084515ae9393f, Double xbf98d45cbf09bf11, Collection`1 xd5309cf451afde67, Collection`1 x4e05a26e147dea5d)


   at ThinkGeo.MapSuite.DesktopEdition.Overlay.MainDraw(GeoCanvas canvas)


   at ThinkGeo.MapSuite.DesktopEdition.Overlay.Draw(GeoCanvas canvas)


   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.x03e3d48bcfe7bb6c(IEnumerable`1 xa6f0db4f183189f1)


   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xff5b27c00f9678c2(RectangleShape x178b193eec228e6e)


   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.x742ba885258f6c2c(RectangleShape xb35a33b423b17f65, Overlay x99251f66cdabc2ad, Int32 xa209325f5c895f7e, Int32 x7454a0d1965919b1, GeographyUnit xbb704b4400ce6f76)


   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.x88c2a2d6d754e692(IEnumerable`1 xa6f0db4f183189f1)


   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xe3cee4adb9c72451()


   at ThinkGeo.MapSuite.DesktopEdition.WinformsMap.xe2c9d9cf47630ace(Object xd9272088e65bd176, EventArgs xc2fd4c0ed406cdb7)


   at System.Windows.Forms.Control.OnSizeChanged(EventArgs e)


   at System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 clientWidth, Int32 clientHeight)


   at System.Windows.Forms.Control.UpdateBounds()


   at System.Windows.Forms.Control.WmWindowPosChanged(Message& m)


   at System.Windows.Forms.Control.WndProc(Message& m)


   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)


   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


 


 



Nate,


Thanks for your feedback and questions.
The first question about the WindowsBase reference problem is because upgrade the DLL compile version, so now we need the Windows Base DLL included in .net 3.0, and just add it as you have done to fix the problem.
The second issue is probably indicating you set the Wrong Map Unit for your application, for example, you set it to DecimalDegrees while in fact it should be Meter, please double check the Unit set to the map control is correct.
Any more questions please feel free to let me know.
Thanks.
Yale

I tried setting the units to Meters, but then the program won't start at all.  I don't get an error or anything, I have to kill the process.  It's always been DecimalDegree in the past.  Does DecimalDegrees for the worldMapKit not work with the new version?


If I set it back to DecimalDegree and run the program from within the IDE, everything works fine.  It's only when I try to run the exe outside the IDE where I see the previous JIT errors.  This worked fine with the .40 version.


Anything else to try?


 


        FileBitmapTileCache fileBitmapTileCache = new FileBitmapTileCache(GIS_TILE_CACHE_LOCATION, "TileCache");


        winformsMap.MapUnit = GeographyUnit.DecimalDegree;
        winformsMap.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.StandardColors.LightGray);
        winformsMap.ZoomToScale(winformsMap.ZoomLevelSet.ZoomLevel05.Scale);
        winformsMap.ZoomLevelSnapping = ZoomLevelSnappingMode.SnapUp;
        winformsMap.AdornmentOverlay.ShowLogo = false;
 
        worldMapKitRenderLayer = new WorldMapKitRenderLayer(WORLD_MAP_KIT_LOCATION);
        worldMapKitRenderLayer.LoadLayers();
 
        LayerOverlay worldMapKitRenderLayerOverlay = new LayerOverlay();
        worldMapKitRenderLayerOverlay.TileCache = fileBitmapTileCache;
        worldMapKitRenderLayerOverlay.Layers.Add(worldMapKitRenderLayer);
        winformsMap.Overlays.Add(worldMapKitRenderLayerOverlay);
 
 

Nate,


Thanks for your reply.
I think DecimalDegrees is the right unit for the WorldMapKit. Could you have a try to set the cache system to the world map kit overlay provided directly?

 

winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
 
WorldMapKitWmsDesktopOverlay worldMapKitDesktopOverlay = new WorldMapKitWmsDesktopOverlay();
FileBitmapTileCache fileBitmapTileCache = new FileBitmapTileCache(@"C:\temp", "TileCache");
worldMapKitDesktopOverlay.TileCache = fileBitmapTileCache;
winformsMap1.Overlays.Add(worldMapKitDesktopOverlay);
 
          
winformsMap1.CurrentExtent = new RectangleShape(-139.2, 92.4, 120.9, -93.2);
 
winformsMap1.Refresh();


Any more questions please feel free to discuss.
Thanks.
Yale

That worked!  I’m not sure I understand why, but for now, I’m not concerned. :) 
  
 Thanks for the help.

Nate, 
  
 I am glad it’s working with you, please let us know if you have more questions. 
  
 Thanks 
 James