¿Exportar datos desde la salida de Recoger valores en ArcGIS ModelBuilder?

11

Actualmente estoy jugando con ModelBuilder. He agregado una foto del modelo que tengo en este momento.

Este modelo actualmente está iterando 6 archivos de forma, por lo que cada uno de los 'valores de salida' contiene 6 figuras en una lista. No puedo encontrar una manera de extraer los valores de estas listas en una tabla / archivo de texto o similar.

¿Hay alguna forma de hacer esto?

modelo

Esto es lo que se muestra cuando abro 'valores de salida' después de ejecutar el modelo: ingrese la descripción de la imagen aquí

Solo quiero tomar esos 6 números de alguna manera ...

JPD
fuente
Esto es básicamente lo mismo que preguntas aquí ¿correcto? gis.stackexchange.com/questions/25922/… Recopilar valores hace exactamente eso. Si lee la ayuda, le dirá que recopila valores que pueden pasarse a otra herramienta. Entonces, ¿qué estás tratando de hacer con los valores? ¿Es solo registrarlos en un archivo o los necesita para su posterior procesamiento?
theJones
Solo quiero registrarlos en un archivo. No puedo encontrar una herramienta para alimentar los valores de salida en el generador de modelos para extraerlos.
JPD

Respuestas:

17

Puede hacerlo utilizando la herramienta Calcular valor (gestión de datos) y algo de magia de Python. Consulte también esta pregunta relacionada: ¿ Agregar código arbitrario al generador de modelos Arcgis?

Una variable de valores múltiples es solo una cadena de valores delimitada por punto y coma, por lo que la multivaluesToCsvfunción siguiente es dividir las variables de valores múltiples en listas y transponerlas en filas que luego se escriben en un archivo de texto CSV (valores separados por comas) .

Los iteradores de modelos ejecutan TODOS los procesos en el modelo una vez por iteración; esto no es deseable para nuestra herramienta Calcular valor, que solo queremos ejecutar una vez al final. La forma de lograr esto es creando otro modelo externo para envolver el modelo interno original. Esto se discute en el tema de ayuda Integración de un modelo dentro de un modelo .

Esto es lo que debe hacer para que esto funcione:

Modelo interno : Itera las clases de entidad, las procesa y recopila valores:

  1. En su modelo original, que será nuestro modelo "interno", agregue otra herramienta Recopilar valores para recopilar los Namevalores de la variable y así poder asignar los valores de la estadística de distancia a sus nombres de clase de entidad correspondientes.
  2. Exponga las variables de entrada y salida como parámetros del modelo (haga clic con el botón derecho en un óvalo y verifique el Parámetro del modelo). Haga esto para cada una de las salidas de las herramientas Recopilar valor, así como para cualquier parámetro de entrada que necesite, como el Espacio de trabajo de entrada.
  3. Guarde y cierre el modelo interno.

Modelo externo : ejecuta el modelo interno, ejecuta la herramienta Calcular valor solo una vez cuando se completa el modelo interno:

  1. Cree un nuevo modelo: este será nuestro modelo "externo".
  2. Agregue una variable de tipo Folderque le permita especificar dónde crear el archivo CSV de salida.
  3. Agregue una variable de tipo Stringque le permita especificar el nombre del archivo CSV de salida.
  4. Agregue el modelo interno al nuevo modelo (arrastre y suelte desde ArcToolbox o haga clic con el botón derecho y agregue datos o herramienta, busque el modelo interno y haga clic en Agregar)
  5. Cree variables para cualquier parámetro del modelo interno que desee poder establecer desde el modelo externo, como el Espacio de trabajo de entrada (haga clic con el botón derecho en el modelo interno y elija Crear parámetro de variable a partir de).
  6. Agregue la herramienta Calcular valor al nuevo modelo
  7. Pegue lo siguiente en los cuadros apropiados de la herramienta Calcular valor:

    Expresión :

    multivaluesToCsv(r"%Output CSV File Location%", "%Output CSV File Name%", "%Feature Class Names%", "%Minimum Distance Values%", "%Average Distance Values%", "%Maximum Distance Values%")
    • Esto utiliza la sustitución de variables en línea para pasar las variables del modelo a la función. Ajuste para que coincida con los nombres de variables de su modelo.
    • Lo ranterior "%Output CSV File Location%"es significativo: esto indica que se trata de una cadena sin formato ; Debido a que las rutas del sistema de archivos de Windows generalmente contienen barras invertidas (un carácter de escape en Python), tenemos que usar esto para evitar que Python malinterprete las barras invertidas y los caracteres posteriores como secuencias de caracteres especiales.
    • Asegúrese de poner comillas alrededor de las variables en línea porque sin ellas Python pensará que son identificadores en lugar de cadenas.

    Bloque de código:

    import os, csv
    
    def multivaluesToCsv(csvfilepath, csvfilename, fcnames, minvalues, avgvalues, maxvalues):
        ext = 'csv' # Define output file extension (e.g. csv or txt)
        header = ['FC', 'MIN', 'AVG', 'MAX'] # Define header row (column names)
    
        # Join CSV file path and name, adding extension if necessary
        csvfile = os.path.join(csvfilepath, os.extsep.join((csvfilename, ext)) if not os.path.splitext(csvfilename)[1].lower().endswith(ext) else csvfilename)
    
        # Open text file for writing
        with open(csvfile, 'wb') as f:
            w = csv.writer(f)
            w.writerow(header) # Write header row
            rows = zip(*map(lambda x: x.split(';'), [fcnames, minvalues, avgvalues, maxvalues])) # Transpose the semicolon-delimited values into rows
            w.writerows(rows)
        return csvfile
  8. (Opcional) Exponga las variables de entrada y salida como parámetros del modelo si desea poder ejecutarlas desde el cuadro de diálogo de herramientas del modelo o encadenarlas junto con otros modelos / scripts. El único resultado del modelo externo es el archivo CSV.

  9. (Opcional) Conecte las variables de entrada y las salidas del modelo interno a la herramienta Calcular valor como condiciones previas. No creo que esto realmente tenga ningún efecto, solo aclara visualmente lo que está sucediendo.

He probado esto con ModelBuilder y lo he puesto a funcionar (ver capturas de pantalla).

Modelo interno : Modelo interno

Modelo exterior: Modelo exterior

El modelo interno ejecuta todos sus procesos una vez por clase de entidad, y luego la herramienta Calcular valor se ejecuta una vez al final para generar el archivo CSV una vez y solo una vez.

blah238
fuente
Hola, gracias por poner tanto esfuerzo en tu respuesta y disculpas por mi respuesta tardía. Estoy tratando de ejecutar el modelo como lo describiste, pero estoy teniendo problemas con el CSV. Hice un archivo CSV en blanco en Excel y lo guardé, luego lo cargué en el modelo. ERROR 000539: Error al ejecutar la expresión: multivaluesToCsv (r "% CSV File%", "% FC Name Values%", "% Minimum Values%", "% Average Values%", "% Maximum Values%") <excepciones de tipo .IOError '>: [Errno 13] Permiso denegado: u'% Archivo CSV% 'Error al ejecutar (Calcular valor). Sigo recibiendo este error. Mi CSV se llama CSVFile.csv.
JPD
1
Simplemente lo arreglé: esta es la solución perfecta. ¡Muchas gracias por su ayuda!
JPD
El código Python creará el archivo CSV por usted, no es necesario crearlo de antemano. Sin embargo, como ha visto, si abre el archivo en Excel, eso bloquea el archivo y Python no puede escribirlo hasta que lo cierre.
blah238
2
Para su información, he actualizado las instrucciones y las capturas de pantalla para usar modelos anidados para evitar que Calcular Valor se ejecute varias veces, así como para solucionar el problema donde el archivo de texto tenía que existir de antemano (ahora especifica su ubicación de salida y el nombre del archivo como dos parámetros separados).
blah238
Excelente respuesta! Me ayudó a resolver un problema similar al generar estadísticas de validación cruzada de capa geoestadística en un archivo csv. Gracias @ blah238!
Cotton.Rockwood
1

El resultado que describe su modelo es simplemente un valor actualizado en la tabla de atributos, ¿no es así? ¿No puede simplemente abrir el archivo .dbf asociado con el archivo de forma actualizado?

De lo contrario, la selección de tabla (Herramientas de análisis> Extracto) debería funcionar con una consulta SQL.

veedub
fuente
Hola, Gracias por tu respuesta. Me temo que no actualiza el archivo .dbf de cada archivo de forma. Agregar 'Selección de tabla' al generador de modelos tampoco funciona, ya que no puedo conectar 'Distancia mínima / media / máxima' o 'Valores de salida' como entrada para la herramienta.
JPD