Идентифицировать слои из нескольких экземпляров ArcGIS Server, используя ArcGIS API для JavaScript 2?

14

Это относится к ArcGIS Server 9.3 с JavaScript API 2.4.

Моя цель - щелкнуть карту и запустить задачу «Идентифицировать» на всех видимых динамических слоях.

Для IdentifyTask требуется URL-адрес для конечной точки REST, где IdentifyParameters указывает, на каких layerIds должна выполняться операция идентификации.

Похоже, что инструмент «Идентифицировать» ожидает, что все слои будут доступны с одной и той же конечной точки REST (то есть с одного и того же ArcGIS Server).

В моем случае слои обслуживаются из нескольких экземпляров ArcGIS Server - как может инструмент «Идентифицировать» поддерживать это? Например, если слои «Здания» и «Участки» на этой карте исходили из отдельных Серверов ArcGIS.

(Это связано с моим предыдущим вопросом , но теперь я понимаю, что сначала мне нужно ответить на этот вопрос)

Стивен Лид
источник
Были ли обновления этих концепций? Я использовал образец скрипки, упомянутый выше. Спасибо
фаза
@ phase, насколько я знаю, с ArcGIS Server 10 и JS API 2.6 концепции все те же, если вы это имеете в виду
Стивен Лид,

Ответы:

11

Во-первых, вот упрощенный пример JavaScript API, демонстрирующий концепцию использования 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/

Все опечатки теперь исправлены :)

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

blord-Castillo
источник
это имеет большой смысл - большое спасибо за публикацию примера кода
Стивен Лид
2
В вашем коде есть несколько крошечных опечаток, что на самом деле более впечатляюще, поскольку подразумевает, что вы набрали это из памяти и даже не нуждались в его запуске. Снимаю перед вами шляпу!
Стивен Лид
Да, я просто набрал это на макушке головы :) Дайте мне знать, что это за мелкие опечатки, и я их исправлю.
blord-castillo
Поменял на рабочую версию в jsFiddle. Версия не совсем эффективна; в идеале я бы сохранял результаты своего запроса и просто переделывал раздел showResults, когда видимость переключается точкой идентификации, не изменяется. Но я думаю, что это хорошо показывает концепцию того, как связать переключение видимости с выполненными задачами идентификации. Кроме того, вы хотите сохранить шаблон с каждым слоем, чтобы вы могли просто извлекать шаблоны из слоев, а не использовать логику внутри функций javascript, как я.
blord-castillo
4

Задача идентификации может ссылаться только на один картографический сервис, поэтому вам придется либо:

  • Поместите все слои, на которых вы хотите запустить Identity, в один картографический сервис.
  • Выполнить несколько IdentifyTasks за клик карты

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

Основной поток (это было с использованием Silverlight / C #)

  • установить булевы переменные для матрицы высот и зеркал
  • Запустите IdentifyTask для DEM
  • установите bool для DEMidentifyTaskComplete в false
  • Запустите IdentifyTask для SLR (используя те же общие параметры, что и для матрицы высот)
  • установить bool для SLRidentifyTaskComplete в false
  • В прослушивателе событий DEMIdentifyTask_ExecuteCompleted я устанавливаю для DEMidentifyTaskcomplete значение true, а затем проверяю, является ли SLRidentifyTaskcomplete истинным (установите противоположное для SLRIdentifyTask_ExecuteCompleted)
  • Какая бы задача не выполнялась последней, оба bool будут иметь значение true и вызывают IdentifyTasksComplete, который анализирует оба результата в настраиваемом графическом объекте, который я добавляю на карту, затем устанавливаю для slr и demidentiftytaskcomplete значение false
wwnick
источник
спасибо - это то, чего я боялся, но приятно слышать, что ты нашел это работоспособным. Если этот сайт доступен, пожалуйста, дайте мне знать URL?
Стивен Лид
Это не публично, и, кроме того, в Silverlight. Удачи!
wwnick
+1 для нескольких задач. Для JavaScript API вы можете управлять ими с помощью dojo.DeferredList (также относится к нескольким запросам).
Дерек Суингли
1

Я воссоздал этот самый сценарий с отложенным списком, но сложная часть определяла только слои, которые находятся в масштабе. Это для версии 3.2 jsapi http://www.spatialexception.org/posts/arcgis-javascript-identifytask-returns-scale-dependent-layers

шикарн-о
источник
@awesomo, есть ли шанс увидеть прямую ссылку на это решение?
Рипсин
Там приведен я определить значок в правом верхнем углу на панели инструментов mapserver2.vestra.com/demo/smile
шикарн-о