ThinkGeo.com    |     Documentation    |     Premium Support

How to refresh a single OverLay?

Hi



I want to refresh/redraw a single/specific overlay. I have made a method to do so:

private void RefreshFieldPolygonOverlay()

{

    Overlay fieldPolygonOverLay = m_Map.Overlays.SingleOrDefault(ol => ol.Name == OverLays.FieldPolygonOverlay);

    if (fieldPolygonOverLay != null)

    {

        m_Map.GeoCanvas.BeginDrawing(m_Map.GetBitmap(m_Map.Width, m_Map.Height), m_Map.CurrentExtent, m_Map.MapUnit);

        fieldPolygonOverLay.Refresh(m_Map.GeoCanvas, m_Map.CurrentExtent);

        m_Map.GeoCanvas.EndDrawing();

    }

}



The method doesn’t complain, but the map doesn’t show the redrawed image. - How to do that?



The reason why I want to refresh that specific layer is that I don’t want my worldlayer (Google or wms) to make a new web-request just to get the exact same image as is all ready retrieved earlier. This happens if I just call m_Map.Refresh().



Best regards

Lars



Hi Lars, 
  
 I think you don’t need to call BeginDrawing and EndDrawing, you can try to directly call fieldPolygonOverLay.Refresh(); 
  
 And could you please let me know what overlay the fieldPolygonOverLay is? And if you call Map.Refresh(), whether that works just like you want? 
  
 Regards, 
  
 Don

Hi Don



It isn’t possible to call fieldPolygonOverLay.Refresh() without calling BeginDrawing first. - If I do so, I get the error:

An exception of type ‘System.InvalidOperationException’ occurred in MapSuiteCore.dll but was not handled in user code

Additional information: The GeoCanvas is currently not drawing.  Please call the BeginDraw method before calling this method.


fieldPolygonOverLay is a LayerOverlay that adds an InMemoryLayer to the map. This is done by the procedure:

private void AddFieldPolygonOverlay()

 {

    if (m_Map.Overlays.All(ol => ol.Name != “FieldPolygonOverlay”))

    {

        LayerOverlay staticOverlay = new LayerOverlay();

        staticOverlay.Name = OverLays.FieldPolygonOverlay;

        staticOverlay.Layers.Add(“FieldPolygonOverlay”, m_Controller.FieldPolygonLayer);    // adding the InMemoryLayer to the LayerOverlay

        m_Map.Overlays.Add(staticOverlay);

    }

}



Calling m_Map.Refresh works OK. Its just that I am not so satisfied that a wms-layer, that is also added to the map, also is refreshed (making http-requests to its source) eventhough there is nothing in that layer, which needs to be refreshed. - These redundant calls is slowing the application down.



Best regards

Lars



Have you considered the refresh overload for specific overlays? 
  
 m_Map.Refresh( fieldPolygonOverLay );

No, I havent been observant enough… Your proposal is just what I wanted to do. And it works perfectly. 
  
 Thanks.

Hi Russ, 
  
 Thanks for help us! 
  
 Regards, 
  
 Don