Использование задач геообработки в веб-приложениях

Интерфейсы API веб-картографии ArcGIS

Среда для веб-приложений ГИС поможет познакомиться в общих чертах с веб-приложениями на основе ГИС. Веб-интерфейсы API ArcGIS позволяют веб-браузерам взаимодействовать с сервисами ГИС ArcGIS for Server и отрисовывать (отображать) географические данные, а также выполнять анализ. Веб-интерфейсы API в ArcGIS имеет три разновидности. Это следующие приложения:

Три интерфейса API имеют одинаковые функциональные возможности, но предназначены для работы с разными языками разработки. Чтобы начать разработку веб-приложений на основе Flex или Silverlight, необходимо загрузить библиотеки с сайта ArcGIS for Developers. Для веб-интерфейсов API JavaScript нет необходимости загружать библиотеку, так как эта библиотека доступна через URL-адрес. Сайт ArcGIS for Developers предоставляет примеры кодов, руководства пользователей, учебные пособия и подробные справочные материалы по веб-интерфейсам ArcGIS API.

Задачи геообработки в веб-приложениях

Можно добавить функциональные возможности геообработки и анализа данных в веб-приложения с помощью сервисов геообработки ArcGIS. Каждый сервис геообработки содержит одну или несколько задач геообработки. Если просмотреть Services Directory для сервера ArcGIS, то можно найти сервисы геообработки, задачи внутри сервиса и соответствующие параметры и свойства каждой задачи. В разделе Сервисы геообработки REST приведены сведения об иерархии ресурсов REST, а в разделе Введение в задачи геообработки предоставлены дополнительные сведения о задачах геообработки, их параметрах и способах доступа к ним. Веб-интерфейс API предоставляют удобные объекты и методы для доступа к задачам геообработки и выполнения надлежащих функций.

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

  1. Инициализируйте задачу геообработки.
  2. Задайте параметры для задачи.
  3. Выполните задачу.
  4. Отобразите результаты.

Эти четыре действия позволяют приложению взаимодействовать с сервером, успешно выполнять задачу и визуализировать результаты в приложении в соответствии с потребностями. В следующем разделе показано, как реализовать эти четыре действия, чтобы добавить функции геообработки с использованием веб-интерфейса ArcGIS API for JavaScript. Несмотря на отличия от других двух интерфейсов API по таким аспектам, как декларация объектов, синтаксис методов и обработка событий, этот процесс из четырех шагов применим ко всем веб-интерфейсам API, то есть является общим. Эти действия позволят лучше понять рекомендации по использованию задач геообработки в веб-приложениях.

Использование задач геообработки в приложениях JavaScript

Веб-интерфейс ArcGIS для JavaScript является одним из веб-интерфейсов API ArcGIS. Если вы раньше не работали с JavaScript API, будет полезно посетить сайт ArcGIS API for JavaScript. Сайт включает множество примеров кодов, вы также можете выполнить поиск примеров геообработки.

Оставшаяся часть этого раздела позволит вам выполнить упомянутые выше четыре шага, чтобы включить задачи геообработки в веб-приложения с использованием интерфейса ArcGIS JavaScript API.

Шаг 1: Инициализация задачи геообработки

Чтобы инициализировать задачу геообработки, необходимо знать URL-адрес задачи. Шаблон для геообработки URL-адреса задачи: http://<узел-arcgis>/<имя-сервиса-го>/GPServer/<имя-задачи-го>. Добавьте приведенный ниже код в приложение JavaScript, чтобы инициализировать задачу геообработки.

При инициализации обязательно задайте для свойства outSpatialReference экземпляра задачи геообработки значение, равное пространственной привязке карты. Наборы данных задач геообработки могут быть в другой пространственной привязке, поэтому их выходные данные также могут быть в другой пространственной привязке. Однако веб-приложения предполагают, что выходные данные задачи имеют ту же пространственную привязку, что и карта. Это может привести к неожиданному поведению при отображении выходных данных. Поэтому необходимо задать свойство выходной пространственной привязки для задачи геообработки. Сервер вернет выходные данные в пространственной привязке, указанной в свойстве outSpatialReference.

Инициализация задачи геообработки

// esri.tasks.gp is required for using Geoprocessor.
//  Add it along with other dojo.require statements.
dojo.require(esri.tasks.gp); 

/* Step 1: Initialize Geoprocessing Task as a global variable. 
    That is, declare the variable outside a function definition 
    since we will be using gpTask variable in other methods */
var gpTaskUrl="http://myserver/ArcGIS/rest/services/" +
                   "BufferPoints/GPServer/BufferPoints";
var gpTask = new esri.tasks.Geoprocessor(gpTaskUrl);	

// Set output spatial reference property to map's spatial reference.
//   myMap is assumed to be an instance of map container esri.map.
gpTask.outSpatialReference=myMap.spatialReference;

Шаг 2: Установка параметров задачи

При выполнении задачи геообработки веб-приложение должно предоставить значения параметров для задачи геообработки. Чтобы узнать требования к параметрам задачи, скопируйте и вставьте URL-адрес задачи в адресную строку веб-браузера, чтобы открыть страницу задач в каталоге сервисов. На странице Задача (Task) содержатся все параметры задачи и их типы данных. Страница задач также содержит URL-адрес справки, где можно найти дополнительные сведения о функциях геообработки, доступе и использованию.

Дополнительные сведения о свойствах параметров задач

Для успешного выполнения задачи необходимо указать значения для всех требуемых входных параметров (esriGPParameterTypeRequired) задачи, как описано на странице Задача. Как правило, значения задачи берутся из одного или нескольких приведенных ниже источников:

  • значения, введенные пользователем с помощью веб-приложения;
  • значения с одного из текущих слоев объектов веб-карты или графических слоев;
  • результаты других задач, например задач запросов, прокладки маршрутов и т. д.;
  • результаты других задач геообработки.

В приведенном ниже коде JavaScript показан пример создания входных объектов, параметр GPFeatureRecordsetLayer из FeatureLayer, добавленного на веб-карту, и создание buffDistance, параметр GPLinearUnit, производный из входного текста dojo с id="distance". Предполагается, что пользователь интерактивно вводит значение расстояния. После создания параметров задачи создается конструкция JSON с парами параметров имя-значение и отправляется на сервер.

Параметры настройки

//Step 2: Setup Parameters of the task
function setupParameters(){
   /* The code below assumes that the web map 
     has a featurelayer with id fLayer. */

   // Get Input Parameter 1 : GPFeatureRecordSetLayer from fLayer.
   var inputFeatures = new esri.tasks.FeatureSet();			    
   inputFeatures.features = map.getLayer("fLayer").graphics;
   inputFeatures.fields=map.getLayer("fLayer").fields;

   // Get Input Parameter 2 : GPLinearunit from a dojo UI element
   var buffDistance = new esri.tasks.LinearUnit();
   buffDistance.distance=dojo.byId(distance).value;
   buffDistance.units=esriMiles;

   // Create Parameter list with name-value pairs.
   // Names must match the parameter name in Task page.
   // Parameters must be in the same-order as in Task page.
   var params= {"Input_Features":inputFeatures, 
              "Distance":buffDistance};

   // Return name-value pairs of parameters
   return params;
}
ПримечаниеПримечание:

Параметры GPFeatureRecordSetLayer и GPRecordSetLayer имеют схему по умолчанию, определенную задачей. Схему для параметров можно найти на странице Задача. Схема GPFeatureRecordSetLayer состоит из геометрии, пространственной привязки, полей и объектов. Рекомендуется удостовериться в наличии у параметров GPFeatureRecordSetLayer всех свойств в соответствии с определением в схеме, что приведет к получению надлежащих результатов.

Шаг 3: Запуск задачи

Чтобы выполнить задачу, необходимо использовать метод execute или submitJob экземпляра геообработки (gpTask) на основе поддерживаемой операции задачи геообработки. Можно найти поддерживаемую операцию задачи на панели Задача. В разделах Операция задачи: execute и Операция задачи: submitJob объясняются различия между операциями и клиент-серверным взаимодействием при выполнении операции.

Операция задачи: execute

Если поддерживаемая операция по задаче является задачей выполнения, необходимо использовать метод execute экземпляра геообработки и передать нужные параметры. Необходимо определить обработчики событий, которые позволят определить успешные и сбойные запросы в приложении. Событие onExecuteComplete будет создано при успешном выполнении задачи и возврате результата и сообщений геообработки. Событие onError создается при сбое выполнения задачи. Если задача завершается со сбоем, сервер возвращает ошибочный экземпляр с кодом ошибки HTML и сообщениями геообработки, если таковые имеются.

Операция задачи: execute

function myGPExecuteTask(){
 // Get params from setupParameters method described above.
 var params=setupParameters();

 // Setup onTaskSuccess and onTaskFailure event handlers.
 dojo.connect(gpTask, "onExecuteComplete",onTaskSuccess);
 dojo.connect(gpTask, "onError",onTaskFailure);

 // Execute gpTask with params
 gpTask.execute(params);
}

// Callback when the Task operation succeeded
function onTaskSuccess(results, messages) {
  // Do something with the results...
  // More info on rendering the results in section below    
}

// Handler that is invoked when the Task operation has failed
function onTaskFailure(error) {
  // Report error 
  alert("Error:"+ error); 
}

Операция задачи: submitJob

Если поддерживаемая операция по задаче является операцией submitJob, необходимо использовать метод Geoprocessor.submitJob и передать нужные параметры. В случае использования submitJob возникают три события, которые должны быть обработаны соответствующим образом в веб-приложении.

onStatusUpdate

При получении текущего статуса задания

onJobComplete

При успешном завершении задания

onError

При сбое задания

  • onStatusUpdate: В отличие от execute, при операции submitJobсервер создает задание и назначает jobId. Операции submitJob не извещают клиента о завершении задания, поэтому клиент сам должен обращаться к сервису, чтобы определить его статус. По умолчанию веб-приложения отправляют запросы о статусе на сервер ежесекундно, чтобы определить статус задачи. Каждый раз при получении ответа о статусе, возникает событие onStatusUpdate. При необходимости можно увеличить или уменьшить интервал проверки статуса с помощью метода Geoprocessor.setUpdateDelay. Событие onStatusUpdate возникает при каждой проверке состояния задания. Обработчик события получает экземпляр JobInfo, содержащий идентификатор задания, состояние задания и любые сообщения GPMessages, возвращенные сервером. Эту информацию можно использовать для отслеживания хода выполнения задачи.
  • onJobComplete: Когда выполнено JobInfo.jobStatus = STATUS_SUCCEEDED, возникает событие onJobComplete. Результаты не возвращаются автоматически клиенту после завершения операции; вместо этого они сохраняются на сервере, после чего клиент должен отправить запрос для получения этих результатов. В обработчике событий onJobComplete можно вызвать метод Geoprocessor.getResultData и получить результаты. Каждый выходной параметр является независимым ресурсом, а метод getResultData экземпляра геообработки должен быть вызван для каждого выходного параметра задачи. В методе getResultData необходимо предоставить идентификатор jobId, возвращенный обработчиком ошибок, а также имя выходного параметра. Необходимо также создать обработчик событий для события onGetResultDataComplete. Событие onGetResultDataComplete возникает, если значение результата выходного параметра получено веб-приложением.
  • onError: Событие onError возникает при истечении запроса (в т. ч. статуса) операции submitJob или при сбое задач геообработки. Событие вернет ошибочный экземпляр с указанием кода ошибок HTML.
Дополнительные сведения о заданиях, идентификаторах заданий, статусах заданий и взаимодействии клиент-сервер в операциях submitJob можно найти в разделе Операция задачи: submitJob. В приведенном ниже коде показано, как можно отправить задание на сервер и обработать события.

Операция задачи: submitJob

function myGPSubmitJob(){
 // Get params from setupParameters method described above.
 var params=setupParameters();

 // Setup event handlers.
 dojo.connect(gpTask, "onJobComplete",onTaskComplete);
 dojo.connect(gpTask, "onError",onTaskFailure);
 dojo.connect(gpTask, "onStatusUpdate",onTaskStatus);
 gpTask.submitJob(params);
}

// Event handler for onJobComplete event
function onTaskComplete(jobInfo) {
    /* Get the value of an output parameter Buffer_polygons
      using getResultData. The name of the output
      may vary in your gpTask*/      
    dojo.connect(gpTask, "onGetResultDataComplete",
                      onTaskResultComplete);
    gpTask.getResultData(jobInfo.jobId, 
                          "Buffer_polygons");
}

// Event handler for onStatusUpdate event
function onTaskStatus(jobInfo) {
     //write status to console to help debugging
    console.log(jobInfo.jobStatus);
}

// Event handler for onError event
function onTaskFailure(error) {
  // Report error 
  alert("Error:"+ error); 
}

Шаг 4: Отображение результата

Результаты задачи геообработки отображаются на основе типа данных выходного параметра.

GPFeatureRecordSetLayer

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

GPRecordSet

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

GPRasterDataLayer

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

Дополнительные сведения о результирующем картографическом сервисе и использовании результирующего картографического сервиса в веб-приложениях

GPDataFile

Выходные файлы можно загружать, кроме того, такие файлы, как .gpx и .csv могут быть обработаны веб-приложением.

GPBoolean, GPDataFile, GPLong, GPDouble, GPString, GPLinearUnit, GPDate

Выходные данные отображаются с помощью HTML или других виджетов.

Результаты из обработчика событий onExecuteComplete

В случае операции execute событие onExecuteComplete возвращает результаты и сообщения задачи геообработки. Экземпляром результатов является массив всех выходных параметров задачи, а записи в массиве всегда упорядочены, как показано на странице Задача. Поэтому значения параметров могут быть идентифицированы по их позиции в массиве. Каждый выходной параметр в массиве имеет имя параметра, типа данных и значение. В приведенном ниже коде показано, как получить доступ к первому выходному параметру в результатах. В приведенном ниже коде выходным параметром является GPFeatureRecordSetLayer, поэтому код показывает, как отобразить его в качестве графического слоя и добавить в веб-приложение.

Отображение результатов из обработчика событий onExecuteComplete

function onTaskSuccess(results, messages) {
    /* Retrieve the output parameter value based 
      on its position from the result instance.
      In the case shown below, the output is the first output 
      parameter of the task and it
      is a GPFeatureRecordSetLayer.*/
    var featureset = results[0].value;
   
    // Create a graphics layer with features
    var taskResultLayer= new esri.layers.GraphicsLayer
              ({id:"MyGPExecuteResultLayer"});
    
    // Create a symbol based on the geometry. 
    // The geometry is assumed to be polygons in the code below
    var simplePolySymbol = new esri.symbol.SimpleFillSymbol();
    simplePolySymbol.setOutline(new esri.symbol.SimpleLineSymbol(
                  esri.symbol.SimpleLineSymbol.STYLE_SOLID,
                  new dojo.Color([0,0,0,0.5]), 1));
    simplePolySymbol.setColor(new dojo.Color([255,0,0,0.7]));
    
    // Create graphics from features and add it graphicslayer 
    dojo.forEach(featureset.features,function(feature){
             feature.setSymbol(simplePolySymbol);
             //Add feature to the graphics layer
             taskResultLayer.add(feature);});
    }
    // Add graphicslayer to webmap 
    //  myMap is assumed to be an instance of map container esri.map
    myMap.addLayer(taskResultLayer)
}

Результаты из обработчика событий onGetResultDataComplete

Событие onGetResultDataComplete создает экземпляр результатов. В отличие от результатов из события onExecuteComplete экземпляр результатов будет содержать значения только для запрошенного параметра. Результат параметра будет содержать имя, тип данных и значение запрошенного параметра. Значение параметра извлекается из результата и используется по необходимости. В приведенном ниже коде показано отображение результатов параметра GPFeatureRecordSetLayer из экземпляра результатов параметров.

Результаты из обработчика событий onGetResultDataComplete

function onTaskResultComplete(paramResult) {
   // Retrieve the value of the parameter from the paramresult
   var featureSet = paramResult.value;

   // Create a graphics layer with features
   var taskResultLayer= new esri.layers.GraphicsLayer
              ({id:"MyGPSubmitJobResultLayer"});
    
   // Create a symbol based on the geometry. 
   // The geometry is assumed to be polygons in the code below
   var simplePolySymbol = new esri.symbol.SimpleFillSymbol();
   simplePolySymbol.setOutline(new esri.symbol.SimpleLineSymbol(
                  esri.symbol.SimpleLineSymbol.STYLE_SOLID,
                  new dojo.Color([0,0,0,0.5]), 1));
   simplePolySymbol.setColor(new dojo.Color([255,0,0,0.7]));
    
   // Create graphics from features and add it graphicslayer 
   dojo.forEach(featureset.features,function(feature){
             feature.setSymbol(simplePolySymbol);
             //Add feature to the graphics layer
             taskResultLayer.add(feature);});
   }
   // Add graphicslayer to webmap 
   //   myMap is assumed to be an instance of map container esri.map.
   myMap.addLayer(taskResultLayer)
}

Интерфейсы API Flex и Silverlight

Четыре описанных выше действия для приложений JavaScript применимы также к интерфейсам API Flex и Silverlight. Примеры кодов для использования задач геообработки в Flex API и Silverlight API можно найти в соответствующих пакетах SDK.

5/16/2014