ThinkGeo.com    |     Documentation    |     Premium Support

How can refresh one overlay

 Hi,


I am currently building an application using Map suite WPF Desktop Edition. In my application i have several overlays. With this new version i can refresh one overlay but in order to see the effect of the changed overlay i have to refresh the whole map. Where in earlier version it was sufficient to do refresh that particular overlay. Am i missing anything? Or it is a bug in this latest API


 


Thanks


Raquib



Hi Raquibur,



Could you show me the Assembly version of the Wpf Desktop Edition you are using? I tried the latest daily build and it works fine with the attached sample. Also I tried single tile and it works fine too. We recommend downloading the latest daily build and try again, if the issue still exists, just let us know the code and I'll check for you.



Thanks,

Howard



Post7818.zip (8.25 KB)

 



 Hi Howard, 



Thanks for the reply. But it did not work with InMemoryFeatureLayer. Please see the attached code. 

I am using the latest installer from the download section.



--Raquibur--



Source_Code.zip (276 KB)

Hi Raquibur, 
  
 Thanks for you code. The difference between your code and mine is that your overlay is added dynamically while mine overlay is refreshed dynamically but it’s added in the loaded event. 
  
 Actually, Map.Refresh(overlay) adds your new overlay into the map successfully, the problem is that the new overlay is under the existing overlay in the logic tree so you cannot see it. 
  
 The reason is that when we refresh the map, we’ll reorder the overlay element which is actually a control in the logic tree depending on the Overlays collection. 
  
 The way you refresh the overlay doesn’t reorder the logic tree so your issue happens. I have fixed this issue; you can call map.Refresh() instead of map.Refresh(overlay) temporary or get the daily build 4.0.71.0 tomorrow to use your existing way. 
  
 Hope it makes sense. 
  
 Thanks, 
 Howard

 Hi Howard,


 
Previous map suite edition,
 
I can dynamically delete a overlay. And then refresh that overlay only. This was sufficient to remove all the effect and content of that overlay. In this new WPF edition if i do that the effect of the overlay still there. 
 
 
 
 

LayerOverlay deviceOverlay = new LayerOverlay();
//Add code to load feature layer in the overlay

if (wpfMap.Overlays.Contains(deviceOverlay))
{
wpfMap.Overlays.Remove(deviceOverlay);
wpfMap.Refresh(deviceOverlay);
}


Hi Raquibur, 
  
 This Wpf Desktop Edition is a little different from the previous one. Once you delete the overlay, we actually remove the overlay from the logic tree and you don’t need to refresh; this enhances the performance a little. If you call wpfMap.Refresh(deviceOverlay), this overlay will be added to the map again. That’s why the overlay still there. 
  
 Normally, I don’t think to refresh a removed overlay is a normal operation. So please commend out the last line code. If you still has some queries, just let me know. 
  
 Thanks, 
 Howard

Howard, I am experiencing the same issue layer. I remove an overlay from the map but ovelay content still remains visible on map even after I do WpfMap.Refresh().  This especially applies to ShapeFileFeatureLayer, WmsRasterLayers and other that do not expose a method to clear content.  


An InMemoryFeatureLayer, however, is succesfully removed after do the following:


1. Clear InternalFeatures collection.


2. Call Overlay.Refresh()


3. Remove Overlay from map.


What I do observe in some cases is that content of the removed layer that is still visible is not affected by zoom.  The version of my DLLs is 4.0.0.0.  Do I need an newer build maybe?



Think I figured this out:  To remove a layer it looks like one must do the following:


1. Call IDispose on layer if applicable or clear layer content if possible.  For InMemoryFeatureLayer, I did InternalFeatures.Clear()


2. Remove layer from its parent Overlay, if you have access to it.


3. Refresh parent overlay modified in 2 by calling Overlay.Refresh()


4. If y ou have a one to one mapping between overlay and layers, as I currently do, remove overlay from map.


That should do it.



Hi Klaus, 
  
 Thanks for sharing. I think to conclude it, there are two things you mentioned. One is when a layer is removed or changed; we need call overlay.Refresh() method. When an overlay is removed, it actually removes the overlay element from the logic tree directly, so you don’t need to call any refresh method. Hope it makes sense. 
  
 Just feel free to let us know if there is any misunderstanding. 
  
 Thanks, 
 Howard