Skip To Content

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

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

Нет необходимости загружать библиотеку, так как она доступна через URL-адрес. ArcGIS API for JavaScriptДокументация содержит примеры кодов, руководства пользователей, учебные пособия и подробные справочные материалы.

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

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

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

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

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

Эти четыре действия позволяют приложению взаимодействовать с сервером, успешно выполнять задачу и визуализировать результаты в приложении в соответствии с потребностями.

Использование задач геообработки с помощью ArcGIS API for JavaScript

Выполнив эти четыре действия, вы легко добавите функционал геообработки посредством ArcGIS API for JavaScript.

Действие 1. Инициализируйте задачу геообработки

Чтобы инициализировать задачу геообработки, необходимо знать URL-адрес задачи. Шаблон URL-адреса задачи геообработки: http://<arcgis-host>/<gpservicename>/GPServer/<gptask-name>. Добавьте приведенный ниже код в приложение 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="https://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-адрес задачи в адресную строку веб-браузера, чтобы открыть страницу задач в каталоге сервисов. На странице Задача содержатся все параметры задачи и их типы данных. Страница задач также содержит 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) }