Message  "No Legend"

2294
6
12-14-2012 03:29 AM
JoseSanchez
Occasional Contributor III
Hi all

I just started downloading this sample  "Map container split left"  that has a tab with a Legend

http://help.arcgis.com/en/webapi/javascript/arcgis/help/jssamples_start.htm


and replaced the dynamicUrl map service with my service:

  var dynamicUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety/PublicSafetyHazardsandRisks/...";
        var referenceUrl = "http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer";
        dynamicUrl = "http://<myserver>/ArcGIS/rest/services/OneLayer/MapServer";
 

When I run it I get instead of the Legend the following error message: "No Legend"

The map has a legend I just checked running it in my browser   http://<myserver>/ArcGIS/rest/services/OneLayer/MapServer/legend


This is the code I am running from the sample:

          dynamicUrl = "http://<myserver>/ArcGIS/rest/services/WASDDefault/MapServer";

        var basemap = new esri.layers.ArcGISTiledMapServiceLayer(basemapUrl);
        var dynamicLayer = new esri.layers.ArcGISDynamicMapServiceLayer(dynamicUrl,{opacity:0.45});
        var referenceLayer = new esri.layers.ArcGISTiledMapServiceLayer(referenceUrl);
      

        dojo.connect(map,'onLayersAddResult',function(results){
         //add the legend 
          var legend = new esri.dijit.Legend({
            map:map,
            layerInfos:[{layer:dynamicLayer,title:""}],
            arrangement:esri.dijit.Legend.ALIGN_RIGHT
          },"legendDiv");
          legend.startup();
        });
        
        map.addLayer(basemap);
        map.addLayers([dynamicLayer,referenceLayer]);
      }
0 Kudos
6 Replies
JakeSkinner
Esri Esteemed Contributor
Hi Jose,

I noticed you have the DynamicUrl specified twice.  Is your service drawing and the legend not displaying, or is your service not drawing as well as the legend?
0 Kudos
JoseSanchez
Occasional Contributor III
I removed the line and it does the same thing.

It has to be related to the local map

   dojo.connect(map, 'onLoad', function (map) {
                //resize the map when the browser resizes
                dojo.connect(dijit.byId('map'), 'resize', map, map.resize);
            });
            var basemapUrl = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer";
            //var dynamicUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety/PublicSafetyHazardsandRisks/MapServer";
            var referenceUrl = "http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer";
      
      
       var dynamicUrl = "http://<localserver>/ArcGIS/rest/services/OneLayer/MapServer";

            var basemap = new esri.layers.ArcGISTiledMapServiceLayer(basemapUrl);
            var dynamicLayer = new esri.layers.ArcGISDynamicMapServiceLayer(dynamicUrl, { opacity: 0.45 });
            var referenceLayer = new esri.layers.ArcGISTiledMapServiceLayer(referenceUrl);


            legendLayers.push({ layer: dynamicLayer, title: "Dolfin" });

            dojo.connect(map, 'onLayersAddResult', function (results) {
                //add the legend 
                var legend = new esri.dijit.Legend({
                    map: map,
                    layerInfos: legendLayers,
                    arrangement: esri.dijit.Legend.ALIGN_RIGHT
                }, "legendDiv");
                legend.startup();
            });

            map.addLayer(basemap);
            map.addLayers([dynamicLayer, referenceLayer]);




            dojo.connect(map, 'onLayersAddResult', function (results) {


                //add check boxes 
                dojo.forEach(legendLayers, function (layer) {
                    var layerName = layer.title;
                    var checkBox = new dijit.form.CheckBox({
                        name: "checkBox" + layer.layer.id,
                        value: layer.layer.id,
                        checked: layer.layer.visible,
                        onChange: function (evt) {
                            var clayer = map.getLayer(this.value);
                            clayer.setVisibility(!clayer.visible);
                            this.checked = clayer.visible;
                        }
                    });

                    //add the check box and label to the toc
                    dojo.place(checkBox.domNode, dojo.byId("toggle"), "after");
                    var checkLabel = dojo.create('label', { 'for': checkBox.name, innerHTML: layerName }, checkBox.domNode, "after");
                    dojo.place("<br />", checkLabel, "after");
                });

            });




        }


        //show map on load 
        dojo.addOnLoad(init);

      
      
      
      

0 Kudos
JakeSkinner
Esri Esteemed Contributor
I believe the problem may be that you do not have an array created for legendLayers.  Ex:

var legendLayers = [];


Here is the code I was able to get to work with a hosted feature service from ArcGIS.com:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=7" /> 
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/> 
    <title>
    </title>
    <link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.2/js/dojo/dijit/themes/claro/claro.css">
    <link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.2/js/esri/css/esri.css" />
    <link rel="stylesheet" type="text/css" href="css/layout.css"/> 
    <script type="text/javascript">
      var djConfig = {
        parseOnLoad: true
      };
    </script>
    <script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=3.2"></script>
    <script type="text/javascript">
      dojo.require("dijit.dijit"); // optimize: load dijit layer
      dojo.require("dijit.layout.BorderContainer");
      dojo.require("dijit.layout.ContentPane");
      dojo.require("esri.map");
      dojo.require("dijit.layout.TabContainer");
      dojo.require("esri.dijit.Legend");
      dojo.require("esri.layers.FeatureLayer");
      dojo.require("dijit.form.CheckBox")
      
      var map;
      
      function init() {
        var initialExtent = new esri.geometry.Extent({"xmin":-8396836.868209211,"ymin":4835062.442691721,"xmax":-8328196.416809216,"ymax":4891396.53253782,"spatialReference":{"wkid":102100}});
        map = new esri.Map("map", {
          extent: initialExtent
        });
             
        dojo.connect(map, 'onLoad', function (map) {
                dojo.connect(dijit.byId('map'), 'resize', map, map.resize);
            });
            
        var basemapUrl = "http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer";
        var referenceUrl = "http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Boundaries_and_Places/MapServer";    
        var dynamicUrl = "http://services.arcgis.com/Fz6BBJUji5ArUSDM/arcgis/rest/services/Service_Requests/FeatureServer/0";

        var basemap = new esri.layers.ArcGISTiledMapServiceLayer(basemapUrl);
        var dynamicLayer = new esri.layers.FeatureLayer(dynamicUrl);
        var referenceLayer = new esri.layers.ArcGISTiledMapServiceLayer(referenceUrl);
        
        var legendLayers = [];
        legendLayers.push({ layer: dynamicLayer, title: "Service Requests" });

        dojo.connect(map, 'onLayersAddResult', function (results) {
            //add the legend 
            var legend = new esri.dijit.Legend({
                map: map,
                layerInfos: legendLayers,
                arrangement: esri.dijit.Legend.ALIGN_RIGHT
            }, "legendDiv");
            legend.startup();
        });

        map.addLayer(basemap);
        map.addLayers([dynamicLayer, referenceLayer]);


        dojo.connect(map, 'onLayersAddResult', function (results) {
            //add check boxes 
            dojo.forEach(legendLayers, function (layer) {
                var layerName = layer.title;
                var checkBox = new dijit.form.CheckBox({
                    name: "checkBox" + layer.layer.id,
                    value: layer.layer.id,
                    checked: layer.layer.visible,
                    onChange: function (evt) {
                        var clayer = map.getLayer(this.value);
                        clayer.setVisibility(!clayer.visible);
                        this.checked = clayer.visible;
                    }
                });

                //add the check box and label to the toc
                dojo.place(checkBox.domNode, dojo.byId("toggle"), "after");
                var checkLabel = dojo.create('label', { 'for': checkBox.name, innerHTML: layerName }, checkBox.domNode, "after");
                dojo.place("<br />", checkLabel, "after");
            });

        });
    }

      dojo.addOnLoad(init);
    </script>
  </head>
  
  <body class="claro">
    <div id="mainWindow" dojotype="dijit.layout.BorderContainer" design="headline"
    gutters="false" style="width:100%; height:100%;">
      <div id="header" dojotype="dijit.layout.ContentPane" region="top">
        This is the header section
       <div id="subheader">subheader</div>
      </div>
      <div dojotype="dijit.layout.ContentPane" id="leftPane" region="left">
        <div dojotype="dijit.layout.TabContainer" >
          <div dojotype="dijit.layout.ContentPane" title = "Legend" selected="true">
            <div id="toggle"></div>
            <div id="legendDiv"></div>
          </div>
          <div dojotype="dijit.layout.ContentPane"  title="Tab 2" >
            Content for the second tab
          </div>
        </div>
      </div>
      <div id="map" dojotype="dijit.layout.ContentPane" region="center">
      </div>
      <div id="footer" dojotype="dijit.layout.ContentPane" region="bottom" >
        this is the footer section
      </div>
    </div>
  </body>

</html>
0 Kudos
JoseSanchez
Occasional Contributor III
Hi Jake,

I do have this variable declared.

This same code shows the legend when I use the default Esri map service but does not work when I point to my local map service.

Shows legend:
  var dynamicUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety

Does not show legend:    
       var dynamicUrl = "http://<localserver>/ArcGIS/rest/services/OneLayer/MapServer";
0 Kudos
ReneRubalcava
Frequent Contributor
The minimum version of AGS to run the legend from an internal service is 10.0 SP1.
Make sure you at least have SP1 installed or make the service publicly available and it be generated via arcgis.com
http://help.arcgis.com/EN/webapi/javascript/arcgis/help/jsapi/legend.htm

If the layer is an ArcGISDynamicMapServiceLayer or ArcGISTiledMapServiceLayer created using ArcGIS Server 10.0 SP1 or higher the legend is generated using the REST Map Service legend resource.


If the layers are version 10 or lower the legend is created using the ArcGIS.com legend service. In order to use the ArcGIS.com legend service your map service needs to be publicly accessible and your application must be able to access ArcGIS.com.
0 Kudos
JoseSanchez
Occasional Contributor III
Hi Rene,

You are totally right!!!  After upgrading to the last Service Pack 5 the legend works!!!

Gracias Rene!!!

Saludos
Jose
0 Kudos