Визначення шарів з декількох екземплярів сервера ArcGIS за допомогою ArcGIS API для JavaScript 2?


14

Це стосується ArcGIS Server 9.3 з JavaScript API 2.4.

Моя мета - натиснути на карту і виконати завдання Ідентифікувати за допомогою всіх видимих ​​шарів Динаміки.

IdentifyTask вимагає URL-адреси до кінцевої точки REST, з IdentifyParameters, що вказує, на якому шаріId операції ідентифікації слід виконувати.

Здається, інструмент Identify очікує, що всі шари будуть доступні з тієї ж кінцевої точки REST (тобто того ж сервера ArcGIS).

У моєму випадку шари подаються з декількох екземплярів сервера ArcGIS - як інструмент Ідентифікація може це підтримувати? Наприклад, якщо шари Будівлі та посилки на цій карті надходили від окремих серверів ArcGIS.

(Це пов’язано з моїм попереднім питанням , але я розумію, що зараз мені потрібно відповісти на це питання)


Чи були якісь оновлення цих понять? Я використовував скрипковий зразок, на який згадувалося вище. Дякую
фаза

@phase, наскільки я знаю, поняття все ще однакові за допомогою ArcGIS Server 10 та JS API 2.6, припускаючи, що це ви маєте на увазі
Stephen Lead

Відповіді:


11

По-перше, ось спрощений приклад API JavaScript, щоб показати концепцію використання DeferredList для обробки декількох завдань ідентифікації:

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

Тоді ось приклад у jsFiddle, який я думаю, що робить те, що ви хочете, працює з використанням усіх видимих ​​шарів у всіх видимих ​​шарах динамічної карти на карті.

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

Усі друкарські помилки виправлені зараз :)

Основна ідея полягає в тому, що кожного разу, коли клацнути карту або змінюється видимість, ідентифікація повторюється. Коли запускається ідентифікація, кількість запущених завдань ідентичності залежить від кількості видимих ​​шарів, і він чекає, поки всі шари повернуться до відображення результатів.


що має багато сенсу - велике спасибі за розміщення зразкового коду
Стівен Лід

2
У вашому коді є кілька крихітних помилок - що насправді більш вражає, оскільки це означає, що ви набрали це з пам'яті і навіть не потрібно було її виконувати. Шапки з тобою!
Стівен Ведучий

Так, я просто набрав це у верхній частині голови :) Дайте мені знати, що таке другорядні друкарські помилки, і я виправлю їх.
blord-castillo

Змінено на робочу версію в jsFiddle. Версія не є абсолютно ефективною; в ідеалі я б зберігав результати запитів і просто переробляв розділ showResults, коли видимість не змінюється ідентифікаційною точкою не змінюється. Але я думаю, що це добре показує концепцію того, як пов’язати перемикання видимості разом із визначеними завданнями. Крім того, ви хочете зберігати шаблон з кожним шаром, щоб ви могли просто витягнути шаблони з шарів, а не використовувати логіку всередині функцій javascript, як я.
blord-castillo

4

Завдання ідентифікації може посилатися лише на одну службу карти, тому вам доведеться виконати будь-яку:

  • Покладіть всі шари, на яких потрібно запустити Identity, в одній службі карт
  • Виконайте кілька ідентифікаційних завдань за один клік карти

Я зіткнувся з подібними ситуаціями з додатком, коли я хотів мати можливість ідентифікувати на сервісі DEM-карти та на рівні моря результат картографічного сервісу із завданням геообробки. Я вирішив запустити два IdentifyTasks. Єдине, що вам дійсно потрібно додати - це з'ясувати, коли обидва завдання виконані.

Основний потік є (для цього використовувався Silverlight / C #)

  • встановлення булевих змінних для DEM і SLR identiTaskcomplete
  • Запустіть IdentifyTask для DEM
  • встановити bool для DEMidentifyTaskComplete на false
  • Запустіть IdentifyTask для дзеркального дзеркала (використовуючи ті ж загальні параметри, що і для DEM)
  • встановіть bool для SLRidentifyTaskComplete на false
  • У слухачі подій DEMIdentifyTask_ExecuteCompleted я встановлюю значення DEMidentifyTaskcomplete на істинне, а потім перевіряю, чи справжнє значення SLRidentifyTaskcomplete (встановіть навпаки для SLRIdentifyTask_ExecuteCompleted)
  • Незалежно від того, яка задача закінчилася останньою, обидва булі будуть істинними, і викликає IdentifyTasksComplete, який аналізує обидва результати на користувацький графічний об'єкт, який я додаю до карти, а потім встановлює slr та demidentiftytaskcomplete в false

спасибі - це те, чого я побоювався, але добре чути, що ви вважаєте це працездатним. Якщо цей веб-сайт доступний, чи можете ви мені повідомити URL-адресу?
Стівен Ведучий

Це не публічно, а крім того, є у Silverlight. Удачі!
wwnick

+1 для декількох завдань ідентифікації. Для API JavaScript ви можете керувати ними за допомогою dojo.DeferredList (також стосується кількох queryTasks).
Дерек Свінглі

1

Я відтворив цей самий сценарій із відкладеним списком, але хитра частина полягала лише у виявленні шарів, що мають масштаб. Це для версії 3.2 jsapi http://www.spatialexception.org/posts/arcgis-javascript-identifytask-returns-scale-dependent-layers


@awesomo, будь-який шанс побачити пряме посилання на це рішення?
рипсин

Там наведено я визначити значок в правому верхньому куті на панелі інструментів mapserver2.vestra.com/demo/smile
шикарний-о
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.