Estrazione per attributo utilizzando ModelBuilder con input utente?


11

Utilizzando ModelBuilder, voglio creare uno strumento che consenta a un utente di scegliere il valore oi valori che verranno utilizzati per estrarre un file di forma.

Ho un livello pacchi con un campo "Parcel_Type". Voglio che l'utente sia in grado di scegliere il tipo di pacco da estrarre. Pertanto, se l'utente desidera estrarre i pacchi con un tipo "EL", dovrà inserire "EL" come variabile. Se vuole digitare "EL" e "CDD", deve inserirli come multi-variabili. Sarebbe l'unica interazione umana con il modello.

Quindi, come posso usare quelle variabili nel mio modello?

Risposte:


14

Questo tipo di operazione comporta quasi sempre la scrittura di una clausola WHERE, quindi penso che usare almeno un po 'di Python sia in ordine.

Inoltre, sebbene ciò sia possibile con ModelBuilder, IMO, la creazione di uno strumento di script Python con convalida personalizzata e un maggiore controllo sulle impostazioni dei parametri potrebbe fornire una migliore esperienza utente, ad esempio rendendo i menu a discesa dei parametri Field e MultiValue * che puoi scegliere i valori invece di doverli digitare.

* probabilmente, in realtà non sono sicuro dei parametri MultiValue

Tuttavia, poiché si tratta di un esercizio più avanzato per un altro argomento, mi atterrò all'approccio ModelBuilder, usando Python solo per creare la clausola WHERE:

  1. Crea un nuovo modello
  2. Crea variabili (fai clic con il pulsante destro del mouse sulla tela vuota e fai clic su Aggiungi variabile ) per i parametri Input Feature Layer , Field e MultiValue .
  3. Fare clic con il tasto destro su ciascuno di questi e selezionare Parametro modello
  4. Aggiungi uno strumento Calcola valore (Gestione dati) nell'area di disegno. Collegare le 3 variabili ad esso come precondizioni (solo per mostrare in questo caso, ma può fare la differenza nell'ordine di esecuzione in altre situazioni).
  5. Fare doppio clic sullo strumento Calcola valore per configurarlo:

    5a. Copia / incolla quanto segue nella casella Espressione (regola per abbinare i nomi delle tue variabili):

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

    5b. Copia / incolla quanto segue nella casella Blocco codice :

    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. Impostare il tipo di dati di output su Espressione SQL .

    5 D. Fare clic su OK e fare clic con il tasto destro del mouse sulla variabile di output dallo strumento Calcola valore e rinominarla in qualcosa di più descrittivo come "Clausola WHERE".

  6. Aggiungi uno strumento Seleziona livello per attributo (Gestione dati) nell'area di disegno. Collega le variabili Feature Layer e WHERE Clause allo strumento Seleziona layer per attributo.
  7. Aggiungi uno strumento Funzioni di copia (Gestione dati) all'area di disegno. Collegare l'output dello strumento Seleziona livello per attributo allo strumento Copia funzioni. Fare clic con il tasto destro del mouse sulla variabile Classe caratteristica di output e selezionare il parametro Modello e (facoltativamente) le opzioni Aggiungi a schermo .

    A questo punto dovrebbe assomigliare a questo: Tela modello

  8. Nel menu Modello -> Proprietà modello, assegna un nome e un'etichetta validi, quindi salva e chiudi.

  9. Fare doppio clic sul modello in ArcToolbox per visualizzare la finestra di dialogo del modello. Immettere i parametri e fare clic su OK. Dovrebbe esportare le funzioni selezionate in una nuova classe di caratteristiche e aggiungerle alla mappa (se si seleziona "Aggiungi alla visualizzazione" sulla classe di caratteristiche di output).

    Finestra di dialogo modello

APPUNTI:

  • Puoi sempre hardcodificare i valori e non "parametrizzare" le variabili che non desideri vengano modificate dall'utente come il feature layer o i parametri del campo. Mi piace solo avere strumenti generici / riutilizzabili, quindi ho creato quei parametri del modello. In effetti ciò che vorrei fare è semplicemente trascinare e rilasciare il modello generico in un nuovo modello e quindi impostare i parametri predefiniti, in questo modo è possibile creare diversi modelli "wrapper" predefiniti, ma avere solo un modello sottostante che fa il lavoro, quindi se è necessario modificarne la funzionalità, è necessario modificarlo in un'unica posizione.

  • Se sei fortunato come me non dovrai convalidare il modello e fornire alcuni dati fittizi solo per rimuoverlo dopo la convalida (nota come tutti gli elementi del modello sono vuoti / bianchi, il che significa che non sono "pronti per l'esecuzione" - ma sono stato in grado di eseguirlo comunque dopo aver compilato i parametri nella finestra di dialogo del modello).


3

Puoi anche utilizzare un semplice strumento di geoprocessing chiamato Select per ottenere questo flusso di lavoro se i requisiti della tua GUI non sono per la finestra di dialogo precisa illustrata da @ blah238.

Usa la finestra Cerca per trovarla o vai su ArcToolbox> Strumenti di analisi> Estrai> Seleziona.

Lo strumento Seleziona (Analisi) consente di estrarre funzionalità utilizzando qualsiasi campo (attributo) da una classe di caratteristiche.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.