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:
- Crea un nuevo modelo
- 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 .
- Haga clic con el botón derecho en cada uno de estos y seleccione Parámetro de modelo
- 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).
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".
- 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.
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í:
En el menú Modelo -> Propiedades del modelo, asígnele un buen nombre y etiqueta y guárdelo y ciérrelo.
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).
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).