Utilizar tareas de geoprocesamiento en aplicaciones Web
Las API de representación cartográfica Web de ArcGIS
Un marco para los SIG Web le ayudará a empezar a entender las aplicaciones Web basada en SIG. Las API Web de ArcGIS permiten que los navegadores Web se comuniquen con los Servicios SGI de ArcGIS 10.1 for Server, representen (dibujen) datos geográficos y realicen análisis. Las API Web de ArcGIS se ofrecen en tres tipos diferentes. Éstas son:
- API de ArcGIS para JavaScript
- API de ArcGIS para Flex
- API de ArcGIS para Microsoft Silverlight/WPF
Las tres API tienen una funcionalidad similar, pero están destinadas a lenguajes desarrollo diferentes. Para comenzar con el desarrollo de aplicaciones Web con Flex y Silverlight, debe descargar las bibliotecas del Centro de recursos ArcGIS. Sin embargo, para la API Web de JavaScript, no es necesario descargar la biblioteca, ya que a esta biblioteca se accede mediante una dirección URL Web. El Centro de recursos ArcGIS proporciona muestras y documentos explicativos para comenzar con las API Web de ArcGIS y le permite elegir la API web adecuada para su entorno.
Tareas de geoprocesamiento en aplicaciones Web
Puede agregar la funcionalidad de geoprocesamiento y análisis de datos para las aplicaciones Web mediante los servicios de geoprocesamiento de ArcGIS. Cada servicio de geoprocesamiento contiene una o más tareas de geoprocesamiento. Si desea buscar en el Directorio de servicios de ArcGIS, puede encontrar servicios de geoprocesamiento, tareas de geoprocesamiento y sus parámetros y propiedades. 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. Las API Web 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 con éxito y visualice los resultados como sea necesario en la aplicación. La sección siguiente muestra cómo aplicar con éxito los cuatro pasos para agregar la funcionalidad de geoprocesamiento utilizando ArcGIS API web para JavaScript. Aunque las declaraciones de objeto, la sintaxis de método y el manejo de eventos varían en las otras dos API web, el patrón de cuatro pasos es común y aplicable a todas las API Web. Los pasos le ayudarán a entender las mejores prácticas para utilizar las tareas de geoprocesamiento en aplicaciones Web.
Utilizar tareas de geoprocesamiento en la aplicación JavaScript
Las API Web de ArcGIS para JavaScript es una de las API Web de ArcGIS. Si no está familiarizado con la API de JavaScript, los temas Obtener la API de ArcGIS para JavaScript y Crear su primera aplicación en ArcGIS JavaScript SDK en línea le ayudarán a empezar con la API de JavaScript. También puede navegar a través de varias muestras de tarea de geoprocesamiento y conceptos en el SDK. Este tema le guiará por los cuatro pasos que se describieron anteriormente para incluir tareas de geoprocesamiento en las aplicaciones Web mediante API JavaScript de ArcGIS.
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 tarea de geoprocesamiento es http://<arcgis-host>/<gpservicename>/GPServer/<gptask-name>. 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 cuando 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 along with other dojo.require statements. dojo.require(esri.tasks.gp); /*Step 1: Initialize Geoprocessing Task as a global variable (i.e) 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;
Paso 2: Establezca los parámetros de 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 a 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; }
Los parámetros GPFeatureRecordSetLayer y GPRecordSetLayer tienen un esquema predeterminado definido por la tarea. Puede encontrar el esquema para los parámetros en la página Tarea. Un esquema de una GPFeatureRecordSetLayer consta de geometría, referencia espacial, campos y entidades. Es una buena práctica para garantizar que los parámetros de GPFeatureRecordSetLayer tienen todas las propiedades, tal y como se define en el esquema para el éxito de los resultados.
Paso 3: Ejecutar 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. Operación de tarea: ejecutar y operación de Tarea: los temas submitJob explican la diferencia entre las operaciones y la comunicación del servidor y el cliente 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 eventoonExecuteComplete se planteará cuando la tarea se ejecute con éxito 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, //see more info on Rendering the results section } //Handler that is invoked when the Task operation has failed function onTaskFailure(error) { //report error to the user appropriately 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 con éxito |
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 notifican al cliente cuando se completa un trabajo, así que depende del cliente comprobarlo con 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 es recibida, 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 aparezca JobInfo.jobStatus = STATUS_SUCCEEDED, se plantea 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 plantea cuando una solicitud submitJob o una solicitud de estado caduca o si las tareas de geoprocesamiento fallaron. 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 to the user appropriately alert("Error:"+ error); }
Paso 4: Visualizar los resultados
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 o otros widgets. |
Resultados del controlador de evento onExecuteComplete
En el caso de la operación ejecutar, el evento onExecuteComplete eventos 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 Tareas. 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 a el 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) }
API de Flex y Silverlight
Los cuatro pasos que descritos anteriormente para aplicaciones de JavaScript se aplican a la API de Flex y Silverlight. Puede encontrar muestras de código para utilizar tareas de geoprocesamiento en API de Flex y API de Silverlight en sus respectivos SDK en línea.