Ten typ operacji prawie zawsze wymaga napisania klauzuli WHERE, więc myślę, że użycie przynajmniej odrobiny Pythona jest w porządku.
Chociaż jest to możliwe w przypadku ModelBuilder, IMO, utworzenie narzędzia skryptowego Python z niestandardową weryfikacją i większą kontrolą nad ustawieniami parametrów może zapewnić lepszą obsługę - na przykład przez utworzenie menu rozwijanych parametrów Field i MultiValue * , które możesz wybierać wartości zamiast wpisywać je.
* być może nie jestem pewien parametrów MultiValue
Ponieważ jednak jest to bardziej zaawansowane ćwiczenie na inny temat, pozostanę przy podejściu ModelBuilder, używając Pythona tylko do utworzenia klauzuli WHERE:
- Utwórz nowy model
- Utwórz zmienne (kliknij prawym przyciskiem myszy puste płótno i kliknij opcję Dodaj zmienną ) dla wejściowych parametrów Warstwy obiektów , Pola i Wartości .
- Kliknij każdy z nich prawym przyciskiem myszy i wybierz Parametr modelu
- Dodaj narzędzie Obliczanie (zarządzanie danymi) do kanwy. Podłącz do niego 3 zmienne jako warunki wstępne (w tym przypadku tylko na pokaz, ale w innych sytuacjach może to zmienić kolejność wykonywania).
Kliknij dwukrotnie narzędzie Oblicz wartość, aby je skonfigurować:
5a. Skopiuj / wklej następujące elementy w polu Wyrażenie (dostosuj, aby pasowały do nazw zmiennych):
buildWhereClauseMultiValue(r"%Feature Layer%","%Field%","%Values%")
5b. Skopiuj / wklej następujące elementy w polu Blok kodu :
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. Ustaw typ danych wyjściowych na Wyrażenie SQL .
5d. Kliknij Ok i kliknij prawym przyciskiem myszy zmienną wyjściową z narzędzia Oblicz wartość i zmień jej nazwę na coś bardziej opisowego, np. „GDZIE Klauzula”.
- Dodaj do kanwy narzędzie Wybierz warstwę według atrybutu (zarządzanie danymi) . Połącz zmienne Warstwa obiektów i klauzula WHERE z narzędziem Wybierz warstwę według atrybutu.
Dodaj narzędzie Kopiuj funkcje (zarządzanie danymi) do kanwy. Połącz dane wyjściowe narzędzia Wybierz warstwę według atrybutu z narzędziem Funkcje kopiowania. Kliknij prawym przyciskiem zmienną Wyjściowa klasa elementów i sprawdź parametr modelu i (opcjonalnie) opcje Dodaj do wyświetlania .
W tym momencie powinno to wyglądać mniej więcej tak:
W menu Model -> Właściwości modelu nadaj mu dobrą nazwę i etykietę oraz zapisz i zamknij.
Kliknij dwukrotnie model w ArcToolbox, aby wyświetlić okno dialogowe modelu. Wprowadź swoje parametry i kliknij OK. Powinien wyeksportować wybrane obiekty do nowej klasy obiektów i dodać je do mapy (jeśli zaznaczyłeś opcję „Dodaj do ekranu” w wyjściowej klasie obiektów).
UWAGI:
Zawsze możesz na stałe zakodować wartości i nie „sparametryzować” zmiennych, których nie chcesz, aby użytkownik zmieniał, np. Parametry warstwy obiektów lub parametry pola. Po prostu lubię mieć narzędzia ogólne / wielokrotnego użytku, więc stworzyłem parametry modelu. W rzeczywistości chciałbym po prostu przeciągnąć i upuścić model ogólny do nowego modelu, a następnie ustawić predefiniowane parametry - w ten sposób można utworzyć kilka różnych predefiniowanych modeli „otokowych”, ale tylko jeden model podstawowy wykonuje tę pracę, więc jeśli chcesz zmienić jego funkcjonalność, musisz zmienić tylko w jednym miejscu.
Jeśli masz szczęście, tak jak ja, nie będziesz musiał sprawdzać poprawności modelu i podawać danych zastępczych, aby go usunąć po sprawdzeniu poprawności (zwróć uwagę, że wszystkie elementy modelu są puste / białe, co oznacza, że nie są „gotowe do uruchomienia” - ale udało mi się go uruchomić po wypełnieniu parametrów w oknie dialogowym modelu).