Vishful thinking…

Dynamic legend generation through the ADF

Posted in Uncategorized by viswaug on March 16, 2008

I have uploaded my code snippet to generate legend images through the ADF here. The purpose for this grew out of being able to print multiple map resources on the map through the ADF. I had blogged about it before here. I have made some changes to the code snippet after input from some other people trying to do the same thing. The features of the code snippet are:

  • Generates images at the required DPI
  • Customizable legend title
  • Handles group layers
  • Handles symbol groups
  • Creates a legend image of the desired height and width. If the legend entries overflow the height specified, they will be omitted. If all legend entries are required in the images, it should only involve a small change in code to remove the check for overflow.

Here is an example of a legend generated by the snippet.

Legend

11 Responses

Subscribe to comments with RSS.

  1. iamlaksh1 said, on March 19, 2008 at 4:10 am

    Very Good work. I loved work. I have reposted in my blog, so that it will get noticed and useful to others. Hope no issues!

  2. [...] Click here to read the code.  Author Vish  [...]

  3. Jimmy said, on April 24, 2008 at 12:21 pm

    Has any converted the legend code to VB?

  4. Brian said, on April 25, 2008 at 10:50 pm

    In the for loop

    foreach (IGISFunctionality entry in item.Functionalities)
    {
    if (entry is IMapFunctionality)
    mf = entry as IMapFunctionality;
    }

    the item.Functionalities count is zero, therefore not assigning mf to an IMapFunctionality object, and the whole function returns null.

    Why would my map not have an IGISFunctionality entry? Do you know how I would fix this?

    Thanks

  5. viswaug said, on April 25, 2008 at 11:42 pm

    Hi Brian,

    Try initializing your MapResourceItem by calling MapResourceItem.InitializeResource().

    Vish

  6. Gokce said, on May 29, 2008 at 8:45 pm

    Hello,

    I am new to c# and ArcGIS Server, and need to customize Web mapping application to do same thing you did here. I copied this snipplet, however couldn’t make it work. I tried to call it from page_load, but it gives me error on Map map, then I added “using ESRI.ArcGIS.Web.ADF.UI.WebControls”. This solves Map problem but I couldn’t figure out BitMap. What should I do? What should I include more?

    Thanks for all the help,

    Gokce

  7. Thanan said, on September 18, 2008 at 2:37 am

    Vish,

    Very good post. Whar needs to be changed if i need to display only the items in the current map extent in the legend. Can you alos share the implementation code for above during printing .

    –Thanan

  8. steve said, on October 14, 2008 at 3:26 pm

    were you aware of the static method on the toc.renderlegendhtml and the method of the scalebar and northarrow called draw()?

    Could help out a bit…

  9. Daniel said, on November 10, 2008 at 3:39 pm

    Hello,

    I’m also interested in the VB version of the code ….

    Thank you…

  10. osman homek said, on February 6, 2009 at 2:06 pm

    if doesnt work, replace “trying ..” region with this codes

    if need change 0 index replace to your index

    #region “Trying to get the legend information”

    Dictionary<string, KeyValuePair> legendInfo = new Dictionary<string, KeyValuePair>();
    int layerCounter = 0;

    IMapResource itemMP = map.MapResourceManagerInstance.GetResource(0);
    IMapTocFunctionality mtoc = itemMP.CreateFunctionality(typeof(IMapTocFunctionality), Guid.NewGuid().ToString()) as IMapTocFunctionality;
    IMapFunctionality mf = Map1.GetFunctionality(0);

    TocDataFrame[] tocDataFrames = mtoc.GetMapContents(mf.Name, WebImageFormat.PNG24, true, false);
    foreach (TocDataFrame tocDataFrame in tocDataFrames)
    {
    foreach (TocLayer tocLayer in tocDataFrame)
    {
    if (tocLayer.Visible)
    {
    List<KeyValuePair> legends = GetLegendImages(tocLayer);
    if (legends != null && legends.Count > 0)
    {
    foreach (KeyValuePair entry in legends)
    {
    legendInfo.Add(layerCounter.ToString(), new KeyValuePair(entry.Key, entry.Value));
    layerCounter++;
    }
    }

    }
    }
    }

    #endregion

  11. abhi said, on March 24, 2009 at 1:57 pm

    Does anyone know, how to print the transparent graphics layer? I sent the buffered features to SOE, which has transparencies. But they are printing non-transparent.

    Any workaround besides saving it as a shapefile and bring it back to SOE.

    Thanks,

    Abhi


Leave a Reply