identifyParams = new esri.tasks.IdentifyParameters(); identifyParams.tolerance = 3; identifyParams.returnGeometry = true; identifyParams.layerIds = [1,2,3,4,5,6,7,9]; identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_VISIBLE; identifyParams.geometry = geometry; identifyParams.mapExtent = map.extent; identifyParams.width = map.width; identifyParams.height = map.height; identifyTask.execute(identifyParams, function (identifyResults) {
identifyParams.layerIds = [1,2,3,4,5,6,7,9];
var referenceLayer = new esri.layers.ArcGISDynamicMapServiceLayer(referenceMapServiceName, { * * id: 'referenceLayer' }); var layersInScale; if (referenceLayer.visible === true && !(referenceLayer.visibleLayers.length === 0 || referenceLayer.visibleLayers[0] === -1)) { layersInScale = []; dojo.foreach(referenceLayer.createDynamicLayerInfosFromLayerInfos(), function (v) { if (v.subLayerIds === null && (v.minScale === undefined || v.minScale === 0 || currentScale <= v.minScale) && (v.maxScale === undefined || v.maxScale === 0 || currentScale >= v.maxScale)) { layersInScale.push(v.id); } }); var identifyParams = new esri.tasks.IdentifyParameters(), identifyTask = new esri.tasks.IdentifyTask(referenceLayer.url); identifyParams.geometry = geom; identifyParams.mapExtent = map.extent; identifyParams.tolerance = 3; identifyParams.returnGeometry = true; identifyParams.layerIds = aLayerIds; //only refers to default visible layers as defined on the server identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL; identifyParams.width = map.width; identifyParams.height = map.height; return identifyTask.execute(identifyParams);
dojo.require("dojo.DeferredList"); referenceLayer = new esri.layers.ArcGISDynamicMapServiceLayer(referenceMapServiceName, { id: 'referenceLayer' }); //Operational layers operationalLayer = new esri.layers.ArcGISDynamicMapServiceLayer(operationalMapServiceName, { id: 'operationalLayer' }); function executeIdentify(geom, serviceName, aLayerIds) { var identifyParams = new esri.tasks.IdentifyParameters(), identifyTask = new esri.tasks.IdentifyTask(serviceName); identifyParams.geometry = geom; identifyParams.mapExtent = map.extent; identifyParams.tolerance = 3; identifyParams.returnGeometry = true; identifyParams.layerIds = aLayerIds; //only refers to default visible layers as defined on the server identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL; identifyParams.width = map.width; identifyParams.height = map.height; return identifyTask.execute(identifyParams); } function doIdentify(evt) { var geom = evt.mapPoint, layersInScale, aDeferreds = [], defList, currentScale = map.getScale(), layersToIdentify = [referenceLayer, operationalLayer]; map.graphics.clear(); identifyLayerKeyPrevious = undefined; $.each(layersToIdentify, function (key, value) { if (value.visible === true && !(value.visibleLayers.length === 0 || value.visibleLayers[0] === -1)) { layersInScale = []; $.each(value.createDynamicLayerInfosFromLayerInfos(), function (k, v) { if (v.subLayerIds === null && (v.minScale === undefined || v.minScale === 0 || currentScale <= v.minScale) && (v.maxScale === undefined || v.maxScale === 0 || currentScale >= v.maxScale)) { layersInScale.push(v.id); } }); if (layersInScale.length > 0) { aDeferreds.push(executeIdentify(evt.mapPoint, value.url, layersInScale)); } } }); // create a deferred list to aggregate the state for all identify queries defList = new dojo.DeferredList(aDeferreds); defList.then(function (res) { // "res" is 2D array of results // array[0] indicates success or failure // array [1] is the array of identity results returned formatIdentifyResults(res); }); }
Been dealing with this myself -- and it's different between jsapi 2.x and 3.x. Only what's showing on map will be identified on. Note the checking of subLayerIds for null, scale checking, etc
Solution is for jaspi 3.xvar referenceLayer = new esri.layers.ArcGISDynamicMapServiceLayer(referenceMapServiceName, { * * id: 'referenceLayer' }); var layersInScale; if (referenceLayer.visible === true && !(referenceLayer.visibleLayers.length === 0 || referenceLayer.visibleLayers[0] === -1)) { layersInScale = []; dojo.foreach(referenceLayer.createDynamicLayerInfosFromLayerInfos(), function (v) { if (v.subLayerIds === null && (v.minScale === undefined || v.minScale === 0 || currentScale <= v.minScale) && (v.maxScale === undefined || v.maxScale === 0 || currentScale >= v.maxScale)) { layersInScale.push(v.id); } }); var identifyParams = new esri.tasks.IdentifyParameters(), identifyTask = new esri.tasks.IdentifyTask(referenceLayer.url); identifyParams.geometry = geom; identifyParams.mapExtent = map.extent; identifyParams.tolerance = 3; identifyParams.returnGeometry = true; identifyParams.layerIds = aLayerIds; //only refers to default visible layers as defined on the server identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL; identifyParams.width = map.width; identifyParams.height = map.height; return identifyTask.execute(identifyParams);
Bonus: Identifies on multiple services at once and return as one array using dojo.DeferredList
(using some jQuery loops just change to for or dojo.foreach)dojo.require("dojo.DeferredList"); referenceLayer = new esri.layers.ArcGISDynamicMapServiceLayer(referenceMapServiceName, { id: 'referenceLayer' }); //Operational layers operationalLayer = new esri.layers.ArcGISDynamicMapServiceLayer(operationalMapServiceName, { id: 'operationalLayer' }); function executeIdentify(geom, serviceName, aLayerIds) { var identifyParams = new esri.tasks.IdentifyParameters(), identifyTask = new esri.tasks.IdentifyTask(serviceName); identifyParams.geometry = geom; identifyParams.mapExtent = map.extent; identifyParams.tolerance = 3; identifyParams.returnGeometry = true; identifyParams.layerIds = aLayerIds; //only refers to default visible layers as defined on the server identifyParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL; identifyParams.width = map.width; identifyParams.height = map.height; return identifyTask.execute(identifyParams); } function doIdentify(evt) { var geom = evt.mapPoint, layersInScale, aDeferreds = [], defList, currentScale = map.getScale(), layersToIdentify = [referenceLayer, operationalLayer]; map.graphics.clear(); identifyLayerKeyPrevious = undefined; $.each(layersToIdentify, function (key, value) { if (value.visible === true && !(value.visibleLayers.length === 0 || value.visibleLayers[0] === -1)) { layersInScale = []; $.each(value.createDynamicLayerInfosFromLayerInfos(), function (k, v) { if (v.subLayerIds === null && (v.minScale === undefined || v.minScale === 0 || currentScale <= v.minScale) && (v.maxScale === undefined || v.maxScale === 0 || currentScale >= v.maxScale)) { layersInScale.push(v.id); } }); if (layersInScale.length > 0) { aDeferreds.push(executeIdentify(evt.mapPoint, value.url, layersInScale)); } } }); // create a deferred list to aggregate the state for all identify queries defList = new dojo.DeferredList(aDeferreds); defList.then(function (res) { // "res" is 2D array of results // array[0] indicates success or failure // array [1] is the array of identity results returned formatIdentifyResults(res); }); }
i did some more testing this morning and i made a mistake yesterday in stating that the identify operation doesn't take scale into account. while a scale value is not explicitly supplied, it is necessary to pass in a map extent when identifying. in my tests, rightfully, the values returned given a specific tolerance were different depending on the extent.identifyParams.layerIds = [1,2,3,4,5,6,7,9];
i took a look at the REST documentation and it confirms your expectation that using visible in conjunction with explicitly declared layers should only return results if a returned item is included in one of layers requested AND and would be visible in the map service at the current extent.
http://resources.arcgis.com/en/help/rest/apiref/identify.html
i put together a sample application which seems to demonstrate that this is not the case, as a layer index will be returned (even if it has a default visibility of FALSE in the map service)
http://jsfiddle.net/jagravois/nPpp9/1/
all in all, it seems that you should be able to get the results you want by not asking for a specific layer if you don't want it to be included in the result, whether you are using VISIBLE or ALL as your layerOption parameter.
i hope this information helps.