ThinkGeo.com    |     Documentation    |     Premium Support

Dynamically Create a Legend

I am Trying to dynamically create a legend based of the column values i receive from a shape file.

The Code below loops through a shapefile column and pulls out all non repeating values so i recieve 430,434 and 435 

but i cant get this code to pass the values to html to create a legend. 

Any Suggestions would be greatly appreciated.


List<string> values = new List<string>();
          foreach (Feature f in allFeatures)
          {
              if (f.ColumnValues.ContainsKey(layercode))
              {
                  if (!values.Contains(f.ColumnValues[layercode].ToString()))
                  {
                      values.Add(f.ColumnValues[layercode].ToString());
                     
                  }
              }
 
          }


Hi Gordon,



You can add the legend items based on your "layercode" when the map initializes in your controller side. Some codes is like the below:


            AddLegend(map,values);
            return View(map);
        }
 
private void AddLegend(Map map,List<string> values)
        {
            // Add Legend adorment overlay
            LegendAdornmentLayer legendAdornmentLayer = new LegendAdornmentLayer();
            legendAdornmentLayer.Location = AdornmentLocation.LowerLeft;
            legendAdornmentLayer.XOffsetInPixel = 10;
            legendAdornmentLayer.Title = new LegendItem();
            legendAdornmentLayer.Title.ImageJustificationMode = LegendImageJustificationMode.JustifyImageRight;
            legendAdornmentLayer.Title.TopPadding = 10;
            legendAdornmentLayer.Title.BottomPadding = 10;
            legendAdornmentLayer.Title.TextStyle = new TextStyle("Population", new GeoFont("Segoe UI", 12), new GeoSolidBrush(GeoColor.SimpleColors.Black));
            map.AdornmentOverlay.Layers.Add(legendAdornmentLayer);
 
            foreach (var item in values)
            {
                LegendItem legendItem = new LegendItem();
                legendItem.ImageWidth = 20;
                legendItem.TextRightPadding = 5;
                legendItem.RightPadding = 5;
                if (item == "1")
                {
                    legendItem.ImageStyle = new AreaStyle(new GeoSolidBrush(GeoColor.SimpleColors.Red));
                }
                // … other values
                legendItem.TextStyle = new TextStyle(item, new GeoFont("Segoe UI", 10), new GeoSolidBrush(GeoColor.SimpleColors.Black));
                legendAdornmentLayer.LegendItems.Add(legendItem);
            }
        }

Hope it helps. 

Btw, we fixed a bug related with legend, would you please get the latest dll packages (8.0.149.0) to have a try?

Any questions, please feel free to let us know.



Troy

 

This works if i want to create it when the map is created but i need it to create when the layer turns on. is there any possible way to do that?

Hi Gordon,



I think we can add an empty legendAdornmentLayer into the map at first, then as soon as we add some specified layers, at this time, we take out this layer and then fill the legend item like title and content items into this layer dynamically. Note, we didn’t create a new layer when add the layer is because the ajax call won’t refresh the client side map, including the layers.



Hope it helps and any questions, please feel free to let us know.

Thanks,

Troy

Can you give some example on how to do this? because if i am reading it right we add it when the layer is created and then when it is turned visible then we add in the parameters? 
    private void mAddESNOverlay()
        {
            if (!Map1.CustomOverlays.Contains(SessionHandler.WebESNLocation))
            {


                ShapeFileFeatureSource.BuildIndexFile(SessionHandler.WebESNLocation);
                ShapeFileFeatureLayer lyrESNLayer = new ShapeFileFeatureLayer(SessionHandler.WebESNLocation);
                lyrESNLayer.Open();
                string layercode = "ESNCODE";
                Collection<Feature> allFeatures = lyrESNLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns);
                Collection<ValueItem> valueItems = new Collection<ValueItem>();
                colorSelect(allFeatures, layercode, valueItems);
                ValueStyle valueStyle = new ValueStyle(layercode, valueItems);
                lyrESNLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);
                lyrESNLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                lyrESNLayer.Transparency = 50;
                // Add Legend adorment overlay
                LegendAdornmentLayer legendAdornmentLayer = new LegendAdornmentLayer();
                legendAdornmentLayer.Location = AdornmentLocation.LowerLeft;
                legendAdornmentLayer.XOffsetInPixel = 10;
                legendAdornmentLayer.Title = new LegendItem();
                legendAdornmentLayer.Title.ImageJustificationMode = LegendImageJustificationMode.JustifyImageRight;
                legendAdornmentLayer.Title.TopPadding = 10;
                legendAdornmentLayer.Title.BottomPadding = 10;
                legendAdornmentLayer.Title.TextStyle = new TextStyle("Population", new GeoFont("Segoe UI", 12), new GeoSolidBrush(GeoColor.SimpleColors.Black));

                Proj4Projection proj4 = new Proj4Projection();
                int projkey = Convert.ToInt32(SessionHandler.WebProjection);

                proj4.InternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(projkey);

                proj4.ExternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();
                proj4.Open();
                lyrESNLayer.Open();
                lyrESNLayer.FeatureSource.Projection = proj4;

                LayerOverlay ovlESN = new LayerOverlay(SessionHandler.WebESNName, false, TileType.SingleTile);
                ovlESN.Layers.Add(lyrESNLayer);
                ovlESN.IsVisible = false;
                Map1.CustomOverlays.Add(ovlESN);
                Map1.AdornmentOverlay.Layers.Add(legendAdornmentLayer);
            }

        }


Hi Gordon, 
  
 Could you please let me know how do you switch the status of visible for your layer?  
  
 By JavaScript code or some button trigger background event? 
  
 If you are using button I think you can directly modify the LegendAdornmentLayer in background code. 
  
 Regards, 
  
 Don