Identifizieren von Layern aus mehreren ArcGIS Server-Instanzen mithilfe der ArcGIS-API für JavaScript 2?

14

Dies gilt für ArcGIS Server 9.3 mit der JavaScript-API 2.4.

Mein Ziel ist es, auf die Karte zu klicken und die Aufgabe "Identifizieren" auf allen sichtbaren dynamischen Ebenen auszuführen.

IdentifyTask erfordert eine URL zum REST-Endpunkt, wobei IdentifyParameters angibt, für welche Layer-IDs der Identifizierungsvorgang ausgeführt werden soll.

Das Werkzeug "Identifizieren" erwartet anscheinend, dass alle Layer vom selben REST-Endpunkt (dh vom selben ArcGIS-Server) aus zugänglich sind.

In meinem Fall werden Layer von mehreren ArcGIS Server-Instanzen bereitgestellt. Wie kann das Tool "Identifizieren" dies unterstützen? Wenn beispielsweise die Layer "Buildings" und "Parcels" in dieser Karte von unterschiedlichen ArcGIS-Servern stammen.

(Dies hängt mit meiner vorherigen Frage zusammen , aber mir ist klar, dass ich diese Frage jetzt zuerst beantworten muss.)

Stephen Blei
quelle
Wurden diese Konzepte aktualisiert? Ich habe das oben genannte Geigenbeispiel verwendet. Danke
Phase
@phase Soweit ich weiß, sind die Konzepte unter Verwendung von ArcGIS Server 10 und JS API 2.6 immer noch dieselben, vorausgesetzt, Sie meinen das
Stephen Lead

Antworten:

11

Hier ist zunächst ein vereinfachtes JavaScript-API-Beispiel, um das Konzept der Verwendung von DeferredList zur Verarbeitung mehrerer Identifizierungsaufgaben zu veranschaulichen:

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

Dann ist hier ein Beispiel in jsFiddle, von dem ich denke, dass es das tut, was Sie wollen, und das unter Verwendung aller sichtbaren Ebenen in allen sichtbaren dynamischen Kartenebenen in der Karte ausgeführt wird.

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

Alle Tippfehler sind jetzt behoben :)

Die Grundidee ist, dass jedes Mal, wenn auf die Karte geklickt oder die Sichtbarkeit umgeschaltet wird, die Identifizierung erneut ausgeführt wird. Wenn die Identifizierung ausgeführt wird, hängt die Anzahl der ausgelösten Identitätsaufgaben von der Anzahl der sichtbaren Ebenen ab und es wird gewartet, bis alle Ebenen zurückkehren, um die Ergebnisse anzuzeigen.

Blord-Castillo
quelle
das macht sehr viel Sinn - vielen Dank für das Posten des Beispielcodes
Stephen Lead
2
Es gibt ein paar winzige Tippfehler in Ihrem Code - was tatsächlich beeindruckender ist, da dies impliziert, dass Sie dies aus dem Speicher eingegeben haben und es nicht einmal ausführen mussten. Hut ab für Dich!
Stephen Lead
Ja, ich habe das nur über den Kopf geschrieben :) Lass mich wissen, was die kleinen Tippfehler sind und ich werde sie beheben.
Blord-Castillo
Geändert zu einer funktionierenden Version in jsFiddle. Die Version ist nicht perfekt effizient; Idealerweise würde ich meine Abfrageergebnisse speichern und nur den Abschnitt showResults wiederholen, wenn die Sichtbarkeit umgeschaltet wird, indem der Identifizierungspunkt nicht geändert wird. Aber ich denke, es zeigt das Konzept gut, wie die Sichtbarkeitsumschaltung mit den ausgeführten Identifizierungsaufgaben verknüpft werden kann. Außerdem möchten Sie eine Vorlage mit jeder Ebene speichern, damit Sie die Vorlagen einfach von den Ebenen abziehen können, anstatt in den Javascript-Funktionen Logik zu verwenden, wie ich es getan habe.
Blord-Castillo
4

Die Identifizierungsaufgabe kann nur auf einen Karten-Service verweisen, daher müssen Sie entweder:

  • Fügen Sie alle Ebenen, auf denen Identity ausgeführt werden soll, in einen Karten-Service ein
  • Führen Sie pro Map-Klick mehrere IdentifyTasks aus

Mit einer App, mit der ich mich auf einem DEM-Karten-Service und auf einem Karten-Service mit Ergebnissen für den Anstieg des Meeresspiegels aus einer Geoverarbeitungsaufgabe identifizieren wollte, bin ich auf ähnliche Situationen gestoßen. Ich habe zwei IdentifyTasks ausgeführt. Das einzige, was Sie wirklich hinzufügen müssen, ist herauszufinden, wann beide Aufgaben erledigt sind.

Der grundlegende Ablauf ist (dies war mit Silverlight / C #)

  • Boolesche Variablen für DEM und SLR einrichten identityTaskcomplete
  • Führen Sie IdentifyTask für DEM aus
  • setze bool für DEMidentifyTaskComplete auf false
  • Führen Sie IdentifyTask for SLR aus (mit denselben allgemeinen Parametern wie für DEM).
  • setze bool für SLRidentifyTaskComplete auf false
  • Im DEMIdentifyTask_ExecuteCompleted-Ereignis-Listener setze ich DEMidentifyTaskcomplete auf true und überprüfe dann, ob SLRidentifyTaskcomplete true ist (Richten Sie das Gegenteil für SLRIdentifyTask_ExecuteCompleted ein).
  • Unabhängig davon, welche Aufgabe zuletzt erledigt wurde, sind beide Bools wahr und rufen IdentifyTasksComplete auf, das beide Ergebnisse in ein benutzerdefiniertes Grafikobjekt zerlegt, das ich der Karte hinzufüge, und dann slr und demidentiftytaskcomplete auf false setzt
wwnick
quelle
danke - das habe ich befürchtet, aber es ist gut zu hören, dass du es für praktikabel befunden hast. Wenn diese Seite verfügbar ist, können Sie mir bitte die URL mitteilen?
Stephen Lead
Es ist nicht öffentlich und befindet sich außerdem in Silverlight. Viel Glück!
Wwnick
+1 für mehrere Identifizierungsaufgaben. Für die JavaScript-API können Sie sie mit dojo.DeferredList verwalten (gilt auch für mehrere queryTasks).
Derek Swingley