Automatizar un flujo de trabajo de geoprocesamiento con Python

Abrir un proyecto y revisar datasets

Antes de comenzar a usar Python para ejecutar herramientas de geoprocesamiento, descargará y revisará los datasets en ArcGIS Pro.

  1. Descargue los datos de este tutorial y extraiga el contenido en una ubicación en su ordenador.

    El archivo .zip contiene una carpeta denominada PythonWorkflow.

    En este tutorial, los datos se muestran en C:\Lessons\PythonWorkflow\. Puede utilizar una carpeta diferente, pero si lo hace deberá ajustar las rutas en las instrucciones y el código siguientes.

  2. En la carpeta C:\Lessons\PythonWorkflow\, haga doble clic en Workflow.aprx.

    El proyecto Workflow se abre en ArcGIS Pro.

  3. Si el panel Catálogo no está visible, en la pestaña Vista, haga clic en Panel Catálogo.
  4. En el panel Catálogo, expanda Carpetas y expanda PythonWorkflow.
  5. Expanda Transportation.gdb.

    La geodatabase Transportation se expande para mostrar las clases de entidad.

    Las clases de entidad de esta geodatabase están relacionadas con el transporte. Imagine que necesita construir una red a partir de estas clases de entidad. Para que eso sea posible, deberían almacenarse en el mismo dataset de entidades y tener los mismos sistemas de coordenadas. Este no es el caso en este momento.

    En este tutorial, usará código de Python para verificar el sistema de coordenadas de las clases de entidad y usará la herramienta Proyectar para convertir cualquier dataset que aún no esté en el sistema de coordenadas correcto, copiándolos en una nueva geodatabase y dataset de entidades. Esto le permitiría crear una red, aunque no construirá la red en este tutorial.

    Antes de trabajar en el código de Python, revisará el sistema de coordenadas de los datasets seleccionados y ejecutará la herramienta Proyectar manualmente. Esto le dará la información necesaria para usar el código de Python para automatizar el proceso.

  6. Haga clic con el botón derecho en bike_racks y haga clic en Agregar al mapa actual.

    Haga clic con el botón derecho en la clase de entidad bike_racks y agréguela al mapa actual.

  7. Utilice el mismo método para agregar la clase de entidad de carreteras al mapa.

    Estas clases de entidad representan los estacionamientos para bicicletas y las carreteras de Washington, D.C.

    A continuación, revisará los sistemas de coordenadas de las dos clases de entidad.

  8. En el panel Contenido, haga clic con el botón derecho en Mapa y haga clic en Propiedades.

    Abra el panel Propiedades del mapa.

  9. En la ventana Propiedades del mapa: Mapa, haga clic en Sistemas de coordenadas.

    Haga clic en Sistemas de coordenadas.

  10. Expanda Capas y expanda las entradas para los sistemas de coordenadas WGS 1984 y NAD 1983 StatePlane Maryland FIPS 1900 (pies de EE. UU.).

    Expanda las dos entradas del sistemas de coordenadas.

    La clase de entidad bike_racks se encuentra en un sistema de coordenadas geográficas denominado WGS 1984, mientras que las clases de entidad road y boundary se encuentran en el sistema de coordenadas proyectadas State Plane coordinate system for Maryland, NAD 1983 StatePlane Maryland FIPS 1900 (pies de EE. UU.).

    Su objetivo es colocar todas las clases de entidad en un dataset con el sistema de coordenadas proyectadas.

  11. Haga clic en Aceptar para cerrar la ventana Propiedades de mapa.

    Ha examinado la geodatabase e identificado los dos sistemas de coordenadas utilizados por las clases de entidad. A continuación, proyectará una de las clases de entidad.

Proyectar una clase de entidad

A continuación, proyectará una de las clases de entidad y examinará los parámetros necesarios para esa herramienta.

  1. En la cinta, haga clic en Análisis y, en la sección Geoprocesamiento, haga clic en Herramientas.

    Haga clic en Análisis y, en la sección Geoprocesamiento, haga clic en Herramientas.

    Se abre el panel Geoprocesamiento.

  2. En el panel Geoprocesamiento, haga clic en el cuadro de búsqueda y escriba Proyectar.
  3. En los resultados de la búsqueda, haga clic en Proyectar (Herramienta Administración de datos).
  4. En el panel de la herramienta Proyectar, para el parámetro Clase de entidad o dataset de entrada, elija bike_racks.
  5. Para el nombre del Dataset de salida o Clase de entidad, haga clic en el botón Examinar y busque la geodatabase Transportation. Expanda la geodatabase y, en el cuadro Nombre, escriba bike_racks_sp. Haga clic en Guardar.
  6. Para el Sistema de coordenadas de salida, haga clic en la lista desplegable y haga clic en carreteras.

    La herramienta Proyectar con parámetros establecidos.

    Al elegir carreteras, se establece el valor de Sistema de coordenadas de salida en el sistema de coordenadas de la clase de entidad de carreteras, el sistema de coordenadas State Plane Maryland.

    El parámetro Transformación geográfica se establece en WGS_1984_(ITRF00) To_NAD_1983 porque los sistemas de coordenadas geográficas de la entrada y la salida son diferentes.

    Nota:

    La transformación geográfica es necesaria cuando los sistemas de coordenadas geográficas de la clase de entidad de entrada y la clase de entidad de salida son diferentes. Cuando los sistemas de coordenadas geográficas son idénticos, no aparece ninguna lista de valores para este parámetro. Cuando es necesaria una transformación, aparece una lista desplegable basada en los sistemas de coordenadas geográficas de entrada y de salida, y se selecciona una transformación predeterminada. En este tutorial se basará en esta transformación predeterminada.

  7. Haga clic en Ejecutar.

    Se ejecuta la herramienta Proyectar y la clase de entidad proyectada se agrega al mapa activo.

    Para preparar los datos que se usarán en una red, deberá repetir este proceso para cada clase de entidad en la geodatabase: verifique el sistema de coordenadas y decida si necesita ejecutar la herramienta Proyectar. Proyecte las clases de entidad que se deben proyectar. Copie las otras clases de entidad sin proyectarlas.

    En lugar de repetir estos pasos manualmente, utilizará código Python para automatizar el proceso.

  8. Cierre la herramienta Proyectar.
  9. En el panel Catálogo, haga clic con el botón derecho en la clase de entidad bike_racks_sp, haga clic en Eliminar y haga clic en para eliminar la clase de entidad de forma permanente.

    Ahora está listo para iniciar el flujo de trabajo usando código Python.

Usar Python para describir una clase de entidad

El primer paso en el flujo de trabajo es examinar el sistema de coordenadas de las clases de entidad. Lo hará usando código Python en la ventana de Python.

  1. En la cinta, haga clic en Análisis y, en la sección Geoprocesamiento, haga clic en la flecha desplegable del botón Python; a continuación, haga clic en Ventana de Python.

    Abra la ventana de Phyton.

  2. Haga clic en la sección de línea de comandos en la parte inferior de la ventana de Python, escriba el siguiente código y pulse Intro:

    desc = arcpy.da.Describe("bike_racks")

    Agregue código para describir la clase de entidad bike_racks.

    Al pulsar Intro, el código se ejecuta inmediatamente. No imprime ninguna información, pero crea una variable denominada desc y la establece igual al resultado de ejecutar la función Describir en la clase de entidad bike_racks.

    La función Describir devuelve un diccionario con las propiedades del dataset. Esto le da acceso a la referencia espacial, entre otras propiedades.

  3. En la sección de línea de comandos, agregue el siguiente código y pulse Intro.

    sr = desc["spatialReference"]

    Esto establece la nueva variable denominada sr para el valor almacenado en la clave SpatialReference del diccionario de propiedades del dataset. El objeto SpatialReference contiene toda la información relevante sobre el sistema de coordenadas del dataset. Esto le permite verificar propiedades específicas.

  4. En la sección de línea de comandos, agregue el siguiente código y pulse Intro.

    print(sr.name)

    Esto imprime el nombre del objeto de referencia espacial.

    Imprima el nombre del objeto de referencia espacial.

    Verificar de este modo el sistema de coordenadas para cada clase de entidad una a una es un poco engorroso, por lo que usará una función de lista para hacer una lista y luego procesar todas las clases de entidad.

Hacer una lista de clases de entidad y describirlas

Puede acelerar el proceso de verificación de los sistemas de coordenadas de las clases de entidad haciendo una lista de ellas y luego usando una estructura de bucle en Python para procesar la lista y describirlas.

  1. En la sección de línea de comandos, agregue el siguiente código y pulse Intro.

    fcs = arcpy.ListFeatureClasses()

    Esto crea una variable denominada fcs y la establece igual al resultado de ejecutar la función ListFeatureClasses en el espacio de trabajo actual. No ha configurado el espacio de trabajo explícitamente, pero Transportation.gdb es el espacio de trabajo predeterminado para este proyecto. La función devuelve una lista de las clases de entidad en Transportation.gdb.

  2. En la sección de línea de comandos, agregue el siguiente código y pulse Intro.

    print(fcs)

    El resultado es una lista de Python con nombres de clases de entidad. Está entre corchetes y los nombres de las clases de entidad son cadenas de Python separadas por comas.

    ['bus_lines', 'boundary', 'street_lights', 'roads', 'traffic_analysis_zones', 'bike_routes', 'bike_racks', 'parking_zones', 'intersections', 'station_entrances']

    A continuación, utilizará un bucle for para procesar cada elemento de la lista.

  3. En la sección de línea de comandos, agregue el siguiente código:

    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        print(f"{fc}: {sr.name}")

    Un bucle for para procesar la lista de clases de entidad

    La primera línea define un bucle for. Crea una variable temporal denominada fc a la que se le asignará el nombre de cada clase de entidad de la lista fcs. La línea termina con el símbolo de los dos puntos para indicar que lo que sigue es el bloque de código que se ejecutará para cada elemento de la lista. Las siguientes tres líneas tienen una sangría de cuatro espacios para indicar que pertenecen al bloque de código. La primera línea del bloque de código crea una variable denominada desc y la establece igual al resultado de ejecutar la función Describe en el valor de clase de entidad actual almacenado en la variable fc. La segunda línea crea la variable sr y la establece en el objeto spatialReference almacenado en desc. La tercera línea imprime una cadena de caracteres con formato que contiene el nombre de la clase de entidad, el símbolo de los dos puntos y el nombre de la referencia espacial.

    El código de este bloque repite el proceso que realizó anteriormente para obtener el nombre de la referencia espacial para la clase de entidad bike_racks, pero lo hace en una variable que se establece en cada uno de los elementos de la lista, por lo que procesa e informa de los resultados para todas las clases de entidad.

  4. Presione Intro dos veces para ejecutar el bucle for y su bloque de código.

    Informe de la referencia espacial para cada clase de entidad de la lista.

    La mitad de las clases de entidad están en un sistema de coordenadas y la otra mitad en el otro.

    El siguiente paso es escribir código para crear una geodatabase y usar las herramientas Proyectar y Copiar entidades para traer las clases de entidad al mismo dataset con un sistema de coordenadas proyectadas común. Exportará el trabajo que ha realizado hasta ahora y lo utilizará como base para una secuencia de comandos.

Crear una secuencia de comandos

A continuación, seguirá escribiendo el código para automatizar este proceso como una secuencia de comandos. Puede probar el código en la ventana de Python, pero para las secuencias de comandos más largas suele ser mejor escribirlas en un editor de Python. Exportará el código que tiene hasta ahora y continuará trabajando en él en IDLE, el editor de Python predeterminado.

  1. Haga clic con el botón derecho en la sección de transcripción de la ventana de Python y haga clic en Guardar transcripción.

    Haga clic con el botón derecho en la ventana de Python y guarde la transcripción.

  2. En la ventana Guardar transcripción, vaya a la carpeta PythonWorkflow donde extrajo los datos, denomine a la transcripción workflow_project.py y haga clic en Guardar.

    Esto guarda la transcripción como un archivo de secuencia de comandos de Python que puede abrir en un editor de Python.

  3. Inicie Microsoft File Explorer y vaya a la carpeta PythonWorkflow.
  4. Haga clic con el botón derecho en workflow_project.py y haga clic en Editar con IDLE (ArcGIS Pro).

    Haga clic con el botón derecho en la secuencia de comandos workflow_project.py y haga clic en Editar con IDLE (ArcGIS Pro).

    Nota:
    Si también tiene instalado ArcGIS Desktop 10.x (ArcMap), el menú contextual también incluirá el acceso directo Editar con IDLE. No use este acceso directo, ya que no abre la versión correcta de Python.

    Nota:
    Si Editar con IDLE (ArcGIS Pro) no está visible en el menú contextual, haga clic en Inicio, expanda ArcGIS y haga clic en la ventana de comandos de Python. En la ventana de comando de Python, escriba idle y pulse Intro. Aparece la ventana IDLE (Python 3.9 Shell). Haga clic en Archivo seguido de Abrir. Busque y abra el archivo workflow_project.py.

    La secuencia de comandos se abre en IDLE, el editor predeterminado de Python. La secuencia de comandos incluye todo el código de la sección de transcripción de la ventana de Python, incluidos los mensajes impresos, que aparecen como comentarios con el carácter almohadilla al comienzo de la línea.

    La transcripción se abre en el editor IDLE de Python.

  5. En la ventana del editor IDLE, elimine todo el código antes de la línea fcs = arcpy.ListFeatureClasses().
  6. Elimine todas las líneas de comentarios.
  7. Elimine la línea print(fcs).

    Este es el código restante:

    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        print(f"{fc}: {sr.name}")

    A continuación, agregará líneas para importar dos bibliotecas, establecerá algunas variables y establecerá el espacio de trabajo.

  8. Agregue una nueva línea antes de la línea fcs = arcpy.ListFeatureClasses() y agregue las siguientes líneas al comienzo de la secuencia de comandos.

    import arcpy
    import os

    La primera línea de código importa el paquete ArcPy para garantizar que la funcionalidad de ArcPy esté disponible en la secuencia de comandos cuando se ejecute fuera de ArcGIS Pro. La segunda línea importa el módulo os, que se usa para manejar rutas de archivos.

  9. Agregue una nueva línea después de las dos primeras líneas y agregue las siguientes líneas de código:
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    arcpy.env.workspace = os.path.join(mypath, gdb)

    La primera línea especifica la ubicación de los datos. Si extrajo la carpeta PythonWorkflow a otra ubicación, debe editar esta línea para que sea la ruta de su equipo. Este valor se asigna a una variable denominada mypath. Esta variable se utilizará para establecer el espacio de trabajo, así como para otras tareas, como la creación de una file geodatabase.

    Se utiliza una sola barra diagonal (/) en la ruta en lugar de una sola barra invertida (\). En Python se usa una sola barra invertida como carácter de escape y puede tener consecuencias no deseadas. En lugar de una barra diagonal, también puede usar la letra r para sin procesar antes de la cadena de caracteres (por ejemplo: r"C:\Lessons\PythonWorkflow") o puede usar dos barras invertidas (por ejemplo: "C:\\Lessons\\PythonWorkflow"). Las tres notaciones se consideran correctas y se pueden utilizar indistintamente.

    La siguiente línea establece la variable gdb igual al nombre de la geodatabase donde se almacenan las clases de entidad de interés.

    La última línea establece el espacio de trabajo al combinar la carpeta donde residen los datos (mypath) y el nombre de la geodatabase (gdb). La función os.path.join() se utiliza para combinar estas dos cadenas de caracteres en una nueva cadena de caracteres de la ruta del espacio de trabajo. Para hacerlo se recomienda usar os.path.join() porque crea unas cadenas de ruta sólidas sin el uso de barras invertidas simples (\). Python las lee como caracteres de escape y pueden generar errores.

    Esta es la secuencia de comandos completa hasta el momento:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        print(f"{fc}: {sr.name}")

    Secuencia de comandos en el primer punto de prueba

    Ahora puede probar su secuencia de comandos para confirmar que funciona.

  10. Haga clic en Archivo y en Guardar.

    Esto guarda los cambios que ha realizado en la secuencia de comandos. También puede usar el acceso directo del teclado Ctrl+S en IDLE para guardar su trabajo.

  11. Haga clic en Ejecutar y, a continuación, en Ejecutar módulo.

    Ejecutar módulo para ejecutar el código de la secuencia de comandos

    Esto ejecuta la secuencia de comandos. También puede usar el acceso directo del teclado F5 para ejecutar la secuencia de comandos.

    Aparece la ventana IDLE Shell y, después de una breve pausa durante la importación del módulo ArcPy, se imprimen los nombres de clase de entidad y los nombres de referencia espacial.

    Resultados de la primera prueba, nombres impresos de clases de entidad y referencias espaciales

    Para completar la secuencia de comandos para automatizar este flujo de trabajo, deberá agregar las siguientes capacidades: 1) crear una geodatabase; 2) crear un dataset de entidades; 3) copiar las clases de entidad que ya están proyectadas; y 4) proyectar las clases de entidad que están en un sistema de coordenadas geográficas. Escribirá código para cada elemento, probará el código y luego continuará con el siguiente elemento.

Usar código para crear una geodatabase

El siguiente paso es agregar código a su secuencia de comandos para crear la geodatabase. Dado que es posible que deba probar la secuencia de comandos varias veces, deberá poder sobrescribir los datos creados anteriormente. Para permitirlo, agregará una configuración de entorno a la secuencia de comandos.

  1. Después de la línea que empieza con arcpy.env.workspace, agregue una línea y el siguiente código:

    arcpy.env.overwriteOutput = True

    A continuación, creará variables para almacenar los nombres de la nueva geodatabase y el nuevo dataset de entidades.

  2. Después de la línea gdb = "Transportation.gdb", agregue una línea y el siguiente código:

    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"

    Al utilizar variables, evita tener que repetir los nombres en el resto de la secuencia de comandos. Esto hace que su código sea más fácil de volver a usar. Si desea utilizar un nombre diferente para la geodatabase o el dataset, solo necesita cambiarlo en un punto determinado de la secuencia de comandos.

    A continuación, agregue código para crear la geodatabase.

  3. Después de la línea que empieza con arcpy.env.overwriteOutput, agregue el siguiente código:

    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)

    Esta línea llama a la herramienta Crear geodatabase de archivos. Entre los paréntesis, especifique que el primer parámetro requerido, la ubicación de la nueva geodatabase, está establecida en la variable mypath, que contiene el valor de la ruta que estableció anteriormente. Después de una coma, proporcione el otro parámetro requerido de la herramienta, el nombre de la geodatabase de archivos. La variable new_gdb contiene el nombre de la nueva geodatabase.

    La línea también asignó los resultados de crear la geodatabase a una variable. La variable new_gdb_path contiene la ruta y el nombre de la geodatabase recién creada. Esto facilita la referencia a esta nueva geodatabase en la secuencia de comandos.

    Antes de probar la secuencia de comandos, comentará algún código que no necesita ser probado.

  4. Seleccione todas las líneas de código después de la línea new_gdb_path.

    Seleccione líneas que no necesiten ser probadas.

  5. Haga clic en Formato y haga clic en Comentar región.

    Comente las líneas.

    Esto agrega dos caracteres de almohadilla al comienzo de cada una de las líneas de código seleccionadas. Python interpreta las líneas que empiezan con una almohadilla como comentarios, por lo que no se ejecutarán. Podría eliminar estas líneas, pero parte del código se usará nuevamente. Al comentar estas líneas, puede dejar el código en la secuencia de comandos para su uso posterior, pero evitar que se ejecute.

    Algunas líneas están comentadas.

    Este es el código hasta ahora:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    ##fcs = arcpy.ListFeatureClasses()
    ##for fc in fcs:
    ##    desc = arcpy.da.Describe(fc)
    ##    sr = desc["spatialReference"]
    ##    print(f"{fc}: {sr.name}")

  6. Guarde y ejecute el script.

    La ventana IDLE Shell se reinicia y, después de unos momentos, vuelve la solicitud de entrada >>>. Actualmente, el código no tiene líneas de trabajo que impriman información en el shell, por lo que es difícil saber si el código funcionó. Lo comprobará en ArcGIS Pro.

  7. En ArcGIS Pro, en el panel Catálogo, en la sección Carpetas, haga clic con el botón derecho en la carpeta PythonWorkflow y haga clic en Refrescar.

    Refresque la carpeta PythonWorkflow en el panel Catálogo.

  8. Expanda la carpeta PythonWorkflow.

    La nueva geodatabase está en la carpeta.

    La nueva geodatabase está en la carpeta. En estos momentos, está vacía.

  9. Haga clic con el botón derecho en Metro_Transport.gdb, haga clic en Eliminar y haga clic en para eliminar la geodatabase de forma permanente.

    Al probar una secuencia de comandos, a menudo resulta útil eliminar las salidas, ya que es más fácil ver si la secuencia de comandos funciona o no.

    Otro indicador que puede usar para saber si una secuencia de comandos funciona es agregar mensajes que declaren lo sucedido. Puede agregar instrucciones print a su código para ayudarlo a realizar un seguimiento de lo que está sucediendo.

  10. En la ventana de IDLE Editor, después de la línea que empieza con new_gdb_path = arcpy.CreateFileGDB, agregue una nueva línea y el siguiente código:

    print(f"The geodatabase {new_gdb} has been created.")

    Agregue una línea para imprimir una cadena de caracteres con formato que indique que se creó la geodatabase.

    Esta instrucción de impresión imprime una cadena de caracteres con formato que contiene el valor de la variable new_gdb. Las instrucciones de impresión no son necesarias para que se ejecute la secuencia de comandos, pero lo ayudan a realizar un seguimiento de lo que está haciendo la secuencia de comandos. También pueden ser muy útiles para depurar errores en secuencias de comandos largas. Puede agregar varias instrucciones de impresión que indiquen el estado de la secuencia de comandos en diferentes puntos, así, cuando vea cada mensaje, sabrá que la secuencia de comandos ha llegado a ese punto. También puede usar cadenas de caracteres con formato para imprimir los valores de las variables en su secuencia de comandos; esto puede ser muy útil para depurar errores.

  11. Guarde el script.

Utilizar código para crear un dataset de entidades

A continuación, creará el dataset de entidades dentro de la nueva geodatabase. Una propiedad definitoria de un dataset de entidades es que todas las clases de entidad contenidas dentro del dataset de entidades comparten el mismo sistema de coordenadas.

Para este dataset, utilizará el sistema de coordenadas State Plane Maryland. Si bien es posible usar el nombre del sistema de coordenadas al establecer el sistema de coordenadas en Python, es más sencillo usar un código corto, conocido como WKID o "identificador conocido".

  1. En ArcGIS Pro, en el panel Contenido, haga clic con el botón derecho en la capa de carreteras y haga clic en Propiedades.
  2. En el panel Propiedades de capa, haga clic en la pestaña Origen.

    Haga clic en la pestaña Origen del panel Propiedades de capa.

  3. Haga clic en Fuente de datos para contraer la sección Fuente de datos.

    Contraiga la sección Fuente de datos.

  4. Haga clic en Referencia espacial para expandirla.

    Haga clic en Referencia espacial para expandir la sección Referencia espacial.

    El código WKID para este sistema de coordenadas es 2248.

    El código WKID es 2248.

  5. Haga clic en Cancelar para cerrar el panel Propiedades de capa.

    Ahora utilizará este código WKID para establecer la referencia espacial para el dataset de entidades.

  6. En IDLE, después de la línea que empieza con print(f"The geodatabase, agregue las siguientes líneas de código:

    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")

    Se han agregado líneas para crear el dataset de entidades e imprimir un informe.

    La primera línea ejecuta la herramienta Crear dataset de entidades y le otorga tres parámetros obligatorios. El primer parámetro es la ubicación de la geodatabase donde se creará el dataset de entidades, el segundo es el nombre del dataset de entidades y el tercero es el WKID del sistema de coordenadas para el dataset. La variable new_gdb_path incluye la ruta completa a la base de datos. El nombre del dataset de entidades se asignó previamente a la variable fds.

    Otra forma de establecer el sistema de coordenadas es proporcionar la ruta a una clase de entidad existente, por ejemplo, proporcionando la ruta a la clase de entidad de carreteras en la geodatabase Transportation.gdb.

    La segunda línea imprime una cadena de caracteres con formato para indicar que se creó el nuevo dataset.

    Este es el código completo:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    print(f"The geodatabase {new_gdb} has been created.")
    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")
    ##fcs = arcpy.ListFeatureClasses()
    ##for fc in fcs:
    ##    desc = arcpy.da.Describe(fc)
    ##    sr = desc["spatialReference"]
    ##    print(f"{fc}: {sr.name}")

  7. Guarde y ejecute el código.

    El código se ejecuta y, después de unos momentos, los dos mensajes de estado se imprimen en el shell IDLE.

    El código se ejecuta y se informa del estado.

  8. En ArcGIS Pro, en el panel Catálogo, haga clic con el botón derecho en la carpeta PythonWorkflow y haga clic en Refrescar.

    Se creó la geodatabase Metro_Transport.

  9. Expanda la geodatabase Metro_Transport.

    Se creó el dataset de entidades Metro_Network.

  10. Elimine la geodatabase Metro_Transport.

Utilizar código para copiar clases de entidad condicionalmente

A continuación, utilizará parte del código comentado anteriormente para enumerar en una lista las clases de entidad en la geodatabase Transportation.gdb. Le agregará lógica para verificar si el WKID de referencia espacial de cada clase de entidad es 2248, y codificará para copiar la clase de entidad a la nueva geodatabase cuando esa condición tenga el valor true.

  1. En IDLE, seleccione las líneas de código que comentó anteriormente.
  2. Haga clic en Formato y haga clic en Descomentar región.

    Descomente el código.

    Al descomentar código, se eliminan las almohadillas antes de cada línea, por lo que el código se ejecutará en lugar de interpretarse como un comentario.

    El código descomentado crea una lista de clases de entidad en el espacio de trabajo actual y luego usa la descripción de cada uno de los elementos de la lista para extraer la referencia espacial. Ahora, en lugar de imprimir esa información, la agregará al código para verificar el valor de referencia espacial y copiar la clase de entidad o proyectarla.

    Tanto la herramienta Copiar entidades como la herramienta Proyectar toman una clase de entidad de entrada y producen una clase de entidad de salida. Si bien los nombres de las clases de entidad se pueden mantener iguales, las rutas para las salidas serán diferentes, porque las nuevas clases de entidad estarán en una nueva geodatabase.

    Las clases de entidad de entrada están representadas por la variable fc. Los valores de fc son nombres de clase de entidad derivados de una lista de clases de entidad en el espacio de trabajo actual.

    Por ejemplo, la ruta completa de una de las clases de entidad de entrada es: C:\Lessons\PythonWorkflow\Transportation.gdb\roads

    Debido a que el espacio de trabajo está configurado, los nombres de las clases de entidad, por ejemplo roads, se pueden usar directamente en las herramientas. La ruta completa no es necesaria cuando se trabaja con clases de entidad en el espacio de trabajo actual. Por eso funciona desc = arcpy.da.Describe(fc) o desc = arcpy.da.Describe("roads").

    Sin embargo, debe dar a los parámetros de clase de entidad de salida la ruta completa para las nuevas clases de entidad en el nuevo espacio de trabajo. Esta ruta se puede construir mediante el uso de os.path.join(), al igual que antes en la secuencia de comandos, donde se configuró el entorno.

  3. Seleccione la línea de código que empieza con print(f"{fc}: y reemplácela con la siguiente línea de código:

    new_fc = os.path.join(mypath, new_gdb, fds, fc)

    Esta línea debe estar en el mismo nivel de sangría, dentro del bloque de código de bucle for fc in fcs:.

    En esta línea, la nueva variable, new_fc, se establece igual a la ruta creada al unir la carpeta donde residen los datos (mypath), la nueva geodatabase (new_gdb) y el nuevo dataset de entidades (fds). La última parte de la ruta es el nombre de la nueva clase de entidad, que es la misma que la clase de entidad de entrada (el valor de la variable fc). Esta parte de la ruta cambia con cada iteración del bucle sobre la lista de clases de entidad.

    Con la ruta completa para las clases de entidad de salida creadas, está listo para agregar código para decidir si copiar o proyectar cada clase de entidad en función del sistema de coordenadas. En Python, puede probar diferentes condiciones mediante el uso de instrucciones if y hacer que se ejecuten diferentes bloques de código dependiendo de si una condición de la instrucción tiene el valor true o no.

  4. Después de la línea new_fc = os.path.join, en el mismo nivel de sangría (dentro del bucle for), agregue la siguiente línea de código:

    if sr.factoryCode == 2248:

    Este código verifica si el WKID de la clase de entidad, almacenado en el objeto sr como su valor factoryCode, coincide con el WKID del sistema de coordenadas State Plane Maryland de 2248.

    Utiliza una instrucción if y una expresión y termina con el símbolo de dos puntos para indicar que sigue un bloque de código que se ejecutará si la instrucción tiene valor true.

    La instrucción utiliza un signo igual doble. En Python, se usa un solo signo igual para establecer una variable en un valor, y un signo igual doble para verificar la igualdad.

  5. Haga clic al final de esta línea de código y pulse Intro.

    Esto da como resultado la sangría correcta para la siguiente línea de código, con cuatro espacios de sangría en relación con la línea de instrucción if. Este es el comienzo de un nuevo bloque de código que se ejecutará solo si sr.factoryCode es igual al valor 2248.

    Con la ruta completa para las clases de entidad de salida creadas y la prueba del sistema de coordenadas satisfecha, puede agregar código para copiar la clase de entidad.

  6. Agregue las siguientes líneas de código en la línea recién sangrada:

    arcpy.CopyFeatures_management(fc, new_fc)
            print(f"The feature class {fc} has been copied.")

    La primera línea ejecuta la herramienta Copiar entidades, copiando la clase de entidad actual a la nueva geodatabase.

    La segunda línea imprime una cadena de caracteres con formato para indicar que se creó el nuevo dataset.

    Este es el código completo:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    print(f"The geodatabase {new_gdb} has been created.")
    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        new_fc = os.path.join(mypath, new_gdb, fds, fc)
        if sr.factoryCode == 2248:
            arcpy.CopyFeatures_management(fc, new_fc)
            print(f"The feature class {fc} has been copied.")

    La lógica para copiar la clase de entidad entre geodatabases cuando el WKID es 2248 se agrega a la secuencia de comandos

  7. Guarde y ejecute el código.

    Se copian las clases de entidad coincidentes.

    El código se ejecuta. Este crea la geodatabase y el dataset de entidades, y copia las cinco capas que estaban en el sistema de coordenadas State Plane Maryland.

  8. En ArcGIS Pro, en el panel Catálogo, refresque la carpeta PythonWorkflow.
  9. Refresque la geodatabase Metro_Transport y expándala.
  10. Refresque el dataset de entidades Metro_Network y expándalo.

    Las cinco clases de entidad se copian en la nueva geodatabase.

    La geodatabase y el dataset contienen las clases de entidad que coinciden con el sistema de coordenadas del dataset.

Agregar código para proyectar clases de entidad condicionalmente

El último paso para completar la secuencia de comandos es agregar lógica para usar la herramienta Proyectar para proyectar las clases de entidad que no están en el sistema de coordenadas State Plane Maryland y escribir los resultados en el dataset de entidad de la nueva geodatabase.

  1. En IDLE, haga clic al final de la línea de código que empieza con print(f"The feature class y pulse Intro.
  2. Pulse la tecla Retroceso para reducir la sangría en un nivel.

    Agregará una instrucción else, que debe tener el mismo nivel de sangría que la instrucción if anterior.

    Las instrucciones else se utilizan para ejecutar un bloque de código diferente cuando la instrucción if tiene el valor false.

  3. En la línea nueva con menos sangría, agregue las siguientes líneas de código:

    else:
            arcpy.Project_management(fc, new_fc, 2248)
            print(f"The feature class {fc} has been projected.")

    Las instrucciones if y else están en el mismo nivel de sangría.

    La instrucción else crea una rama lógica con un bloque de código que se ejecutará después de que se verifique la instrucción if en los casos en que no tenga el valor true. La lógica es la siguiente: si el WKID es 2248, copie la clase de entidad y, si no lo es, proyecte la clase de entidad.

    La segunda de estas líneas tiene una sangría de cuatro espacios porque pertenece al bloque de código que se ejecuta en la condición else. La herramienta Proyectar proyecta la clase de entidad de entrada en el sistema de coordenadas State Plane Maryland y la clase de entidad de salida se almacena en la nueva geodatabase. Los parámetros de la herramienta Proyectar son la clase de entidad de entrada, la clase de entidad de salida y el sistema de coordenadas de salida (el WKID 2248 se usa para este parámetro).

    Nota:
    Hay un cuarto parámetro de la herramienta Proyectar, que es una transformación opcional. Cuando ejecutó la herramienta Proyectar anteriormente, vio que se necesita una transformación entre el sistema de coordenadas geográficas NAD 1983 y el sistema de coordenadas geográficas WGS 1984, pero de forma predeterminada se selecciona la transformación adecuada cuando se ejecuta la herramienta. Esto significa que aquí no hay necesidad de especificar una transformación en el código.

    En función de los resultados anteriores de la comprobación del sistema de coordenadas de todas las clases de entidad, sabe que las clases de entidad que aún no están en el sistema de coordenadas State Plane Maryland están en un sistema de coordenadas geográficas específico. Sin embargo, no es necesario especificar este sistema de coordenadas en concreto. Al utilizar una instrucción else, la herramienta Proyectar se ejecuta para todas las clases de entidad donde la instrucción if tiene el valor false, independientemente del sistema de coordenadas específico.

    Este es el código completo:

    import arcpy
    import os
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    print(f"The geodatabase {new_gdb} has been created.")
    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        new_fc = os.path.join(mypath, new_gdb, fds, fc)
        if sr.factoryCode == 2248:
            arcpy.CopyFeatures_management(fc, new_fc)
            print(f"The feature class {fc} has been copied.")
        else:
            arcpy.Project_management(fc, new_fc, 2248)
            print(f"The feature class {fc} has been projected.")

    El código completo de la secuencia de comandos

  4. Guarde y ejecute el script.

    El código se ejecuta. Este crea la geodatabase y el dataset de entidades, copia las cinco capas que estaban en el sistema de coordenadas State Plane Maryland y proyecta las cinco capas que estaban en el sistema de coordenadas WGS84.

    Resultados finales de la ejecución del código

  5. En ArcGIS Pro, en el panel Catálogo, refresque el dataset de entidades Metro_Network.

    El dataset contiene todas las clases de entidad, todas en el sistema de coordenadas correcto.

    Geodatabase final con todas las clases de entidad

    Su código está funcionando y, en este punto, podrá crear la red geométrica.

Agregar comentarios a la secuencia de comandos

Esta es una secuencia de comandos relativamente simple, pero se recomienda que incluya comentarios en su código para que sea más fácil de entender. Los comentarios se pueden utilizar para explicar el propósito de la secuencia de comandos e identificar los pasos clave. Esto hará que sea más fácil para otros entender su secuencia de comandos y modificarla para su propio propósito. También le facilitará la comprensión del código, si lo deja por un tiempo y luego necesita volver para modificarlo.

Los comentarios empiezan con una o más almohadillas. Los comentarios pueden empezar al principio de una línea o pueden agregarse al final de una línea de código.

  1. En IDLE, agregue una nueva línea al comienzo de la secuencia de comandos.
  2. Copie y pegue los siguientes comentarios en la nueva línea:

    # Author: your name
    # Date: the date
    # Purpose: This script reads all the feature classes in a
    # geodatabase and copies them to a new feature dataset in
    # a new geodatabase. Feature classes not already in the
    # target coordinate system are projected.

  3. Edite las líneas Author y Date para incluir su nombre y la fecha actual.
  4. Antes de la línea import arcpy, agregue dos líneas nuevas y, en la segunda línea, agregue el siguiente comentario:

    # Imports

    La línea en blanco no afectará al código y lo hace más legible. El comentario identifica que esta sección importa las bibliotecas necesarias para el código. Las importaciones suelen juntarse cerca de la parte superior de una secuencia de comandos.

  5. Agregue dos nuevas líneas después de la línea import os y agregue el siguiente comentario:

    # Variables for paths, outputs, workspaces

    Este comentario identifica dónde se establecen por primera vez estas variables.

  6. Agregue dos nuevas líneas después de la línea arcpy.env.overwriteOutput = True y agregue el siguiente comentario:

    # Create a new geodatabase and dataset

  7. Agregue dos nuevas líneas antes de la línea fcs = arcpy.ListFeatureClasses() y agregue el siguiente comentario:

    # Create a list of feature classes in the workspace

  8. Después de la línea if sr.factoryCode == 2248:, agregue el siguiente comentario en la misma línea:

     # WKID of target coordinate system

    Ha agregado comentarios para explicar el código.

    Este es el código completo:

    # Author: your name
    # Date: the date
    # Purpose: This script reads all the feature classes in a
    # geodatabase and copies them to a new feature dataset in
    # a new geodatabase. Feature classes not already in the
    # target coordinate system are projected.
    
    # Imports
    import arcpy
    import os
    
    # Variables for paths, outputs, workspaces
    mypath = "C:/Lessons/PythonWorkflow"
    gdb = "Transportation.gdb"
    new_gdb = "Metro_Transport.gdb"
    fds = "Metro_Network"
    arcpy.env.workspace = os.path.join(mypath, gdb)
    arcpy.env.overwriteOutput = True
    
    # Create a new geodatabase and dataset
    new_gdb_path = arcpy.CreateFileGDB_management(mypath, new_gdb)
    print(f"The geodatabase {new_gdb} has been created.")
    arcpy.CreateFeatureDataset_management(new_gdb_path, fds, 2248)
    print(f"The feature dataset {fds} has been created.")
    
    # Create a list of feature classes in the workspace
    fcs = arcpy.ListFeatureClasses()
    for fc in fcs:
        desc = arcpy.da.Describe(fc)
        sr = desc["spatialReference"]
        new_fc = os.path.join(mypath, new_gdb, fds, fc)
        if sr.factoryCode == 2248: # WKID of target coordinate system
            arcpy.CopyFeatures_management(fc, new_fc)
            print(f"The feature class {fc} has been copied.")
        else:
            arcpy.Project_management(fc, new_fc, 2248)
            print(f"The feature class {fc} has been projected.")

    Secuencia de comandos final con comentarios

  9. Guarde el script.

En este tutorial, ha aprendido lo siguiente:

  • Las secuencias de comandos de Python se pueden usar para automatizar tareas repetitivas en flujos de trabajo de SIG.
  • ArcPy incluye varias funciones para crear listas de datasets.
  • Al enumerar y describir datasets utilizando código Python, puede crear un inventario detallado de los datasets SIG en un espacio de trabajo. A continuación, puede decidir procesar cada dataset de manera diferente según sus características.
  • Es necesaria una manipulación cuidadosa de las rutas y los nombres de los archivos para garantizar resultados correctos.

Puede que también le interesen los cursos de escritura de scripts en Python para ArcGIS Pro y scripts avanzados en Python para ArcGIS Pro, desarrollados por el Dr. Paul A. Zandbergen y publicados por Esri Press.