Czy identyfikujesz warstwy z wielu instancji ArcGIS Server za pomocą ArcGIS API for JavaScript 2?

14

Dotyczy to ArcGIS Server 9.3 z JavaScript API 2.4.

Moim celem jest kliknięcie mapy i uruchomienie zadania Identyfikacja na wszystkich widocznych warstwach dynamicznych.

IdentifyTask wymaga adresu URL do punktu końcowego REST, przy czym IdentifyParameters określa, na których warstwach identyfikator powinien zostać wykonany.

Wygląda na to, że narzędzie Identify oczekuje, że wszystkie warstwy będą dostępne z tego samego punktu końcowego REST (tj. Z tego samego ArcGIS Server).

W moim przypadku warstwy są obsługiwane z wielu instancji ArcGIS Server - w jaki sposób narzędzie Identify może to obsługiwać? Na przykład, jeśli warstwy budynków i działek na tej mapie pochodzą z oddzielnych serwerów ArcGIS.

(Jest to związane z moim poprzednim pytaniem , ale zdaję sobie sprawę, że muszę najpierw odpowiedzieć na to pytanie)

Stephen Lead
źródło
Czy były jakieś aktualizacje tych pojęć? Korzystałem z próbki skrzypiec, o której mowa powyżej. Dzięki
faza
@ fazę, o ile wiem, koncepcje są nadal takie same przy użyciu ArcGIS Server 10 i JS API 2.6, zakładając, że o to ci chodzi
Stephen Lead

Odpowiedzi:

11

Po pierwsze, oto uproszczony przykład interfejsu API JavaScript, który pokazuje koncepcję użycia DeferredList do przetwarzania wielu zadań związanych z identyfikacją:

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

Oto przykład w jsFiddle, który moim zdaniem robi to, co chcesz, działa przy użyciu wszystkich widocznych warstw na wszystkich widocznych dynamicznych warstwach mapy na mapie.

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

Wszystkie literówki są teraz naprawione :)

Podstawową ideą jest to, że za każdym razem, gdy klikana jest mapa lub zmieniana jest widoczność, identyfikacja jest uruchamiana ponownie. Po uruchomieniu identyfikacji liczba uruchomionych zadań związanych z tożsamością zależy od liczby widocznych warstw i czeka na powrót wszystkich warstw do wyświetlenia wyników.

blord-castillo
źródło
ma to sens - dziękuję bardzo za opublikowanie przykładowego kodu
Stephen Lead
2
W kodzie znajduje się kilka drobnych literówek - co jest w rzeczywistości bardziej imponujące, ponieważ oznacza, że ​​wpisałeś to z pamięci i nawet nie musiałeś go uruchamiać. Czapki z głów dla ciebie!
Stephen Lead
Tak, właśnie napisałem to z głowy :) Daj mi znać, jakie są drobne literówki i naprawię je.
blord-castillo
Zmieniono na działającą wersję w jsFiddle. Wersja nie jest idealnie wydajna; idealnie zapisałbym wyniki zapytania i po prostu ponowiłam sekcję showResults, gdy widoczność jest przełączana przez punkt identyfikacyjny, nie ulega zmianie. Ale myślę, że dobrze pokazuje koncepcję tego, jak powiązać przełączanie widoczności z identyfikacją wykonanych zadań. Ponadto chciałbyś przechowywać szablon z każdą warstwą, abyś mógł po prostu ściągać szablony z warstw, zamiast używać logiki wewnątrz funkcji javascript, tak jak ja.
blord-castillo
4

Zadanie identyfikacji może odwoływać się tylko do jednej usługi mapy, więc będziesz musiał:

  • Umieść wszystkie warstwy, na których chcesz uruchomić Tożsamość, w jednej usłudze map
  • Uruchom wiele IdentifyTasks na kliknięcie mapy

Natrafiłem na podobne sytuacje z aplikacją, w której chciałem być w stanie zidentyfikować się w usłudze mapowania DEM oraz w usłudze map wyników na poziomie morza z zadania geoprzetwarzania. Wybrałem uruchomienie dwóch IdentifyTasks. Jedyne, co naprawdę musisz dodać, to dowiedzieć się, kiedy oba zadania zostaną wykonane.

Podstawowy przepływ to (to było przy użyciu Silverlight / C #)

  • ustaw zmienne boolowskie dla DEM i SLR identTaskcomplete
  • Uruchom IdentifyTask dla DEM
  • ustaw bool dla DEMidentifyTaskComplete na false
  • Uruchom IdentifyTask dla lustrzanki (używając tych samych ogólnych parametrów jak dla DEM)
  • ustaw bool dla SLRidentifyTaskComplete na false
  • W detektorze zdarzeń DEMIdentifyTask_ExecuteCompleted ustawiam DEMidentifyTaskcomplete na true, a następnie sprawdzam, czy SLRidentifyTaskcomplete jest prawdziwy (ustaw przeciwnie dla SLRIdentifyTask_ExecuteCompleted)
  • Niezależnie od tego, które zadanie zakończyło się jako ostatnie, oba boole będą prawdziwe, i wywoła IdentifyTasksComplete, który analizuje oba wyniki w niestandardowy obiekt graficzny, który dodam do mapy, a następnie ustaw slr i demidentiftytaskcomplete na false
wwnick
źródło
dzięki - tego się obawiałem, ale dobrze jest usłyszeć, że uważasz, że to wykonalne. Jeśli ta strona jest dostępna, czy możesz podać adres URL?
Stephen Lead
To nie jest publiczne, a poza tym jest w Silverlight. Powodzenia!
wwnick
+1 za wiele zadań identyfikacji. W przypadku API JavaScript możesz nimi zarządzać za pomocą dojo.DeferredList (dotyczy także wielu zapytań).
Derek Swingley,