Utilizar un servicio de geoprocesamiento en secuencias de comandos de Python

Puede escribir una secuencia de comandos de Python para ejecutar y hacer uso de un servicio de geoprocesamiento de varias formas. La principal forma de ejecutar una secuencia de comandos es hacer uso de ArcPy. ArcPy tiene métodos integrados a los que conectarse y con los que ejecutar y manejar el resultado del servicio. De manera alternativa, mediante el Directorio de servicios, puede utilizar módulos Python incorporados para realizar las llamadas REST utilizando una estructura JSON para transferir los resultados. Deberá crear un cliente desde cero con el código Python para hacer uso de esto. La mayor parte de las secuencias de comandos se conectarán a y utilizarán los servicios de geoprocesamiento a través de ArcPy.

La forma de ArcPy

A un servicio de geoprocesamiento se puede acceder a través de la ventana Python en ArcMap, una herramienta de secuencia de comandos o una secuencia de comandos independiente. La dirección URL se utiliza para conectar y utilizar un servicio de geoprocesamiento.

Conectarse a un servicio mediante ImportToolbox.

# arcpy.ImportToolbox("http://<hostname>:<port>/arcgis/services;<optional folder>/<service name>","<optional alias>")  arcpy.ImportToolbox("http://degrassi:6080/arcgis/services;GPFolder/BufferService","PointAlias")

La ruta utilizada para importar la herramienta es la dirección URL del servicio de geoprocesamiento. ImportToolbox acepta dos parámetros: La dirección URL para el servicio y un alias opcional para la caja de herramientas. El parámetro de la dirección URL está dividido en dos partes separadas por un punto y coma (;). La primera parte es la dirección URL (o vínculo) para el extremo final del servicio y la segunda es el nombre del servicio (de forma opcional, un nombre de carpeta precede al nombre de servicio).

Un servicio de geoprocesamiento se puede ejecutar de forma sincrónica o asíncrona. Como scripter de Python, necesita entender cómo se ejecuta el servicio para utilizarlo. La propiedad IsSynchronous se puede utilizar para determinar el tipo de ejecución de un servicio. Cuando un servicio de ejecuta de forma sincrónica, los resultados se devuelven automáticamente, pero no es posible emprender acciones hasta que se ha completado. Para servicios asíncronos, el estado actual de la ejecución debe consultarse periódicamente. Una vez que haya terminado de ejecutarse el servicio, se puede acceder al resultado.

El siguiente código Python muestra cómo conectarse a un servicio de geoprocesamiento asíncrono, y con las funciones ArcPy, ejecutarlo, obtener el resultado y procesarlo. Al establecer una variable de resultado cuando se ejecuta la tarea, se puede utilizar un bucle while para verificar el estado. La tarea ha terminado una vez que devuelve un código de estado de 4 (logrado) o superior.

Utilizar un servicio GP asíncrono para crear una zona de influencia y guardar el resultado a nivel local

import arcpy import time  arcpy.ImportToolbox("http://sampleserver1.arcgisonline.com/ArcGIS/services;Elevation/ESRI_Elevation_World", "viewshedAlias")  result = arcpy.Viewshed_viewshedAlias(r'c:\data\inputPoint.shp', "10000 Kilometers")  while result.status < 4: 	   print result.status 	   time.sleep(0.2) print "Execution Finished"  result.getMessages() arcpy.CopyFeatures_management(result.getOutput(0), 'localResult.shp')

Más información sobre el objeto resultado y los códigos de estado, así como la creación salidas de ráster e imágenes de mapa, se encuentra disponible en el tema de ayuda Utilizar herramientas en Python.

La forma RESTful

Una forma alternativa (pero menos común) de utilizar un servicio de geoprocesamiento es mediante la construcción de una aplicación que hace llamadas REST, utilizando JSON como formato de intercambio de datos. Este método requiere que usted escriba el código para enviar la solicitud y manejar la respuesta.

Enviar y recibir mensajes REST está más implicado, puesto que debe tratar todos los aspectos de las entradas y salidas de la sintaxis usted mismo. La parte buena de enviar y recibir mensajes REST es que son devueltos de forma coherente. Una petición puede ser enviada a través de un método HTTP GET y una respuesta puede volver estructurada como JSON. El núcleo de las bibliotecas Python admite enviar tanto una solicitud como funciones GET de HTTP, que hacen lecturas y análisis de los mensajes JSON directamente.

El siguiente ejemplo utiliza un servicio en los servidores de muestra de Esri y demuestra cómo puede conectarse al servicio, enviar una solicitud y manejar una respuesta.

Presentar la solicitud

Por ejemplo, SampleServer1 contiene un servicio de geoprocesamiento para crear cuencas visuales y es accesible desde http://sampleserver1.arcgisonline.com/arcgis/rest/services/elevation. Este servicio toma un punto y una distancia como entrada y devuelve un conjunto de entidades. Las siguientes entradas se pueden utilizar para comprender mejor el servicio:

Nombre de parámetro

Valor de entrada

Punto de observación de entrada (GPFeatureRecordSetLayer)

{"geometryType" : "esriGeometryPoint",
"spatialReference" : {"wkid" : 54003},
'features':[{'geometry':{'x': -13308192.1956127,
'y':  4221903.58555983}}]}

Distancia de Cuenca visual (GPLinearUnit)

{ 'distance' : 8.5, 'units' : 'esriMiles' }

Formato (el formato en el que estará la salida)

JSON

Esta petición devolverá el JSON de las ubicaciones visibles desde el servicio. La dirección URL completa utilizada para generar la solicitud se puede utilizar en la barra de direcciones del navegador Web.

http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed/execute?Input_Observation_Point={%22features%22%3A[{%22geometry%22%3A{%22x%22%3A-13308192.1956127%2C%22y%22%3A4221903.58555983}}]}&Viewshed_Distance={+%27distance%27+%3A+8.5%2C+%27units%27+%3A+%27esriMiles%27+}&env%3AoutSR=&env%3AprocessSR=&f=pjson

La dirección URL puede ser presentada utilizando el módulo de Python urllib o urllib2. El siguiente código Python ejecutará la petición mencionada de una forma similar a utilizar el Directorio de servicio o copiar el vínculo en la barra de direcciones del navegador Web.

import urllib import json  inPts = {"geometryType" : "esriGeometryPoint",          "spatialReference" : {"wkid" : 54003},          'features':[{'geometry':{'x': -13308192.1956127,'y':  4221903.58555983}}]} dist = {'distance':8.5,'units':'esriMiles'}  data = {'Input_Observation_Point': inPts,         'Viewshed_Distance': dist,         'f': 'pjson'}  URL  = 'http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed/execute'  result = urllib.urlopen(URL, urllib.urlencode(data)).read() print json.loads(result)

El objeto de resultado se devolverá como una cadena de caracteres. Hay una serie de métodos diferentes que se pueden utilizar para realizar una solicitud y analizar un resultado; el ejemplo anterior es sólo un método. Los JSON devueltos desde un servicio de geoprocesamiento se pueden colocar en un diccionario utilizando json.loads() como se muestra en el ejemplo anterior. Dependiendo de la salida del servicio de geoprocesamiento, esta podría ser la mejor técnica, o podría necesitar explorar otras opciones para manejar la salida de un servicio de geoprocesamiento cuando se consume desde Python a través de REST.

NotaNota:

Si está trabajando con entidades de resultado, asegúrese de que utilizar los pares x,y reales tiene sentido para su flujo de trabajo, puesto que no va a recibir las entidades reales en un formato que admita la geometría dentro de ArcGIS.

Un servicio que se ejecuta de forma asíncrona requiere que usted pregunte periódicamente el estado de la tarea para ver si se ha acabado, similar al ejemplo anterior con ArcPy. El código Python podría buscar la frase esriJobSucceeded o esriJobFailed en el mensaje de estado jobStatus, que se devuelve al verificar el estado del trabajo. La siguiente muestra de código demuestra una técnica para trabajar con un servicio de geoprocesamiento asíncrono (utilizando submitJob).

import urllib, json, time      inPts = {"geometryType" : "esriGeometryPoint",          "spatialReference" : {"wkid" : 54003},          'features':[{'geometry':{'x': -13308192.1956127,'y':  4221903.58555983}}]} dist = {'distance':8.5,'units':'esriMiles'}  data = {'Input_Observation_Point': inPts,         'Viewshed_Distance': dist,         'f': 'pjson'}  taskUrl = "http://localhost:6080/arcgis/rest/services/WorldViewshed/GPServer/viewshed" submitUrl = taskUrl + "/submitJob"  submitResponse = urllib.urlopen(submitUrl, urllib.urlencode(data))    submitJson = json.loads(submitResponse.read())      if 'jobId' in submitJson:       jobID = submitJson['jobId']             status = submitJson['jobStatus']             jobUrl = taskUrl + "/jobs/" + jobID                          while status == "esriJobSubmitted" or status == "esriJobExecuting":         print "checking to see if job is completed..."         time.sleep(1)                  jobResponse = urllib.urlopen(jobUrl, "f=json")              jobJson = json.loads(jobResponse.read())               if 'jobStatus' in jobJson:               status = jobJson['jobStatus']                                   if status == "esriJobSucceeded":                                                             if 'results' in jobJson:                         resultsUrl = jobUrl + "/results/"                         resultsJson = jobJson['results']                         for paramName in resultsJson.keys():                             resultUrl = resultsUrl + paramName                                                                     resultResponse = urllib.urlopen(resultUrl, "f=json")                                resultJson = json.loads(resultResponse.read())                                                         print resultJson                                   if status == "esriJobFailed":                                                             if 'messages' in jobJson:                                                 print jobJson['messages']                                             else:     print "no jobId found in the response"

Introducción a Python, ArcPy y las herramientas de secuencia de comandos

Si no está familiarizado con Python, Arcpy y las herramientas de secuencia de comandos, la tabla a continuación enumera algunos temas que le ayudarán a empezar.

Tema de ayuda

Índice

Un paseo introductorio por la creación de herramientas personalizadas

Conceptos básicos de crear sus propias herramientas de geoprocesamiento.

¿Qué es Python?

¿Qué es ArcPy?

Temas de introducción a Python y ArcPy. Estos temas le guiarán a temas más detallados sobre Python y el paquete del sitio de ArcPy.

Un rápido recorrido para crear herramientas con Python

¿Qué es una herramienta depreciada?

Tema introductoria sobre cómo crear herramientas de secuencia de comandos personalizadas mediante Python.

Configurar los parámetros de la herramienta de secuencia de comandos

Una vez que se haya familiarizado con el proceso de creación de una herramienta de secuencia de comandos, este tema se conoce porque a menudo explica en detalle cómo definir los parámetros de la herramienta de secuencia de comandos.

Temas relacionados

9/11/2013