¿Identificando capas de múltiples instancias de ArcGIS Server usando ArcGIS API for JavaScript 2?

14

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

Mi objetivo es hacer clic en el mapa y ejecutar la tarea Identificar en todas las capas dinámicas visibles.

IdentifyTask requiere una URL para el punto final REST, con IdentifyParameters que especifica en qué capaIds se debe realizar la operación de identificación.

Parece que la herramienta Identificar espera que todas las capas sean accesibles desde el mismo punto final REST (es decir, el mismo servidor ArcGIS).

En mi caso, las capas se sirven desde varias instancias de ArcGIS Server. ¿Cómo puede la herramienta Identificar soportar esto? Por ejemplo, si las capas de Edificios y Parcelas en este mapa provienen de servidores ArcGIS separados.

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

Stephen Lead
fuente
¿Ha habido alguna actualización a estos conceptos? He estado usando la muestra de violín mencionada anteriormente. Gracias
fase
@phase por lo que sé, los conceptos siguen siendo los mismos usando ArcGIS Server 10 y JS API 2.6, suponiendo que eso es lo que quieres decir
Stephen Lead

Respuestas:

11

Primero, aquí hay un ejemplo simplificado de la API de JavaScript para mostrar el concepto de usar DeferredList para procesar múltiples tareas de identificación:

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

Luego, aquí hay un ejemplo en jsFiddle que creo que hace lo que quiere, se ejecuta utilizando todas las capas visibles en todas las capas visibles del mapa dinámico en el mapa.

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

Todos los errores tipográficos se corrigen ahora :)

La idea básica es que cada vez que se hace clic en el mapa o se alterna la visibilidad, la identidad se vuelve a ejecutar. Cuando se ejecuta la identificación, la cantidad de tareas de identidad activadas depende de la cantidad de capas visibles, y espera hasta que todas las capas vuelvan a mostrar sus resultados.

castillo-blord
fuente
eso tiene mucho sentido - muchas gracias por publicar el código de muestra
Stephen Lead
2
Hay un par de pequeños errores tipográficos en su código, lo que en realidad es más impresionante, ya que implica que escribió esto de memoria y ni siquiera necesitó ejecutarlo. ¡Felicitaciones a usted!
Stephen Lead
Sí, acabo de escribir eso en la parte superior de mi cabeza :) Avíseme cuáles son los errores tipográficos menores y los arreglaré.
blord-castillo
Cambiado a una versión de trabajo en jsFiddle. La versión no es perfectamente eficiente; idealmente, guardaría los resultados de mi consulta y simplemente volvería a hacer la sección showResults cuando el punto de identificación no cambie la visibilidad. Pero, creo que muestra bien el concepto de cómo vincular la alternancia de visibilidad junto con las tareas de identificación ejecutadas. Además, desearía almacenar una plantilla con cada capa para poder extraer las plantillas de las capas, en lugar de usar la lógica dentro de las funciones de JavaScript como lo hice yo.
blord-castillo
4

La tarea de identificación solo puede hacer referencia a un servicio de mapas, por lo que deberá:

  • Coloque todas las capas en las que desea ejecutar Identity en un servicio de mapas
  • Ejecute múltiples IdentifyTasks por clic en el mapa

Me encontré con situaciones similares con una aplicación en la que quería poder identificarme en un servicio de mapas DEM y en un servicio de mapas de resultados de aumento del nivel del mar a partir de una tarea de geoprocesamiento. Elegí ejecutar dos IdentifyTasks. Lo único que realmente tiene que agregar es descubrir cuándo se realizan ambas tareas.

El flujo básico es (esto estaba usando Silverlight / C #)

  • Configurar variables booleanas para DEM y SLR Identificar Tareas Completas
  • Ejecute IdentifyTask para DEM
  • establecer bool para DEMidentifyTaskComplete en falso
  • Ejecute IdentifyTask para SLR (utilizando los mismos parámetros generales que para DEM)
  • establece bool para SLRidentifyTaskComplete en falso
  • En el detector de eventos DEMIdentifyTask_ExecuteCompleted, configuro DEMidentifyTaskcomplete en verdadero y luego verifico si SLRidentifyTaskcomplete es verdadero (configure lo contrario para SLRIdentifyTask_ExecuteCompleted)
  • Cualquiera que sea la tarea finalizada en último lugar, ambos bools serán verdaderos y llama a IdentifyTasksComplete, que analiza ambos resultados en un objeto gráfico personalizado que agrego al mapa, luego establece slr y demidentiftytaskcomplete en false
wwnick
fuente
gracias, eso es lo que temía, pero es bueno saber que lo encontraste viable. Si este sitio está disponible, ¿puede informarme la URL?
Stephen Lead
No es público, y está en Silverlight además. ¡Buena suerte!
wwnick
+1 para múltiples tareas de identificación. Para la API de JavaScript, puede administrarlos con dojo.DeferredList (también se aplica a múltiples queryTasks).
Derek Swingley