使用ArcGIS API for JavaScript 2从多个ArcGIS Server实例中识别图层?


14

这适用于带有JavaScript API 2.4的ArcGIS Server 9.3。

我的目标是单击地图,并使“识别”任务在所有可见的“动态”图层上运行。

IdentifyTask需要一个指向REST端点的URL,其中IdentifyParameters指定应在其上执行标识操作的layerIds

似乎“识别”工具期望所有图层都可以从同一REST端点(即同一ArcGIS Server)访问。

就我而言,图层是从多个ArcGIS Server实例提供的-识别工具如何支持此功能?例如,如果此地图中的“建筑物”和“宗地”图层来自单独的ArcGIS Server。

(这与我之前的问题有关,但是我意识到现在我需要先回答这个问题)


这些概念是否有更新?我一直在使用上面引用的小提琴示例。谢谢
阶段

据我所知,@ phase在使用ArcGIS Server 10和JS API 2.6时概念仍然相同,假设这就是您的意思
Stephen Lead

Answers:


11

首先,这是一个简化的JavaScript API示例,显示了使用DeferredList处理多个标识任务的概念:

//Assume that map is your map object
var idTask1, idTask2, idParams = new esri.tasks.IdentifyParameters();
var url1 = "<server1 url>", var url2 = "<server2 url>";
dojo.connect(map, "onLoad", initIdentifies);
function initIdentifies(map) { //map.onLoad passes in the map object
    idTask1 = new esri.tasks.IdentifyTask(url1);
    idTask2 = new esri.tasks.IdentifyTask(url2);
    //A few sample constant parameters. Set more or less as you need
    idParams.tolerance = 12;
    idParams.returnGeometry = true;
    idParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
    dojo.connect(map, "onClick", runIdentifies);
}
function runIdentifies(evt) {
    var defTask1 = new dojo.Deferred(), defTask2 = new dojo.Deferred;
    var dlTasks = new dojo.DeferredList([defTask1, defTask2]);
    dlTasks.then(showResults); //defTasks will fire after defTask1 and defTask2 have completed
    //These parameters change with each request
    idParams.width = map.width;
    idParams.height = map.height;
    idParams.geometry = evt.mapPoint;
    idParams.mapExtent = map.extent;
    try {
        idTask1.execute(idParams, defTask1.callback, defTask1.errback); //Pass the response into the callback on defTask1
    } catch (e) {
        console.log("Error caught");
        console.log(e);
        defTask1.errback(e); //If you get an error, execute the errback
    }
    try {
        idTask2.execute(idParams, defTask2.callback, defTask2.errback); //Pass the response into the callback on defTask2
    } catch (e) {
        console.log("Error caught");
        console.log(e);
        defTask2.errback(e); //If you get an error, execute the errback
    }
}
function showResults(r) {
    //The format of 'r' is [[Boolean task 1 success, [task 1 results]],[Boolean task 2 success, [task 2 results]]]
    //using the array 'r', build and show your infoWindow as normal
}

然后这是jsFiddle中的一个示例,我认为您可以执行所需的操作,并使用地图中所有可见动态地图图层中的所有可见图层运行。

http://jsfiddle.net/blordcastillo/mULcz/

现在,所有错别字都已解决:)

基本思想是,每当单击地图或切换可见性时,都会重新运行标识。运行标识时,触发的身份任务的数量取决于可见的层数,并且等待直到所有层返回以显示其结果。


这很有意义-非常感谢您发布示例代码
Stephen Lead

2
您的代码中有一些微小的错别字-实际上更令人印象深刻,因为这意味着您是从内存中键入的,甚至不需要运行它。向你致敬!
斯蒂芬·利德

是的,我只是在脑海中打了一下:)让我知道什么是小错别字,我会解决的。
blord-castillo 2011年

在jsFiddle中更改为工作版本。该版本效率不高;理想情况下,当不更改识别点切换的可见性时,我将保存查询结果并仅重做showResults部分。但是,我认为它很好地展示了如何将可见性切换与执行的识别任务联系在一起的概念。另外,您可能希望在每个图层上存储一个模板,以便可以将模板从图层中拉出,而不是像我一样在javascript函数中使用逻辑。
blord-castillo 2011年

4

身份识别任务只能引用一项地图服务,因此您必须:

  • 将您希望运行身份的所有图层放在一个地图服务中
  • 每个地图点击运行多个IdentifyTasks

我遇到了一个类似的情况,该应用程序希望能够在DEM地图服务以及地理处理任务中的海平面上升结果地图服务上进行标识。我选择运行两个IdentifyTasks。您真正需要添加的唯一一件事就是弄清楚这两个任务何时完成。

基本流程是(这使用的是Silverlight / C#)

  • 为DEM和SLR标识设置设置布尔变量
  • 为DEM运行IdentifyTask
  • 将DEMidentifyTaskComplete的bool设置为false
  • 为SLR运行IdentifyTask(使用与DEM相同的常规参数)
  • 将SLRidentifyTaskComplete的bool设置为false
  • 在DEMIdentifyTask_ExecuteCompleted事件侦听器中,我将DEMidentifyTaskcomplete设置为true,然后检查SLRidentifyTaskcomplete是否为true(对SLRIdentifyTask_ExecuteCompleted进行相反的设置)
  • 无论最后一个任务完成,两个bool都将成立,并调用IdentifyTasksComplete,它将这两个结果解析为一个自定义图形对象,并将其添加到地图中,然后将slr和demidentiftytaskcomplete设置为false

谢谢-这就是我所担心的,但是很高兴听到您发现它可行。如果可以使用此站点,您能告诉我该网址吗?
斯蒂芬·利德

它不是公开的,此外还在Silverlight中。祝好运!
wwnick

+1用于多个识别任务。对于JavaScript API,您可以使用dojo.DeferredList(也适用于多个queryTasks)来管理它们。
Derek Swingley 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.