14 votos

Cómo Identificar las capas de varias instancias del Servidor de ArcGIS

Esto se aplica a ArcGIS Server 9.3 con la API de JavaScript 2.4.

Mi meta es hacer clic en el mapa y tener la identificación de las tareas de ejecución en todos los visibles las capas Dinámicas.

IdentifyTask requiere una dirección URL para el RESTO de extremo, con IdentifyParameters especificando que layerIds el identificar la operación debe ser realizada.

Parece que la herramienta Identificar está a la espera de todas las capas para ser accesible desde el mismo extremo REST (es decir, el mismo ArcGIS Server).

En mi caso, las capas se sirve de múltiples ArcGIS Server instancias - ¿cómo se puede Identificar la compatibilidad de la herramienta de este tipo? Por ejemplo, si los Edificios y Parcelas capas en este mapa fueron llegando desde distintos Servidores ArcGIS.

(Esto está relacionado con mi pregunta anterior, pero me doy cuenta de que ahora tengo que responder a esta pregunta primero)

11voto

Sork Puntos 26

En primer lugar, aquí es una versión simplificada de la API de JavaScript ejemplo para mostrar el uso del concepto de DeferredList proceso de varios identificar tareas:

//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
}

Entonces aquí es un ejemplo en jsFiddle que creo que hace lo que quiere, se ejecuta con todas las capas visibles en todas visible de la dinámica de las capas de mapa en el mapa.

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

Todos los errores tipográficos son fijos ahora :)

La idea básica es que cada vez que el mapa se hace clic o la visibilidad es controlado, la identidad se vuelve a ejecutar. Cuando la identidad se ejecuta, el número de identidad de tareas despedido depende del número de capas visibles, y se espera hasta que todas las capas de volver a mostrar sus resultados.

4voto

helloandre Puntos 5784

La tarea de identificar sólo puede hacer referencia a un servicio de mapas, así que usted tendrá que:

  • Poner todas las capas que se deseen ejecutar Identidad en un servicio de mapas
  • Ejecutar varias IdentifyTasks por mapa haga clic en

Me encontré en una situación similar, con una aplicación donde yo quería ser capaz de identificar en un mapa DEM servicio, y en un aumento del nivel del mar servicio de mapas de resultado de una tarea de geoprocesamiento. Elegí para ejecutar dos IdentifyTasks. La única cosa que usted realmente tiene que añadir es averiguar cuando ambas tareas se realizan.

El flujo básico es (este fue el uso de Silverlight/C#)

  • configuración de las variables booleanas para los DEM y SLR identifyTaskcomplete
  • Ejecutar IdentifyTask para DEM
  • establecer bool para DEMidentifyTaskComplete a false
  • Ejecutar IdentifyTask para RÉFLEX (con los mismos parámetros generales como para los DEM)
  • establecer bool para SLRidentifyTaskComplete a false
  • En DEMIdentifyTask_ExecuteCompleted detector de eventos, me puse DEMidentifyTaskcomplete a true y, a continuación, comprobar para ver si SLRidentifyTaskcomplete es cierto (al contrario para SLRIdentifyTask_ExecuteCompleted)
  • Cualquiera que sea la tarea terminó en el último lugar, tanto bools será verdad, y llamadas IdentifyTasksComplete que analiza tanto los resultados en un gráfico personalizado objeto que puedo agregar a la mapa, a continuación, establezca slr y demidentiftytaskcomplete a false

1voto

Paul Hargreaves Puntos 1022

He recreado este escenario con diferido lista, pero la parte difícil era sólo la identificación de las capas que están en escala. Este es para la versión 3.2 jsapi http://www.spatialexception.org/posts/arcgis-javascript-identifytask-returns-scale-dependent-layers

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X