Wyodrębnianie według atrybutu za pomocą ModelBuilder z danymi wprowadzanymi przez użytkownika?

11

Korzystając z ModelBuilder, chcę utworzyć narzędzie, które pozwoli użytkownikowi wybrać wartość lub wartości, które zostaną użyte do wyodrębnienia pliku kształtu.

Mam warstwę działki z polem „Parcel_Type”. Chcę, aby użytkownik mógł wybrać typ paczki do wyodrębnienia. Jeśli więc użytkownik chce wyodrębnić paczki typu „EL”, musiałby jedynie wpisać „EL” jako zmienną. Jeśli chce wpisać „EL” i „CDD”, musi wprowadzić je jako wiele zmiennych. To byłaby jedyna interakcja człowieka z modelem.

Jak mogę używać tych zmiennych w moim modelu?

Dom
źródło

Odpowiedzi:

14

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:

  1. Utwórz nowy model
  2. 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 .
  3. Kliknij każdy z nich prawym przyciskiem myszy i wybierz Parametr modelu
  4. 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).
  5. 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”.

  6. 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.
  7. 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: Model Canvas

  8. W menu Model -> Właściwości modelu nadaj mu dobrą nazwę i etykietę oraz zapisz i zamknij.

  9. 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).

    Okno dialogowe modelu

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).

blah238
źródło
3

Możesz także użyć jednego prostego narzędzia geoprzetwarzania o nazwie Select, aby osiągnąć ten przepływ pracy, jeśli twoje wymagania GUI nie dotyczą precyzyjnego okna dialogowego zilustrowanego przez @ blah238.

Aby go znaleźć, użyj okna wyszukiwania lub przejdź do ArcToolbox> Narzędzia analizy> Wyodrębnij> Wybierz.

Narzędzie Wybierz (Analiza) pozwala wyodrębnić elementy przy użyciu dowolnego pola (atrybutu) z klasy elementów.

Matt
źródło