ArcGIS API for JavaScript permite que los navegadores web se comuniquen con servicios de ArcGIS Server, dibujen datos geográficos y realicen análisis.
No es necesario descargar la biblioteca, ya que se accede a ella mediante una URL web. La documentación de ArcGIS API for JavaScript proporciona muestras de código, tutoriales, guías y material de referencia detallado.
Tareas de geoprocesamiento en aplicaciones Web
Puede agregar la funcionalidad de geoprocesamiento y análisis de datos a aplicaciones web mediante servicios de geoprocesamiento. Cada servicio de geoprocesamiento contiene una o más tareas de geoprocesamiento.
Si busca en el Directorio de servicios de ArcGIS Server, puede encontrar servicios de geoprocesamiento, las tareas del servicio y los parámetros y las propiedades de cada tarea. El tema de los Servicios REST de geoprocesamiento proporciona información sobre la jerarquía de los recursos REST y el tema Introducción a las tareas de geoprocesamiento proporciona más información sobre las tareas de geoprocesamiento, sus parámetros y cómo acceder a ellas. ArcGIS API for JavaScript proporcionan objetos y métodos prácticos para acceder a las tareas de geoprocesamiento y ejecutar la funcionalidad.
Para agregar una funcionalidad de geoprocesamiento proporcionada por una tarea en su aplicación Web, siga los cuatro pasos a continuación:
- Inicialice la tarea de geoprocesamiento.
- Configure los parámetros para la tarea.
- Ejecutar la tarea.
- Visualizar los resultados.
Estos cuatro pasos permiten que la aplicación se comunique con el servidor, ejecute la tarea correctamente y visualice los resultados como sea necesario en la aplicación.
Utilizar tareas de geoprocesamiento en ArcGIS API for JavaScript
Con estos cuatro pasos, puede agregar correctamente la funcionalidad de geoprocesamiento con ArcGIS API for JavaScript.
Paso 1: Inicialice la tarea de geoprocesamiento
Para inicializar una tarea de geoprocesamiento, debe ser consciente de la URL de la tarea. La plantilla para una URL de una tarea de geoprocesamiento es https://<host-arcgis>/<nombreserviciogp>/ServidorGP/<nombre-tareagp>. Agregue el siguiente código a su aplicación JavaScript para inicializar una tarea de geoprocesamiento.
Cuando inicialice, asegúrese de establecer la propiedad outSpatialReference de la instancia de tarea de geoprocesamiento en la referencia espacial del mapa web. Los datasets de las tareas de geoprocesamiento pueden estar en una referencia espacial diferente y, por tanto, sus salidas también pueden estar en una referencia espacial diferente. Sin embargo, las aplicaciones Web asumen que las salidas de la tarea están en la misma referencia espacial que el mapa. Esto puede provocar un comportamiento inesperado al dibujar las salidas. Por lo tanto, debe establecer la propiedad de referencia espacial de salida de la tarea de geoprocesamiento. El servidor devolverá las salidas en la referencia espacial especificada por la propiedad outSpatialReference.
Inicialice la tarea de geoprocesamiento
// 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;
Paso 2: Establezca los parámetros de la tarea
Cuando se ejecuta una tarea de geoprocesamiento, la aplicación Web debe proporcionar los valores de parámetro para la tarea de geoprocesamiento. Para obtener más información sobre los requisitos de parámetro de una tarea, copie y pegue la URL de la tarea en la barra de direcciones del navegador Web para abrir la página de tarea del directorio de servicios. La página de tareas enumera todos los parámetros de la tarea y sus tipos de datos. La página de tarea también tiene una dirección URL de ayuda en la que puede encontrar más información sobre la funcionalidad de geoprocesamiento, el acceso y el uso.
Más información sobre las propiedades de los parámetros de tarea
Para el éxito de la ejecución de la tarea, debe especificar los valores para todos los parámetros de entrada (esriGPParameterTypeRequired) de la tarea, como se describe en la página Tarea. Por lo general, los valores de la tarea provienen de una o más de las fuentes que aparecen a continuación:
- Los valores introducidos por el usuario que está utilizando la aplicación Web
- Los valores de las capas de entidad o de gráficos del mapa web actual
- Los resultados de otras tareas, como consultas, rutas de tareas, etc.
- Resultados de otras tareas de geoprocesamiento
El código de JavaScript que aparece a continuación muestra un ejemplo de la creación de entidades de entrada, un parámetro GPFeatureRecordsetLayer de FeatureLayer que se agrega al mapa Web y crea buffDistance, un parámetro GPLinearUnit derivado de una entrada de texto dojo con id="distance". Se supone que el usuario introducirá de forma interactiva el valor de distancia. Una vez que se crean los parámetros de la tarea, una construcción JSON, con pares nombre-valor de los parámetros, se construye y se envía al servidor.
Parámetros de configuración
//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;
}
Paso 3: Ejecute la tarea
Para ejecutar una tarea debería utilizar el método ejecutar o submitJob de la instancia del geoprocesador (gpTask) basada en la operación compatible de la tarea de geoprocesamiento. Puede encontrar la operación compatible de la tarea en la página Tareas. Los temas Operación de tarea: ejecutar y Operación de tarea: submitJob explican la diferencia entre las operaciones y la comunicación entre cliente y servidor para la operación.
Operación de tarea: ejecutar
Si la operación compatible de la tarea es Tarea ejecutar, debe utilizar el método ejecutar de la instancia del geoprocesador y aprobar los parámetros. Debe definir los controladores de eventos que enfocarán la aplicación en peticiones satisfactorias y fallidas. El evento onExecuteComplete se planteará cuando la tarea se ejecute correctamente y devuelva los mensajes de resultado y de geoprocesamiento. El evento onError se plantea cuando falla la ejecución de la tarea. Cuando la tarea falle, el servidor devolverá una instancia de con código de error HTML y mensajes de geoprocesamiento, si los hubiera.
Operación de tarea: ejecutar
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);
}
Operación de tarea: submitJob
Si la operación compatible de la tarea es la operación submitJob, debe utilizar el método Geoprocessor.submitJob y aprobar los parámetros. En el caso de submitJob, surgen tres acontecimientos y deben ser tratados de forma adecuada en la aplicación Web.
onStatusUpdate | Cuando el estado actual de la tarea es recibido |
onJobComplete | Cuando el trabajo se ha completado correctamente |
onError | Cuando el trabajo falla |
- onStatusUpdate: a diferencia de ejecutar, en el caso de submitJob, el servidor crea un trabajo y asigna un jobId. Las operaciones submitJob no envían una notificación al cliente cuando se ha completado un trabajo, así que el cliente debe comprobar el servicio para determinar el estado del trabajo. Las aplicaciones Web, por defecto, envían solicitudes de estado al servidor cada segundo para determinar el estado de la tarea. Cada vez que la respuesta de estado se recibe, se plantea el evento onStatusUpdate. Puede aumentar o disminuir el intervalo de la consulta del estado a través del método Geoprocessor.setUpdateDelay si es necesario. El evento onStatusUpdate se plantea cada vez que el estado del trabajo se comprueba. El controlador de eventos recibe una instancia JobInfo que contiene el Id. de trabajo, el estado del trabajo y cualquier GPMessages devueltos por el servidor. Puede utilizar esta información para realizar el seguimiento de los progresos de la tarea.
- onJobComplete: cuando JobInfo.jobStatus = STATUS_SUCCEEDED, se activa el evento onJobComplete. Los resultados no se devuelven automáticamente para el cliente cuando se completa la operación, sino que en su lugar se almacenan en el servidor y el cliente debe enviar una solicitud para recuperarlos.En el controlador de eventos onJobComplete, puede invocar el método Geoprocessor.getResultData y obtener los resultados. Cada parámetro de salida es un recurso independiente, y el método getResultData de la instancia del geoprocesador debe ser invocado para cada parámetro de salida de la tarea. Debe proporcionar el jobId devuelto por el controlador de eventos y el nombre del parámetro de salida en el método getResultData. También debe crear un controlador de eventos para el evento onGetResultDataComplete. El evento onGetResultDataComplete surge cuando el valor de resultado del parámetro de salida es recibido por la aplicación Web.
- onError: el evento onError se activa cuando una solicitud de estado o una solicitud submitJob caduca o cuando las tareas de geoprocesamiento han fallado. El caso devolverá una instancia de error con código de error HTML.
Operación de tarea: 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);
}
Paso 4: Representación del resultado
Los resultados de una tarea de geoprocesamiento se visualizan basándose en el tipo de datos del parámetro de salida.
GPFeatureRecordSetLayer | Las entidades de salida generalmente se dibujan en el mapa Web como una capa de gráficos para mostrar los resultados de geoprocesamiento. |
GPRecordSet | Los registros de salida se muestran en una cuadrícula o se utilizan los valores para crear diagramas y gráficos. |
GPRasterDataLayer | Los rásteres de salida se pueden descargar pero no se dibujan en el mapa. Sin embargo, puede utilizar un Servicio de mapas de resultado para visualizar los datos ráster. Más información sobre el Servicio de mapas de resultado y Utilizar un servicio de mapas de resultado en las aplicaciones Web |
GPDataFile | Los archivos de salida se pueden descargar o los archivos como .gpx y .csv pueden ser procesado por la aplicación Web. |
GPBoolean, GPDataFile, GPLong, GPDouble, GPString, GPLinearUnit, GPDate | Las salidas se muestran mediante HTML u otros widgets. |
Resultados del controlador de evento onExecuteComplete
En el caso de la operación ejecutar, el evento onExecuteComplete devuelve los resultados y mensajes de la tarea de geoprocesamiento. Los resultados de la instancia son un conjunto de todos los parámetros de salida de la tarea, y las entradas del conjunto están siempre en el orden en que se enumeran en la página Tarea.Por lo tanto, los valores de parámetro se puede identificar por su posición en el conjunto. Cada parámetro de salida en el conjunto tiene un nombre de parámetro, su tipo de datos y su valor. El código que aparece a continuación muestra cómo acceder al primer parámetro de salida en los resultados. En el siguiente código, el parámetro de salida es conocido por ser una salida GPFeatureRecordSetLayer de salida y, por lo tanto, el código muestra cómo representarlo como una capa de gráficos y agregarlo a la aplicación Web.
Visualizar en pantalla los resultados del controlador de eventos 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)
}
Resultados del controlador de evento onGetResultDataComplete
El evento onGetResultDataComplete proporciona una instancia de resultado. A diferencia de los resultados del evento onExecuteComplete, la instancia de resultado solo tendrá valores para el parámetro requerido. El resultado del parámetro resultado tendrá el nombre, el tipo de datos y el valor solicitados. El valor de parámetro se recupera del resultado y se utiliza según sea necesario. El código que aparece a continuación muestra cómo visualizar los resultados de un parámetro GPFeatureRecordSetLayer a partir de un parámetro de instancia de resultado.
Resultados del controlador de evento 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) }