Identificare i livelli da più istanze del server ArcGIS usando l'API ArcGIS per JavaScript 2?


14

Questo vale per ArcGIS Server 9.3 con l'API JavaScript 2.4.

Il mio obiettivo è fare clic sulla mappa e far eseguire l'attività Identify su tutti i layer dinamici visibili.

IdentifyTask richiede un URL per l'endpoint REST, con IdentifyParameters che specifica su quali layerId l'operazione di identificazione deve essere eseguita.

Sembra che lo strumento Identify si aspetti che tutti i layer siano accessibili dallo stesso endpoint REST (ovvero lo stesso server ArcGIS).

Nel mio caso, i layer vengono serviti da più istanze di ArcGIS Server: come può lo strumento Identify supportarlo? Ad esempio, se i livelli Edifici e Pacchi in questa mappa provenivano da server ArcGIS separati.

(Questo è legato alla mia domanda precedente , ma mi rendo conto ora che devo prima rispondere a questa domanda)


Ci sono stati aggiornamenti a questi concetti? Ho usato il campione di violino di cui sopra. Grazie
fase

@phase per quanto ne so i concetti sono ancora gli stessi usando ArcGIS Server 10 e JS API 2.6, supponendo che sia questo che intendi
Stephen Lead

Risposte:


11

Innanzitutto, ecco un esempio di API JavaScript semplificata per mostrare il concetto di utilizzo di DeferredList per elaborare più attività di identificazione:

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

Quindi ecco un esempio in jsFiddle che penso faccia quello che vuoi, corre usando tutti i livelli visibili in tutti i livelli di mappe dinamiche visibili nella mappa.

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

Tutti i refusi sono ora corretti :)

L'idea di base è che ogni volta che si fa clic sulla mappa o si attiva la visibilità, l'identificazione viene rieseguita. Quando viene eseguita l'identificazione, il numero di attività di identità attivate dipende dal numero di livelli visibili e attende che tutti i livelli tornino per visualizzare i risultati.


questo ha molto senso - grazie mille per aver pubblicato il codice di esempio
Stephen Lead,

2
Ci sono un paio di piccoli errori di battitura nel tuo codice, il che è in realtà più impressionante in quanto implica che hai digitato questo dalla memoria e non è nemmeno necessario eseguirlo. Tanto di cappello a te!
Stephen Lead,

Sì, l'ho appena scritto dalla parte superiore della mia testa :) Fammi sapere quali sono i refusi minori e li risolverò.
blord-castillo,

Modificato in una versione funzionante in jsFiddle. La versione non è perfettamente efficiente; idealmente salverei i risultati della mia query e rifarei la sezione showResults quando la visibilità è attivata dal punto di identificazione non viene modificato. Ma penso che mostri bene il concetto di come collegare la visibilità alternando i compiti identificati eseguiti. Inoltre, vorrai archiviare un modello con ogni livello in modo da poter semplicemente estrarre i modelli dai livelli, anziché utilizzare la logica all'interno delle funzioni javascript come ho fatto io.
blord-castillo,

4

L'attività di identificazione può fare riferimento solo a un servizio di mappe, quindi dovrai:

  • Metti tutti i livelli su cui desideri eseguire Identity in un servizio di mappe
  • Esegui più IdentifyTasks per clic sulla mappa

Mi sono imbattuto in situazioni simili con un'app in cui volevo essere in grado di identificarmi su un servizio di mappa DEM e su un servizio di mappa dei risultati di aumento del livello del mare da un'attività di geoprocessing. Ho scelto di eseguire due IdentifyTask. L'unica cosa che devi davvero aggiungere è capire quando entrambe le attività sono state completate.

Il flusso di base è (questo stava usando Silverlight / C #)

  • imposta variabili booleane per DEM e SLR identificativo Completo
  • Eseguire IdentifyTask per DEM
  • imposta bool per DEMidentifyTaskComplete su false
  • Esegui IdentifyTask per SLR (usando gli stessi parametri generali di DEM)
  • imposta bool per SLRidentifyTaskComplete su false
  • Nel listener di eventi DEMIdentifyTask_ExecuteCompleted, ho impostato DEMidentifyTaskcomplete su true e quindi ho verificato se SLRidentifyTaskcomplete è true (imposta il contrario per SLRIdentifyTask_ExecuteCompleted)
  • Qualunque attività sia terminata per ultima, entrambi i bool saranno veri e chiamerà IdentifyTasksComplete che analizza entrambi i risultati in un oggetto grafico personalizzato che aggiungo alla mappa, quindi imposta slr e demidentiftytaskcomplete su false

grazie - è quello che temevo, ma è bello sapere che l'hai trovato fattibile. Se questo sito è disponibile, per favore fatemi sapere l'URL?
Stephen Lead,

Non è pubblico ed è in Silverlight inoltre. In bocca al lupo!
Wwnick,

+1 per più attività di identificazione. Per l'API JavaScript, puoi gestirli con dojo.DeferredList (vale anche per più queryTask).
Derek Swingley,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.