¿Extraer por atributo usando ModelBuilder con la entrada del usuario?

11

Con ModelBuilder, quiero crear una herramienta que permita al usuario elegir el valor o los valores que se utilizarán para extraer un archivo de forma.

Tengo una capa de parcela con un campo "Parcel_Type". Quiero que el usuario pueda elegir el tipo de paquete para extraer. Entonces, si el usuario desea extraer las parcelas con un tipo "EL", entonces solo tendrá que ingresar "EL" como variable. Si quiere escribir "EL" y "CDD", debe ingresarlos como variables múltiples. Esa sería la única interacción humana con el modelo.

Entonces, ¿cómo puedo usar esas variables en mi modelo?

Dom
fuente

Respuestas:

14

Este tipo de operación casi siempre implica escribir una cláusula WHERE, así que creo que usar al menos un poco de Python está en orden.

Además, si bien esto es posible con ModelBuilder, IMO, crear una herramienta de script Python con validación personalizada y un mayor control sobre la configuración de los parámetros podría proporcionar una mejor experiencia del usuario, por ejemplo, al hacer que los menús desplegables de parámetros Field y MultiValue * puede elegir valores en lugar de tener que escribirlos.

* posiblemente, en realidad no estoy seguro acerca de los parámetros MultiValue

Sin embargo, dado que es un ejercicio más avanzado para otro tema, me atendré al enfoque de ModelBuilder, usando Python solo para crear la cláusula WHERE:

  1. Crea un nuevo modelo
  2. Cree variables (haga clic con el botón derecho en el lienzo vacío y haga clic en Agregar variable ) para los parámetros de Capa de función , Campo y Valor múltiple de entrada .
  3. Haga clic con el botón derecho en cada uno de estos y seleccione Parámetro de modelo
  4. Agregue una herramienta Calcular valor (Gestión de datos) al lienzo. Conecte las 3 variables como condiciones previas (solo para mostrar en este caso, pero puede hacer una diferencia en el orden de ejecución en otras situaciones).
  5. Haga doble clic en la herramienta Calcular valor para configurarlo:

    5a. Copie / pegue lo siguiente en el cuadro Expresión (ajústelo para que coincida con los nombres de sus variables):

    buildWhereClauseMultiValue(r"%Feature Layer%","%Field%","%Values%")

    5b. Copie / pegue lo siguiente en el cuadro Bloque de código :

    import arcpy
    
    def buildWhereClauseMultiValue(table, field, values):
        """Takes a semicolon-delimited list of values and constructs a SQL WHERE
        clause to select those values within a given field and table."""
    
        # Add DBMS-specific field delimiters
        fieldDelimited = arcpy.AddFieldDelimiters(arcpy.Describe(table).path, field)
    
        # Split multivalue at semicolons and strip quotes
        valueList = [value[1:-1] if (value.startswith("'") and value.endswith("'")) else value for value in values.split(';')]
    
        # Determine field type
        fieldType = arcpy.ListFields(table, field)[0].type
    
        # Add single-quotes for string field values
        if str(fieldType) == 'String':
            valueList = ["'%s'" % value for value in valueList]
    
        # Format WHERE clause in the form of an IN statement
        whereClause = "%s IN(%s)" % (fieldDelimited, ', '.join(valueList))
        return whereClause
    

    5c. Establezca el tipo de datos de salida para que sea una Expresión SQL .

    5d. Haga clic en Aceptar y haga clic con el botón derecho en la variable de salida de la herramienta Calcular valor y cámbiele el nombre a algo más descriptivo como "Cláusula WHERE".

  6. Agregue una herramienta Seleccionar capa por atributo (gestión de datos) al lienzo. Conecte las variables de la Capa de entidades y la Cláusula WHERE a la herramienta Seleccionar capa por atributo.
  7. Agregue una herramienta Copiar características (Gestión de datos) al lienzo. Conecte la salida de la herramienta Seleccionar capa por atributo a la herramienta Copiar características. Haga clic con el botón derecho en la variable Clase de entidad de salida y verifique el Parámetro modelo y (opcionalmente) las opciones Agregar a visualización

    En este punto, debería verse más o menos así: Modelo de lona

  8. En el menú Modelo -> Propiedades del modelo, asígnele un buen nombre y etiqueta y guárdelo y ciérrelo.

  9. Haga doble clic en el modelo en ArcToolbox para que aparezca el cuadro de diálogo del modelo. Ingrese sus parámetros y haga clic en Aceptar. Debe exportar las entidades seleccionadas a una nueva clase de entidad y agregarla al mapa (si marcó "Agregar a visualización" en la clase de entidad de salida).

    Diálogo de modelo

NOTAS

  • Siempre puede codificar valores y no "parametrizar" variables que no desea que el usuario cambie como la capa de entidades o los parámetros de campo. Simplemente me gusta tener herramientas que sean genéricas / reutilizables, así que hice esos parámetros del modelo. De hecho, lo que haría es simplemente arrastrar y soltar el modelo genérico en un nuevo modelo y luego establecer sus parámetros predefinidos, de esa manera puede hacer varios modelos "envolvedores" predefinidos diferentes, pero solo tener un modelo subyacente haciendo el trabajo, por lo que Si necesita cambiar su funcionalidad, solo tiene que cambiarlo en un solo lugar.

  • Si tiene suerte como yo, no tendrá que validar el modelo y proporcionar algunos datos ficticios solo para eliminarlo después de la validación (tenga en cuenta que todos los elementos del modelo están en blanco / blanco, lo que significa que no están "listos para ejecutarse" - pero pude ejecutarlo de todos modos al completar los parámetros en el diálogo del modelo).

blah238
fuente
3

También puede usar una herramienta de geoprocesamiento simple llamada Seleccionar para lograr este flujo de trabajo si sus requisitos de GUI no son para el diálogo preciso ilustrado por @ blah238.

Use la ventana Buscar para encontrarlo o vaya a ArcToolbox> Herramientas de análisis> Extraer> Seleccionar.

La herramienta Seleccionar (Análisis) le permite extraer entidades utilizando cualquier campo (atributo) de una clase de entidad.

Mate
fuente