Solved! Go to Solution.
Hi,
The problem in your code is with the map.onLayersAddResult event, since your legend is created inside the callback of this event. This event is fired when map.addLayers(<an array of layers>) is executed. map.addLayer() will NOT fire this event.
The only thing you need to do is to change:map.addLayer(transMapLayer); ... map.addLayer(mainMapLayer);
to:map.addLayers([transMapLayer, mainMapLayer]);
You may need to tweak your CSS styles a bit to adjust the layout afterward.
map.addLayer(transMapLayer); ... map.addLayer(mainMapLayer);
map.addLayers([transMapLayer, mainMapLayer]);
Hi,
The problem in your code is with the map.onLayersAddResult event, since your legend is created inside the callback of this event. This event is fired when map.addLayers(<an array of layers>) is executed. map.addLayer() will NOT fire this event.
The only thing you need to do is to change:map.addLayer(transMapLayer); ... map.addLayer(mainMapLayer);
to:map.addLayers([transMapLayer, mainMapLayer]);
You may need to tweak your CSS styles a bit to adjust the layout afterward.
<div data-dojo-props="region:'left'" data-dojo-type="dijit.layout.ContentPane" data-dojo-props="title:'Legend'" style="border:1px solid #000; width: 200px">
<script>var dojoConfig = { parseOnLoad:true }</script> <script src="http://js.arcgis.com/3.7/"></script> <script> dojo.require("esri.map"); dojo.require("dojox.grid.DataGrid"); dojo.require("dojo.data.ItemFileReadStore"); dojo.require("esri.tasks.find"); dojo.require("dijit.layout.BorderContainer"); dojo.require("dijit.layout.ContentPane"); dojo.require("dijit.form.Button"); dojo.require("esri.dijit.Legend"); var findTask, findParams; var map, center, zoom; var grid, store; function init() { dojo.connect(grid, "onRowClick", onRowClickHandler); center = [-98.544, 29.47]; zoom = 11; map = new esri.Map("map", { basemap: "hybrid", center: center, zoom: zoom }); var transMapLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer", { id: "trans" }); var mainMapLayer = new esri.layers.ArcGISDynamicMapServiceLayer("http://mapservices2.bexar.org/arcgis/rest/services/Historic/Historic_POI/MapServer", { id: "1896" }); map.addLayers([transMapLayer, mainMapLayer]); //Create Find Task using the URL of the map service to search findTask = new esri.tasks.FindTask("http://mapservices2.bexar.org/arcgis/rest/services/Historic/Historic_POI/MapServer"); dojo.connect(map, "onLoad", function() { //Create the find parameters findParams = new esri.tasks.FindParameters(); findParams.returnGeometry = true; findParams.layerIds = [0]; findParams.searchFields = [ "Name", "Owner", "Category"]; findParams.outSpatialReference = map.spatialReference; console.log("find sr: ", findParams.outSpatialReference); }); dojo.connect(map, "onLayersAddResult", function(result) { var legend = new esri.dijit.Legend({ map:map, layerInfos:[{layer:mainMapLayer,title:"San Antonio Points of Interest 1896"}], arrangement:esri.dijit.Legend.ALIGN_RIGHT },"legendDiv"); legend.startup(); }); } function doFind() { //Set the search text to the value in the box findParams.searchText = dojo.byId("ownerName").value; findTask.execute(findParams,showResults); } function showResults(results) { //This function works with an array of FindResult that the task returns map.graphics.clear(); var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 25, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255, 0, 0]), 1), new dojo.Color([0, 255, 0, 0.25])); //create array of attributes var items = dojo.map(results,function(result){ var graphic = result.feature; graphic.setSymbol(symbol); map.graphics.add(graphic); return result.feature.attributes; }); //Create data object to be used in store var data = { identifier: "OBJECTID", //This field needs to have unique values label: "OBJECTID", //Name field for display. Not pertinent to a grid but may be used elsewhere. items: items }; //Create data store and bind to grid. store = new dojo.data.ItemFileReadStore({ data:data }); var grid = dijit.byId('grid'); grid.setStore(store); //Zoom back to the initial map extent map.centerAndZoom(center, zoom); } //Zoom to the parcel when the user clicks a row function onRowClickHandler(evt){ var clickedTaxLotId = grid.getItem(evt.rowIndex).OBJECTID; var selectedTaxLot; var distance = 100; dojo.forEach(map.graphics.graphics,function(graphic){ if((graphic.attributes) && graphic.attributes.OBJECTID === clickedTaxLotId){ selectedTaxLot = graphic.geometry; return; } }); var newExtent = new esri.geometry.Extent({ "xmin": selectedTaxLot.x - distance, "ymin": selectedTaxLot.y - distance, "xmax": selectedTaxLot.x + distance, "ymax": selectedTaxLot.y + distance, "spatialReference": { "wkid": 102100 } }); map.setExtent(newExtent); console.log(map.graphics.graphics); } dojo.ready(init); </script> </head> <body class="claro"> <div data-dojo-type="dijit.layout.BorderContainer" data-dojo-props="design:'headline'" style="width:100%;height:100%;margin:0;"> <div data-dojo-type="dijit.layout.ContentPane" data-dojo-props="region:'top'" style="height:40px;"> Point of Interest: <input type="text" id="ownerName" size="20" value="Koehler" /> <button data-dojo-type="dijit.form.Button" data-dojo-props='onClick:function(){ doFind();}, value:"Search"'> Search </button> </div> <div data-dojo-props="region:'left'" data-dojo-type="dijit.layout.ContentPane" data-dojo-props="title:'Legend'" style="width:18%; border:1px solid #000;"> <div id="legendDiv"></div> </div> <div id="map" data-dojo-props="region:'center'" data-dojo-type="dijit.layout.ContentPane" style="border:1px solid #000;"></div> <div data-dojo-type="dijit.layout.ContentPane" data-dojo-props="region:'bottom'" style="height:150px;"> <table data-dojo-type="dojox.grid.DataGrid" data-dojo-id="grid" id="grid" data-dojo-props="rowsPerPage:'5', rowSelector:'20px'"> <thead> <tr> <th field="Name" width="50%">Point of Interest</th> <th field="Category">Category</th> <th field="Owner">Owner</th> </tr> </thead> </table> </div> </div> </body> </html>
Now only if I knew a quick way to have the pop-ups for my POI layer show on the map, any ideas would be greatly appreciated.
graphic.setInfoTemplate(new esri.InfoTemplate());
A simple way to do this with your existing code is to set InfoTemplate for the graphic in your showResults(results) function:graphic.setInfoTemplate(new esri.InfoTemplate());
You can further customized the text in your pop-ups. Refer to Graphic.setInfoTemplate(infoTemplate) for more information.