ThinkGeo.com    |     Documentation    |     Premium Support

Refresh Overlay MapSuite 7 vs MapSuite 9

Hello there,


We have recently upgraded our MapSuite version 7 to version 9. 

We had a couple of issues which were replicable in smaller samples and had answered by you guys so far which I highly appreciate.

But now we are facing another issue which is quite weird and I can't think of any reason that why is that happening? 


We have a control which calls MapControl that inherited from WpfMap, in a nutshell, we have tried to create an MVVM friendly version of WpfMap. In our MapControl we have a private field which calls _selectionOverlay and it is a type of LayerOverlay:



private LayerOverlay _selectionOverlay;

After our application loads a layer, let's say a shape file then it let the user select and highlight some features on the map. We do keep all selected features in a LayerOverlay which I mentioned before. 


We have a class which we derived from List<feature> and Feature is </feature>Thinkgeo Feature. 




public class FeatureCollection : List<feature>
{
    public Collection<featuresourcecolumn> Columns { getset; }
}



The class is something like above class has some other properties as well as helper methods which we use for different purposes in the our application.

Now assume we got a MapControl as follow:





public class MapControl : WpfMap
{
    public void RefreshSelection()
    {
        // SelectedFeatures is FeatureCollection class which I mentioned earlier
        var selectionLayer = new InMemoryFeatureLayer(SelectedFeatures.Columns, SelectedFeatures)
        {
            DrawingQuality = DrawingQuality.HighSpeed,
            ZoomLevelSet = GetSelectionLayerStyle()
        };
        Refresh(_selectionOverlay); //here is the faulty code!
    }
}



This is where we are causing a very strange problem after upgrading to MapSuite 9. As you see in the code we InMemortyFeatureLayer which has instantiated by getting Columns and Features from our FeatureCollection class. Assume the SelectedFeatures has one Feature and the Feature has 2 columns, for example, Id and Name. 

As soon as we call Refresh a new column adds to columns of our FeatureCollection class and also Columns of every feature in the FeatureCollection class. The column name is always length and the value is always empty.





 The reason that I am writing to you is I’ve check the codes with both MapSuite 7 and MapSuite 9 and this problem only exists with MapSuite 9. I just done a quick check to make sure if the Refresh function in WpfMap has changed from version 7 to 9? and the result of Visual Studio decompiler is as below:





Version 7:





/// 
/// Refreshes a specified overlay.
/// 
/// 
///
<param name="redrawOverlay" />An overlay which needs to be refreshed.

public void Refresh(Overlay redrawOverlay)
{
  this.Refresh((IEnumerable<overlay>) new Collection<overlay>()
  {
    redrawOverlay
  });
}



Version 9:




/// 
/// Refreshes a specified overlay.
/// 
/// 
///
<param name="redrawOverlay" />An overlay which needs to be refreshed.

public void Refresh(Overlay redrawOverlay)
{
  this.Refresh((IEnumerable<overlay>) new Collection<overlay>()
  {
    redrawOverlay
  }, new TimeSpan(), RequestDrawingBufferTimeType.Default);
}



Apparently the API has slightly changed. 

To make it more clear I have recorded my screen and demonstrated the problem. 


This is the Video:

screencast.com/t/Kcq8fiLp2


Thanks,

Shahin






Hi Shaahin,



I tested your codes and it works fine in my end without any additional column added into feature. However, I suspect this behavior is caused by some styles specified an un-existing column “length”. Would you please search GetSelectionLayerStyle method to see if there are some such styles?

For example:



            ValueStyle valueStyle = new ValueStyle();
            valueStyle.ColumnName = "length";
            valueStyle.ValueItems.Add(new ValueItem("1",AreaStyles.Antarctica1));
            selectionLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Antarctica1 ;



If not, could you provide us more codes on GetSelectionLayerStyle method and Refresh(_selectionOverlay)?



Thanks,



Troy

Hi Troy,  
  
 You are right. We had a piece of code as follow:  
  
 
            var style = new ZoomLevelSet();

            style.ZoomLevel01.DefaultPointStyle =
                PointStyles.CreateSimplePointStyle(StyleHelper.GetPointSymbolType(pointShape), color, pointSize);
            style.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(color, 6.0f, false);
            style.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(color);
            style.ZoomLevel01.DefaultTextStyle = TextStyles.CreateMaskTextStyle(“length”, “Arial”, 10f,
              DrawingFontStyles.Regular,
            GeoColor.StandardColors.Black,
          GeoColor.StandardColors.White);
            style.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
 
 The code which was causing the problem was this part: 
  
 
   //    style.ZoomLevel01.DefaultTextStyle = TextStyles.CreateMaskTextStyle(“length”, “Arial”, 10f,
            //      DrawingFontStyles.Regular,
            //    GeoColor.StandardColors.Black,
            //  GeoColor.StandardColors.White);
 
 
  
 While I appreciate your help to fix the issue but I can’t understand is how come you have decided to change the behavior of Refresh function? Is there any place that you have logged that you changed Refresh to create a new column to the Features of InMemoryFeatureLayer based on assigned style to InMemoryFeaturLayer? 
 Do we need to change our codes or it’s a bug which will be going to be fixed in future releases? 
  
 Thanks, 
 Shahin

Hi Shahin,



I confirmed it with our manager and he mentioned this is an unexpected behavior. 



Currently, we fixed this issue and you can fix it with the latest dlls version. The fixed version will be at dev(9.0.94.0), prod(9.0.0.94), they may be building now, please waiting for some hours.



Thanks,



Troy




Troy, 
  
 I can confirm the problem has resolved. 
  
 Many thanks, 
 Shahin

Hi Shahin, 
  
 We are glad to hear you can confirm that. 
  
 Regards, 
  
 Don

Hi Shahin,

We’ve improved the performance for drawing InMemoryFeatureLayer. We use reference the source features instead of cloning the features when drawing the layer. In the case, it will add the “length” column to the features’ column, so you will see this new column.

As you mentioned, you binding the features with MVVM, the new "length"column will be displayed. There are four options to avoid that:

  1. Double check if you need this column for text style, if there is not column value for “length”, the textstyle displays nothing. we only add one empty column for “length”.
  2. Clone the InMemoryFeatureLayer’s features to your FeatureCollection, it won’t be changed after Map.Refresh.
  3. Filter the “length” column when getting features.
  4. Try using other FeatureLayer instead of InMemoryFeatureLayer.

If any questions please let us know.

Thanks,
Peter