7 votos

¿Colapsar la estructura de carpetas en una sola carpeta utilizando ArcGIS ModelBuilder?

Tengo una sola carpeta, llamémosla Carpeta1, que contiene varias carpetas; CarpetaA, CarpetaB, CarpetaC.....FolderZ.

Las carpetas de la A a la Z contienen cada una de ellas múltiples bases de datos de archivos. Las carpetas A-Z no contienen ningún otro tipo de archivo ni ninguna otra carpeta.

Necesito copiar todas las geodatabases de archivos que están en las carpetas A - Z en una sola carpeta en otro lugar de mi disco local.

Estoy tratando de hacer esto en ModelBuilder ya que tengo muy poca experiencia en python.

Pensé que podría conseguirlo fácilmente utilizando un modelo (imagen adjunta "MainModel")y un submodelo ("SubModel")

Mi modelo principal tiene una variable de carpeta establecida como parámetro de entrada (esta sería Carpeta1). Esto alimenta un iterador Iterate Workspaces. Lo he configurado para que sólo busque carpetas (aquí quiero que devuelva FolderA, FolderB, FolderC....FolderZ).

MainModel

Utilizo el espacio de trabajo de salida de aquí para alimentar mi submodelo como un parámetro.

El submodelo tiene un parámetro de carpeta como entrada (este es el "Espacio de Trabajo" de MainModel, en teoría debería ser FolderA, FolderB etc....). Esto luego se alimenta en un iterador de espacios de trabajo y busca FileGDB's. La salida de "Worksapce" luego se alimenta en la herramienta de copia que copia la geodatabase en una carpeta predefinida en mi unidad local.

SubModel

Puedo ejecutar el SubModelo por sí solo y funciona bien, es decir, puedo apuntarlo a la Carpeta A y copiará todas las geodatabases de archivos de la CarpetaA en otra carpeta. El problema surge cuando intento trabajar desde el MainModel.

En el MainModel, puedo conectar la salida del "Espacio de trabajo" en el SubModel y me deja seleccionar la variable "Carpeta" para ello. Sin embargo, el modelo no se llena de color, y si abro la ventana de parámetros de la herramienta veo el error (archivo adjunto "Error840").

Error840

He probado a cambiar las variables de cada modelo para que sean carpetas o espacios de trabajo o una combinación, y he probado a configurar los iteradores para que busquen sólo carpetas o sólo GDB o incluso he dejado el campo "Tipo de espacio de trabajo" en blanco. Pero nada parece funcionar.

Lo único que he conseguido hacer donde he tenido un éxito parcial es utilizar un único modelo (adjunto "AlternateModel"). Este utiliza la opción recursiva en las propiedades del iterador y tiene Folder1 como parámetro de la variable Folder de entrada.

AlternateModel

De este modo, se copian todas las geodatabases necesarias de todas las carpetas (A-Z), pero también se copian todas las carpetas (A-Z).

¿Hay algo sencillo que se me escapa?

7voto

John Kramlich Puntos 286

Parece que has encontrado un error en ModelBuilder, pero afortunadamente hay una solución.

En su modelo maestro inserte una herramienta de cálculo de valores, Espacio de trabajo es una condición previa para ello. En la herramienta Calcular, escriba la expresión como se muestra a continuación y asegúrese de que el tipo de datos de salida esté configurado como carpeta . A continuación, puedes conectarlo a tu submodelo, para que todo funcione.

Using Calculate Value to change data type

6voto

TravelBub Puntos 6

He creado lo que creo que es el funcionamiento independiente de python script para hacer esto. Aquí está la estructura del archivo de prueba que he creado:

Testing folder structure

Aquí está el python script para copiar cada FGDB de las carpetas padre y posteriores C:\Folder1 a otro directorio que he creado llamado C:\Folder1Copy

import arcpy
import os

#Set parent directory
arcpy.env.workspace = r'C:\Folder1'

#List the subfolders in the parent directory 
workspaces = arcpy.ListWorkspaces("*", "Folder")

for workspace in workspaces:
    #Set new environment to list workspaces
    arcpy.env.workspace = workspace
    fgdbs = arcpy.ListWorkspaces("*", "FileGDB")

    #Iterate through each FileGDB contained within and copy to destination 
    for fgdb in fgdbs:
        #parsing the name from the full path of each FGDB
        #name = os.path.basename(fgdb).rstrip(os.path.splitext(fgdb)[1])
        name = os.path.basename(fgdb)[:-4]
        arcpy.Copy_management(fgdb, "C:/Folder1Copy/{0}.gdb".format(name))

Este fue el resultado final:

Copied FGDBs in new directory

0 votos

El operador pidió una solución de ModelBuilder, pero es bueno tener una solución de Python también. Mi primer instinto habría sido utilizar arpcy.da.Walk pero he encontrado que es bastante inconsistente, así que +1 por el uso de ListWorkspaces .

0 votos

Muchas gracias por el python script, de hecho esto sería una forma mucho más ordenada de hacer lo que estoy tratando de hacer. He probado tu script pero no parece funcionar del todo. Tengo una carpeta de prueba con 2 carpetas que contienen cada una GDB. El script sólo parece copiar los GDB de una de estas carpetas. He añadido algunas sentencias de impresión en su script para ver las listas que está generando. La primera lista "workspaces" devuelve todas las carpetas, sin embargo, la segunda lista "fgdbs" sólo devuelve los fgdb de la segunda carpeta. ¿Alguna idea?

0 votos

No soy un gurú de python pero creo que es la línea que define el nombre de la variable la que está causando el problema. He comentado la línea y colocado una que funciona.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X