ThinkGeo.com    |     Documentation    |     Premium Support

Map refresh after programmatically updating InMemoryFeatureLayer

I'm currently using MapSuite to display data read in from six shapefiles, including a "road" layer. Users are able to select roads in a variety of ways, once selected these are highlighted by adding them to an InMemoryFeatureLayer.


One way of selecting roads is by using the EditOverlay to capture drawn shapes, then using this to find matching entries in the roads layer and drawing them.


 



protected void OnAddPolygon(object sender, ImageClickEventArgs e)
{
  this.LinkSetMap.EditOverlay.TrackMode = TrackMode.Polygon;
}

protected void OnTrackShapeFinished(object sender, EventArgs e)
{
  LayerOverlay roadsOverlay =
    (LayerOverlay)this.LinkSetMap.CustomOverlays["Roads"];
  ShapeFileFeatureLayer roadsLayer =
    ShapeFileFeatureLayer)roadsOverlay.Layers["Roads"];
  roadsLayer.Open();

  foreach (Feature feature in this.LinkSetMap.EditOverlay.Features)
  {
    Collection<Feature> spatialQueryResults =
      roadsLayer.QueryTools.GetFeaturesWithin(feature, new string[0]);

    this.AddFeaturesToSelection(spatialQueryResults);

    roadsLayer.Close();

    this.LinkSetMap.EditOverlay.TrackMode = TrackMode.None;
    this.LinkSetMap.EditOverlay.Features.Clear();
  }
}

private void AddFeaturesToSelection(Collection<Feature> features)
{
  LayerOverlay staticOverlay =
    (LayerOverlay)this.LinkSetMap.CustomOverlays["StaticOverlay"];
  InMemoryFeatureLayer selectedLinksLayer =
    (InMemoryFeatureLayer)staticOverlay.Layers["SelectedLinksLayer"];
  selectedLinksLayer.Open();

  foreach (Feature linkFeature in features)
  {
    if (!selectedLinksLayer.InternalFeatures.Contains(linkFeature.Id))
    {
      selectedLinksLayer.InternalFeatures.Add(linkFeature.Id, linkFeature);
    }
  }

  selectedLinksLayer.Close();
  this.ZoomMapToSelection();
  staticOverlay.Redraw();
}

private void ZoomMapToSelection()
{
  LayerOverlay staticOverlay =
    (LayerOverlay)this.LinkSetMap.CustomOverlays["StaticOverlay"];
  InMemoryFeatureLayer selectedLinksLayer = 
    (InMemoryFeatureLayer)staticOverlay.Layers["SelectedLinksLayer"];

  if (selectedLinksLayer.InternalFeatures.Count > 0)
  {
    this.LinkSetMap.CurrentExtent = staticOverlay.GetBoundingBox();
  }
  else
  {
    this.LinkSetMap.CurrentExtent = defaultExtents;
  }
            
  staticOverlay.Redraw();
}

This process works fine.  When I click on the "draw" button, the map is switched to edit mode and I draw a polygon. When complete, the roads which are inside the drawn shape are located and added to the InMemory layer, which is zoomed and redrawn correctly.


The problem I am having is when I try to add roads which don't involve the editing layer. In this case I have a list of counties which the user selects one then clicks on an add button:



protected void OnAddCounty(object sender, EventArgs e)
{
  string selectedCounty = this.CountyDropdown.SelectedValue;

  LayerOverlay roadsOverlay =
    (LayerOverlay)this.LinkSetMap.CustomOverlays["Roads"];
  ShapeFileFeatureLayer roadsLayer = 
    (ShapeFileFeatureLayer)roadsOverlay.Layers["Roads"];
  roadsLayer.Open();
  Collection<Feature> featuresInCounty =
    roadsLayer.QueryTools.GetFeaturesByColumnValue("County", selectedCounty);
  roadsLayer.Close();

  this.AddFeaturesToSelection(featuresInCounty);
  this.ZoomMapToSelection();
}

When I run this code, the data location process is performed correctly, and a collection of features is retrieved as expected, however upon adding this data to the map no redraw is triggered, nor is the current extent updated. If I zoom the map in or out, then the updated layer is redrawn correctly.  What am I missing? I'm guessing that the first case is only working because we're actively switching in and out of edit mode.



 


Iain,
I think there is no problem with your code except some performance issue. I also create a demo following your description, but all works fine. Please check the attached.
As I mentioned, maybe there is performance issue with your code, because the Layer’s open and Redraw are invoked frequently, both of them cost the time and memory much.
Thanks,
Johnny

MapShapes.zip (3.12 KB)

Hi Johnny,


Thanks for the sample; which didn't work by the way, you forgot to hook up the button click handler :) Anyway, after adding the button handler I tried it out and it worked.  So I stripped out the entire content of the page I was creating and slowly reintroduced the functionality in small chunks  Eventually I hit the breaking point and found out that the root cause of the problem was the buttons themselves. In some places we're making use of a third-party button control, and this wasn't hooking up to the UpdatePanel and ScriptManager correctly.  The result was that the update panel was't refreshing correctly when some of the buttons were being clicked. I replaced these buttons with standard ASP controls and everything burst into life.


Of course this is something that I should have realised sooner, but that's my own fault.  Thanks for the help.


Iain.



Iain, 
  
 That’s very nice. Any questions please let us know. 
  
 Johnny