ThinkGeo.com    |     Documentation    |     Premium Support

Hide overlay not working for the last visible overlay

We have a Treeview in our GIS-Application where the user can turn on/off layers. Every layer is stored in an overlay.


We do this by setting the "overlays.IsVisisble" property.


oWFMap.Overlays(lngID_AnsichtLayer.ToString).IsVisible = bolShowing


oWFMap.Refresh()


This works for every overlay except for the last visible overlay. After calling the upper code the overlay (layer) is shown until you pan the map.


Any ideas?


Thomas



Thomas,


Thanks for your post.
 
If I am not making any mistake on your question, the problem is it seems impossible cannot hide all the overlays because this problem is always happening when you are trying to make the last overlay invisible.
 
Following code is a very small sample code showing to hide all the overlays when click on the check box, can you have a try on it?

private void ShowHideLayer_Load(object sender, EventArgs e)
        {
            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
 
            ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"..\..\SampleData\Data\Countries02.shp");
            worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.SimpleColors.Transparent, GeoColor.FromArgb(100, GeoColor.SimpleColors.Green));
            worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
            WorldMapKitWmsDesktopOverlay worldMapKitDesktopOverlay = new WorldMapKitWmsDesktopOverlay();
            winformsMap1.Overlays.Add("WorldMapKitDesktopOverlay", worldMapKitDesktopOverlay);
 
            LayerOverlay staticOverlay = new LayerOverlay();
            staticOverlay.Layers.Add("WorldLayer", worldLayer);
 
            winformsMap1.Overlays.Add("WorldOverlay", staticOverlay);
 
            winformsMap1.CurrentExtent = new RectangleShape(-139.2, 92.4, 120.9, -93.2);
            winformsMap1.Refresh();
        }
 
        private void cbkShowLayer_CheckedChanged(object sender, EventArgs e)
        {
            winformsMap1.Overlays["WorldMapKitDesktopOverlay"].IsVisible = false;
            winformsMap1.Overlays["WorldOverlay"].IsVisible = false;
            winformsMap1.Refresh();
        }


 
Any more questions just feel free to let me know.
 
Thanks.
 
Yale

Hello Yale,


I send you a sample via support where you can recreate my problem.


Thanks Thomas



Thomas,


Thanks for your example, which helps us a lot to find out what the problem is. Following is a couple of solutions for you.

Solution1:
Me.WinformsMap1.ThreadingMode = ThinkGeo.MapSuite.DesktopEdition.MapThreadingMode.SingleThreaded
 
Private Sub cmdChangeOverlayVisibilty_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChangeOverlayVisibilty.Click
 
WinformsMap1.Overlays(0).IsVisible = Not WinformsMap1.Overlays(0).IsVisible
WinformsMap1.Refresh()
 
End Sub
 
 
Solution2:
Me.WinformsMap1.ThreadingMode = ThinkGeo.MapSuite.DesktopEdition.MapThreadingMode.SingleThreaded
 
Private Sub cmdChangeOverlayVisibilty_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChangeOverlayVisibilty.Click
 
WinformsMap1.Overlays(0).IsVisible = Not WinformsMap1.Overlays(0).IsVisible
WinformsMap1.Refresh(WinformsMap1.Overlays(0))
 
End Sub
 
 
Solution3: 
Me.WinformsMap1.ThreadingMode = ThinkGeo.MapSuite.DesktopEdition.MapThreadingMode.Multithreaded
 
 
Private Sub cmdChangeOverlayVisibilty_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChangeOverlayVisibilty.Click
 
Try
     WinformsMap1.Overlays(0).Lock.EnterWriteLock()
 
     WinformsMap1.Overlays(0).IsVisible = Not WinformsMap1.Overlays(0).IsVisible
 
     Finally
         WinformsMap1.Overlays(0).Lock.ExitWriteLock()
     End Try
       
     WinformsMap1.Refresh(WinformsMap1.Overlays(0))
End Sub

 
 
Any more questions just feel free to let me know.
 
Thanks.
 
Yale

Ok Yale, 
  
 thanks for information. Solution seems to be the right one because we use map in mutithread mode. 
  
 But as I understand if you call overload of WinformsMap.Refresh (Refresh(Overlay)) any kind of TileCache is also cleared. This is not what I want. I only want to hide my overlay. If user activates overlay again the map control can load data from cache. 
  
 Can you also give me some more information on locking. I have read a lot in the forum but it is not clear at all when I have to use it. 
  
 Thomas

Thomas,


Thanks for your post and reply.


Yes, that is true when you passed in the overlays to be redrawn those overlays caches will be cleared, if you really do not want to do this, just change the FileBitmapTile cache directory and then changed back when needed.


About the Lock system, it will only need to be considered in Multi-threaded mode to fix the threading problem. In single threaded mode, just forget it. Also,  we have video talking something in depth in the DevelopBlog about the lock stuff, if you are interested, just take a look.

gis.thinkgeo.com/Support/Dis...fault.aspx


Any more questions just feel free to let me know.


Thanks.


Yale