ThinkGeo.com    |     Documentation    |     Premium Support

How to toggle visible layers on client side

I have a silverlight app with server side rendering of shape files (20 layers, containing poly, lines and point shapes).  I am enhancing the client application to toggle which layers are visible to the user (in real time).  The two methods I have tried are unusable at the moment, and I would like some feedback as to what I am doing wrong.



1st Method - One ServerLayerOverlay, with many ShapeFileFeatureLayer.

I toggle the visible layers on the server side (using the ServerLayerOverlay[0].Layers[?].IsVisible property)



On the client side, I am unable to refresh the GIS window.  When I zoom out or move the map, parts of the screen show the old set of layers, parts show the new layer set.  Its like the client side is caching the images, and is not aware it needs to clear the cache and re-render the image.  (I would prefer to use this method as it will make the app work like a WMS does)



2nd Method - Many ServerLayerOverlay, with one ShapeFileFeatureLayer each.

I toggle the layers on the client side (using Map1.Overlays[?].Visibility property)



The client app is now so slow its unusable.  I have tried adjusting the 'JpegQuality' on each layer but it is still taking 20-30 seconds to render the screen after each zoom / pan change.


Damian



Hi, Damian



If you adopt the 1st method, I guess the problem you have encountered is caused by browser caching images. The client will cache the same request for the images.



In fact, the SilverlightMapConnector is used as a WMS server and the ServerLayerOvelay is the bridge between the client-side and server-side.



I suggest that you could use the 2nd method, it's also we usually adopt. However, even though you have set the Visibility as Visibility.Collapsed, and it just invisible and will still send the requests for the images. I guess that's the reason why it will take much time to render.



So I have two suggestions for your silverlight app. 

First you need to set the ServeCache for ServerLayerOverlay in the server-side, like the code below:



   layerOverlay.ServerCache.CacheDirectory = "c:\\temp";

   layerOverlay.ServerCache.CacheId = "your cahch id."; 



Also if you want to get better user experience, you could pre-caching the images for your shape files on the server-side using the  GenerateCacheImages method of SeverLayerOverlay in SilverlightMapConnector or use your own caching logic.



Secondly, you can just add necessary ServerLayerOverlay to Overlays of Map control, I mean the state is checked if you are using the checkbox to specify the state.



If you still have any problems about it please feel free to let us know.



Thanks,

Khalil



Hi Khalil,


Thanks for the response.  It sounds like you are pushing me to use Method 2.  Your suggestion to use server cache will work not work in our customers live environment.  The GIS is updated several times a day, and we removed server side caching to allow for this.  Secondly, the shapes used cover a large area with alot of detail.  I know smaller shapes are preferred, but customers dictate how they use the software ;-)


I would still prefer to use method 1.  Is there a easy way to clear browser cache (or a property hiding somewhere in ThinkGeo to turn off browser/client side cache)?


Thanks


Damian



Hi, Damian 
  
 I guess there is no such a property to turn off browser cache, but here is a workaround for you. 
  
 There is a Parameters property in ServerLayerOverlay of client-side, and you could add unique extra parameter to it such as the time and make every request different so that the browser will request again and don’t fetch the image from the browser cache. Maybe you could set  a timer,  at regular intervals, and change the value in the parameter. 
  
 Thanks, 
 Khalil

Good work Khalil. 
  
 I must admit, it did take a few days to think about your post before I could make it work.  Perhaps the boys in the development room can make a ‘Method’ to do this a bit easier? 
  
 Thanks again.

Hi, Damian 
  
 Glad to see that you have solved this problem. We will consider to add the ClientCache property to ServerLayerOverlay and just the same way with the LayerOverlay of WebEdition product. 
  
 If you have any better idea about it please let me know.  
  
 Thanks, 
  
 Khalil