Identificando camadas de várias instâncias do ArcGIS Server usando a API do ArcGIS para JavaScript 2?

14

Isso se aplica ao ArcGIS Server 9.3 com a API JavaScript 2.4.

Meu objetivo é clicar no mapa e executar a tarefa Identificar em todas as camadas dinâmicas visíveis.

IdentifyTask requer uma URL para o terminal REST, com IdentifyParameters especificando em quais camadas a operação de identificação deve ser executada.

Parece que a ferramenta Identify espera que todas as camadas sejam acessíveis a partir do mesmo ponto de extremidade REST (ou seja, o mesmo ArcGIS Server).

No meu caso, as camadas estão sendo atendidas a partir de várias instâncias do ArcGIS Server - como a ferramenta Identify suporta isso? Por exemplo, se as camadas Edifícios e Encomendas neste mapa vierem de servidores ArcGIS separados.

(Isso está relacionado à minha pergunta anterior , mas agora percebo que preciso responder a essa pergunta primeiro)

Stephen Lead
fonte
Houve alguma atualização para esses conceitos? Eu tenho usado a amostra de violino mencionada acima. Obrigado
fase
@phase, tanto quanto eu sei que os conceitos ainda são os mesmos usando ArcGIS Server 10 e JS API 2.6, assumindo que é o que você quer dizer
Stephen Chumbo

Respostas:

11

Primeiro, aqui está um exemplo simplificado da API JavaScript para mostrar o conceito de uso do DeferredList para processar várias tarefas de identificação:

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

Então, aqui está um exemplo no jsFiddle que eu acho que faz o que você deseja, executado usando todas as camadas visíveis em todas as camadas visíveis do mapa dinâmico no mapa.

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

Todos os erros de digitação foram corrigidos agora :)

A idéia básica é que sempre que o mapa é clicado ou a visibilidade é alternada, a identificação é executada novamente. Quando a identificação é executada, o número de tarefas de identidade acionadas depende do número de camadas visíveis e aguarda até que todas as camadas retornem para exibir seus resultados.

blord-castillo
fonte
isso faz muito sentido - muito obrigado por postar o código de exemplo
Stephen Lead
2
Existem alguns erros de digitação no seu código - o que é realmente mais impressionante, pois implica que você digitou isso da memória e nem precisou executá-lo. Tiro o chapéu para você!
Stephen Lead
Sim, eu simplesmente digitei isso em cima da minha cabeça :) Deixe-me saber quais são os erros menores e eu os corrigirei.
Blord-castillo 29/07
Alterado para uma versão de trabalho no jsFiddle. A versão não é perfeitamente eficiente; o ideal seria salvar os resultados da minha consulta e refazer a seção showResults quando a visibilidade for alternada pelo ponto de identificação não for alterada. Mas acho que mostra bem o conceito de como vincular a visibilidade e as tarefas de identificação executadas. Além disso, você deseja armazenar um modelo com cada camada, para poder retirá-los das camadas, em vez de usar a lógica dentro das funções javascript, como eu fiz.
Blord-castillo
4

A tarefa de identificação pode fazer referência apenas a um serviço de mapa, portanto, você precisará:

  • Coloque todas as camadas nas quais você deseja executar o Identity em um serviço de mapa
  • Executar várias IdentifyTasks por clique no mapa

Eu me deparei com situações semelhantes com um aplicativo em que queria ser capaz de identificar em um serviço de mapa do DEM e em um serviço de mapa de resultados da elevação do nível do mar a partir de uma tarefa de geoprocessamento. Eu escolhi executar duas IdentifyTasks. A única coisa que você realmente precisa adicionar é descobrir quando as duas tarefas são concluídas.

O fluxo básico é (isso estava usando o Silverlight / C #)

  • configurar variáveis ​​booleanas para DEM e SLR identityTaskcomplete
  • Execute o IdentifyTask for DEM
  • configure bool para DEMidentifyTaskComplete como false
  • Execute o IdentifyTask para SLR (usando os mesmos parâmetros gerais que para o DEM)
  • definir bool para SLRidentifyTaskComplete como false
  • No ouvinte de eventos DEMIdentifyTask_ExecuteCompleted, defino DEMidentifyTaskcomplete como true e, em seguida, verifico se SLRidentifyTaskcomplete é true (configure o oposto para SLRIdentifyTask_ExecuteCompleted)
  • Qualquer que seja a tarefa concluída por último, os dois bools serão verdadeiros e chama IdentifyTasksComplete, que analisa os dois resultados em um objeto gráfico personalizado que eu adiciono ao mapa, em seguida, defina slr e demidentiftytaskcomplete como false
wwnick
fonte
obrigado - era o que eu temia, mas é bom saber que você achou viável. Se este site estiver disponível, informe-me a URL?
Stephen chumbo
Não é público e também está no Silverlight. Boa sorte!
Wwnick
+1 para várias tarefas de identificação. Para a API JavaScript, você pode gerenciá-los com dojo.DeferredList (também se aplica a várias queryTasks).
Derek Swingley