Crear servicios de geoprocesamiento con scripts de Python

Explorar:

La mayoría de las herramientas de script de Python que se ejecutan correctamente en su equipo se publicarán y ejecutarán correctamente como servicios de geoprocesamiento (no tiene que modificar su script). Sin embargo, si está encontrando problemas, puede deberse a que el script usa muchos datos de proyecto, lo que significa que los datos de entrada no son un parámetro, o que usa sentencias import para importar los módulos de Python que ha desarrollado. En este caso, este tema puede resultarle útil, ya que trata los siguientes casos:

  • Cómo crear rutas a los datos de proyecto y cómo encontrar estos datos.
  • Cómo buscar los módulos importados y habilitarlos para el uso de la herramienta.
  • Cómo se manejan las bibliotecas de terceros.
  • Cómo se gestiona un código de validación de la herramienta y su interacción entre el cliente y el servicio de geoprocesamiento.

Si no está familiarizado con Python, ArcPy o las herramientas de script, vaya a la sección Procedimientos iniciales con Python y ArcPy, y las herramientas de scripts para ver una lista de temas útiles.

Cómo crear rutas a los datos de proyecto y cómo encontrar estos datos

Una parte importante de muchos scripts de Python es la correcta construcción de las rutas que hacen referencia a los datos. Esto incluye los datos de proyecto (datos de entrada no expuestos como un parámetro) que se encuentran dentro de scripts y datos intermedios (temporales). En Python, hay distintas formas de escribir rutas que hagan referencia a los datos. Consulte Establecer rutas de acceso a datos en Python para obtener información detallada sobre el procedimiento para escribir una ruta completa.

Una ruta de datos relativa a una ubicación conocida se puede crear usando os.path.join. Esto también resulta útil para crear rutas de ubicaciones de salida que residan en el espacio de trabajo de la memoria o para usar ubicaciones temporales para los datos temporales en el disco. Consulte el ejemplo siguiente con os.path.join.

Cuando la herramienta se comparte como un servicio de geoprocesamiento, se examina el script y todas las cadenas de caracteres escritas entre comillas (con comillas simples o dobles) utilizadas en una variable de Python o como argumento de una función se prueban para determinar si se trata de una ruta de datos. En este caso, los datos de proyecto incluyen lo siguiente:

  • Una capa en la tabla de contenido del mapa o la escena
  • Una carpeta
  • Un archivo
  • Un geodataset, como una clase de entidad, un shapefile, una geodatabase, un mapa (.mapx) o un archivo de capa (.lyrx)

Cuando se encuentra una cadena de caracteres con comillas en el script, la prueba para comprobar la existencia de datos se lleva a cabo de la manera siguiente:

  • ¿La cadena de caracteres hace referencia a una capa del panel Contenido?
  • ¿Contiene la cadena de caracteres una ruta absoluta a los datos (como "e:\Warehousing\ToolData\SanFrancisco.gdb\streets")?
  • ¿La cadena de caracteres hace referencia a datos que se pueden encontrar en una ubicación relativa a otra conocida, como el archivo de proyecto .aprx o el script?

Estas pruebas se desarrollan en orden secuencial. Si se supera la prueba y existen los datos, se consolidarán, con una excepción: si los datos se han registrado en el data store federado del portal, no se consolidarán.

Nota:

Cuando las carpetas se consolidan, solo se copian los archivos y las geodatasets que están dentro de la carpeta; no se copia ninguna subcarpeta. Algunos geodatasets, como las geodatabases de archivos y los rásteres, son técnicamente carpetas, pero también son geodatasets, de modo que se copiarán. Si la carpeta contiene archivos de capa (.lyrx) o mapas (.mapx), todos los datos referenciados por el archivo de capa o el mapa se consolidan también para que las rutinas de arcpy.mp en el script puedan tener acceso a los datos referenciados.

Sugerencia:

Debido a la forma en que las carpetas se consolidan, debe evitar abarrotar la carpeta con datasets grandes y archivos que nunca serán utilizados por la herramienta; esto aumenta innecesariamente el tamaño de los datos que se empaquetarán o cargarán en el servidor. (Esto no se aplica a las carpetas que se encuentran en un data store del servidor, ya que estas carpetas no se cargan en el servidor).

Ejemplo

El siguiente ejemplo se basa en esta estructura de carpetas de proyecto:

Proyecto de ejemplo

Rutas relativas a datasets y carpetas

Una rutina de arcpy.mp permite obtener la homeFolder o defaultGeodatabase para un proyecto dado. Las rutas se pueden crear usando el módulo de so de Python. En el siguiente ejemplo, se define una clase de entidad en la geodatabase WebTools.gdb y se simboliza usando un archivo de capa de la carpeta LYRXs:


import arcpy
import os

# The ArcGIS Project is used to build paths from the defaultGeodatabase and 
# homeFolder using os.path.join

# Reference the CURRENT project with ArcGIS Pro open, or point to an .aprx on 
# disk
prj = arcpy.mp.ArcGISProject("CURRENT")
arcpy.CopyFeatures_management(os.path.join(prj.defaultGeodatabase, "study_sites"), 
                              "in_memory/tempSite")

# Create a variable to reference the LYRX folder
lyrxFolder = os.path.join(prj.homeFolder, "LYRXs")
arcpy.ApplySymbologyFromLayer_management("in_memory/tempSite", 
                                         os.path.join(lyrxFolder, "Site4.lyrx"))

En el código anterior, la clase de entidad study_sites y el archivo Site4.lyrx (y los datos a los que señala) se probarán para ver si hacen referencia a datos existentes. Estos datasets se consolidarán y se cargarán en el servidor (a menos que se haya hecho referencia a la carpeta donde residen como parte del data store del servidor).

La variable lyrxFolder hace referencia a la ruta relativa de una carpeta o de archivos de capa. Esta carpeta se consolidará; todo su contenido (con la excepción de las subcarpetas, como ya se ha indicado) se empaquetará o cargará en el servidor (a menos que la carpeta lyrxFolder forme parte del data store del servidor).

Referencia a capas como datos de proyecto

Un flujo de trabajo menos habitual consistente en utilizar capas como datos de proyecto puede dar como resultado importantes mejoras del rendimiento de la herramienta de script de Python. El código de Python anterior utiliza rutas completas a clases de entidad y archivos de capa. Cuando se ejecuta un servicio de geoprocesamiento, primero debe abrirse el dataset; la apertura del dataset tiene un coste de rendimiento. Al utilizar capas en el script, los datos se mantendrán abiertos y en caché para que el rendimiento sea más rápido. En la imagen siguiente se muestra cómo se establece la correspondencia de las capas del contenido del proyecto y cómo se usan dichas capas en el script de Python:

Capas usadas en una herramienta de script de Python

Las variables (extentMask y rasterLayer) apuntan a cadenas de caracteres simples que coinciden con los nombres de las capas del mapa. Los datos se consolidarán y estarán disponibles en el servicio de geoprocesamiento cuando se comparten con el portal (si no están referenciados en el data store) y se conservará una referencia a las capas en la memoria. Esta correspondencia de nombres entre las capas del mapa y las cadenas de caracteres del script permite que las herramientas funcionen con las capas.

Nota:

Cuando se utilizan capas como datos de proyecto internos en una herramienta de script, esta pasa a depender del mapa asociado. No se puede ejecutar la herramienta desde otro mapa sin que estas capas estén presentes. Este patrón reduce la portabilidad general de la herramienta de script. Por consiguiente, este patrón es el más adecuado para crear servicios de geoprocesamiento.

Importar otros módulos de Python

La script puede importar otros scripts que haya desarrollado. Por ejemplo, el código que aparece a continuación muestra cómo importar un módulo de Python denominado myutils.py, que se encuentra en el mismo directorio que el script principal y contiene una rutina llamada getFIDName:


import arcpy
import myutils

inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)

Cuando se encuentra una sentencia import, se utiliza el siguiente orden para ubicar el script:

  1. La misma carpeta que el script. Si el script está integrado en la caja de herramientas, la ubicación es la carpeta que contiene la caja de herramientas.
  2. La carpeta del sistema al que hace referencia la variable PYTHONPATH .
  3. Cualquier carpeta a la que hace referencia la variable PATH del sistema.
Si se encuentra el script para importar en alguna de estas carpetas, el script se consolida. El proceso de escaneo es recursivo (el script importado también se escanea en busca de datos de proyecto e importaciones utilizando todas las normas que se describen arriba.

Otra técnica para hacer referencia a los módulos que se van a importar es utilizar el método sys.path.append. Esto le permite establecer una ruta a una carpeta que contiene los scripts que necesita importar.


import arcpy
import sys
import os

# Append the path to the utility modules to the system path
# for the duration of this script.
myPythonModules = r'e:\Warehousing\Scripts'
sys.path.append(myPythonModules)
import myutils  # A Python file within myPythonModules

En el código anterior, tenga en cuenta que el método sys.path.append requiere una carpeta como argumento. Como r'e:\Warehousing\Scripts' es una carpeta, se consolidará todo el contenido de dicha carpeta. Las reglas para copiar el contenido de la carpeta se aplican también en este caso: se copia todo lo que hay en la carpeta, excepto las subcarpetas que no son geodatasets.

Nota:

No se examinarán los scripts de Python de la carpeta en busca de datos de proyecto o módulos importados.

Módulos de otros fabricantes

Los módulos y las bibliotecas de terceros (cualquier módulo que no forme parte de la instalación básica de Python) no se consolidan. Es necesario garantizar que el módulo existe y se ejecuta correctamente en el servidor. Esto no se aplica a numpy, matplotlib ni a otros módulos instalados con ArcGIS Server de forma predeterminada. Para implementar módulos de Python de terceros, consulte Implementar paquetes de Python personalizados para ArcGIS Server.

Código de validación de la herramienta

Si tiene experiencia escribiendo las herramientas de script, puede proporcionar su propia lógica de validación de la herramienta . Los clientes de los servicios de geoprocesamiento no tienen la capacidad de ejecutar su lógica de validación de la herramienta; solamente el servidor tiene esta capacidad. Cuando los clientes envían su solicitud de ejecución de tarea al servicio, su lógica de validación se ejecutará en el servidor. Si las rutinas de validación lanzar un error, la ejecución de la tarea se detendrá. Si devuelve mensajes desde su servicio, el cliente debe recibir mensajes enviados por sus rutinas de validación. Generalmente, el código de validación de la herramienta integrado en un servicio de geoprocesamiento publicado proporciona menos valor que el que proporcionó a la herramienta cuando se utilizó en Desktop. Puede trabajar con una copia del servicio de geoprocesamiento que tenga el código de validación reducido o eliminado y compartir esa copia como servicio de geoprocesamiento. Debe desarrollar la lógica de validación en la aplicación para consumir el servicio de geoprocesamiento.

La lógica de validación se implementa con Python y su código de validación se examinará en busca de datos de proyecto y módulos, al igual que en cualquier otro script de Python. Por ejemplo, su lógica de validación puede abrir una carpeta (como d:\approved_projections) que contiene archivos de proyección (.prj) para generar una lista de referencias espaciales que el cliente puede usar cuando el servidor ejecuta su herramienta. Esta carpeta no es un parámetro de herramienta; son datos de proyecto que se utilizan en el script de validación de la herramienta. Aquí se aplican las mismas reglas que se describieron anteriormente para scripts de Python y la consecuencia es que la carpeta d:\approved_projections se consolidará y se copiará en el servidor (a menos que se encuentre en el data store del servidor).

Introducción a Python, ArcPy y las herramientas de script

Si no está familiarizado con Python, ArcPy ni las herramientas de script, la siguiente tabla enumera algunos temas que le ayudarán a empezar:

Tema de ayudaContenido

Referencia de la herramienta de geoprocesamiento

Información detallada sobre cada herramienta de geoprocesamiento.

¿Qué es ArcPy?

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

Un recorrido rápido por la creación de herramientas con Python

¿Qué es una herramienta de script?

Temas introductorios sobre cómo crear herramientas de script personalizadas con Python.

Configurar los parámetros de la herramienta de script

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