Riordinare i campi in modo permanente utilizzando lo strumento ArcGIS Crea tabella query?


15

Nei campi Risposta al riordino (permanente) nel file geodatabase utilizzando ArcGIS Desktop? è stato affermato che lo strumento Crea tabella query può essere utilizzato per riordinare i campi nelle tabelle e le classi di caratteristiche in modo permanente.

Tuttavia, quando apro la finestra di dialogo per quello strumento non riesco a vedere da nessuna parte che consente il riordino dei campi. Tutto quello che posso vedere è che i campi possono essere trascinati o rilasciati utilizzando le caselle di controllo ma nello stesso ordine.

Supponendo che sia possibile qualcuno può descrivere i passaggi in modo più dettagliato, per favore?

Finestra di dialogo dello strumento Crea tabella query

Risposte:


13

Ho capito come fare usando lo strumento Crea tabella query , Copia come frammento Python , la finestra Python e lo strumento Copia funzioni .

Dopo aver eseguito lo strumento Crea tabella query per scorrere solo i campi che volevo visualizzare nell'output, sono stato in grado di copiare come frammento Python questo codice dal Geoprocessing | Finestra dei risultati nella finestra Python di ArcMap.

arcpy.MakeQueryTable_management("'C:/avhome/data/WAregional/wa regional.mdb/schools'","QueryTable","USE_KEY_FIELDS","#","schools.OBJECTID #;schools.Shape #;schools.CODE #;schools.NAME #;schools.TYPE #;schools.Y11STUDENT #;schools.Y12STUDENT #;schools.COORDGEOCO #;schools.ID #","#")

e modificalo per diventare:

arcpy.MakeQueryTable_management("'C:/avhome/data/WAregional/wa regional.mdb/schools'","QueryTable2","USE_KEY_FIELDS","#","schools.OBJECTID #;schools.Shape #;schools.Y12STUDENT #;schools.Y11STUDENT #;schools.NAME #","#")

Nota che la nuova QueryTable2 conserva il campo Shape (quindi posso copiarlo con le funzioni) e ho riordinato i campi NAME, YR11STUDENT e YR12STUDENT. Ho anche colto l'occasione per abbandonare qualche altro campo.

L'ultimo passaggio consiste nell'utilizzare lo strumento Copia funzionalità su QueryTable2 che ho eseguito tramite la finestra di dialogo dello strumento per creare una nuova classe di caratteristiche con i campi riordinati in modo permanente.


2
Nota: è anche possibile utilizzare MakeQueryTable per modificare i nomi dei campi inserendo un elenco di elenchi di nomi di campo e alias ([[fieldname1, alias1], [fieldname2, alias2] ...])
ndimhypervol,

1
La stessa funzionalità viene esposta quando si esegue la classe Feature nella classe Feature e quindi Copia come frammento Python.
Alex Tereshenkov,

2

Con lo strumento Unisci , puoi facilmente riordinare i campi in modo permanente. Funziona con tabelle e classi di caratteristiche. Il riordino può essere effettuato tramite script Python e persino con la finestra di dialogo Strumento (Rimuovendo un campo e aggiungendolo nuovamente nella finestra di dialogo). Anche se riordinare tramite la finestra di dialogo non è un approccio perfetto.

Si consiglia di utilizzare lo strumento Unisci una volta e quindi utilizzare Copia come frammento Python e quindi modificare manualmente gli ordini dei campi e quindi incollare il codice Python in Windows Python.

Ecco uno script Python che utilizza lo strumento Unisci per riordinare i campi (copiato da qui )

import arcpy

def reorder_fields(table, out_table, field_order, add_missing=True):
    """ 
    Reorders fields in input featureclass/table
    :table:         input table (fc, table, layer, etc)
    :out_table:     output table (fc, table, layer, etc)
    :field_order:   order of fields (objectid, shape not necessary)
    :add_missing:   add missing fields to end if True (leave out if False)
    -> path to output table
    """
    existing_fields = arcpy.ListFields(table)
    existing_field_names = [field.name for field in existing_fields]

    existing_mapping = arcpy.FieldMappings()
    existing_mapping.addTable(table)

    new_mapping = arcpy.FieldMappings()

    def add_mapping(field_name):
        mapping_index = existing_mapping.findFieldMapIndex(field_name)

        # required fields (OBJECTID, etc) will not be in existing mappings
        # they are added automatically
        if mapping_index != -1:
            field_map = existing_mapping.fieldMappings[mapping_index]
            new_mapping.addFieldMap(field_map)

    # add user fields from field_order
    for field_name in field_order:
        if field_name not in existing_field_names:
            raise Exception("Field: {0} not in {1}".format(field_name, table))

        add_mapping(field_name)

    # add missing fields at end
    if add_missing:
        missing_fields = [f for f in existing_field_names if f not in field_order]
        for field_name in missing_fields:
            add_mapping(field_name)

    # use merge with single input just to use new field_mappings
    arcpy.Merge_management(table, out_table, new_mapping)
    return out_table

USO:

new_field_order = ["field2", "field3", "field1"]
reorder_fields(in_fc, out_fc, new_field_order)

Potresti elencare i passaggi precisi che usi per farlo attraverso la sua finestra di dialogo degli strumenti, per favore? Dal mio test 10.3.1 proprio ora sembra che il pannello di mappatura dei campi non consenta il riordino. Inoltre, penso che questa risposta sarà meglio posizionata su un'altra domanda ( gis.stackexchange.com/questions/32119/… ) perché questa è specificamente correlata all'uso dello strumento Crea tabella query.
PolyGeo

Sì, l'ho notato nel titolo della tua domanda. Ma questo post può favorire i futuri visitatori che devono solo riordinare i campi, il modo più semplice.
Farid Cheraghi,

Il riordino può essere fatto rimuovendo il campo a e aggiungendolo nuovamente nella finestra di dialogo. Tuttavia, non è un approccio perfetto.
Farid Cheraghi,

1
Ho votato a favore di questa risposta sull'altra domanda in cui penso che ora sia la risposta migliore, ma poiché si tratta di una "risposta duplicata" e non di una risposta diretta alla domanda posta qui, non credo che un secondo voto sarebbe appropriato.
PolyGeo

@FaridCher, grazie per aver condiviso il codice. Avevo solo bisogno di riordinare i campi molto rapidamente in Python, e ha funzionato alla grande. Eccezionale.
Alex Tereshenkov,

1

Dopo aver letto questo Alterando l'ordine degli attributi in una tabella e cercando di riorganizzare l'ordine dei campi, ho trovato questa semplice soluzione in ArcMap 10,1 ...

  1. Fare clic con il tasto destro del mouse sulla funzione che si desidera modificare nel sommario
  2. fai clic su Proprietà
  3. fai clic sulla scheda Campi
  4. fai clic su un campo
  5. fai clic sulla freccia "sposta su" o "sposta giù"
  6. Applica, OK

inserisci qui la descrizione dell'immagine


3
Bel tentativo. Ma sfortunatamente questo vale solo per il livello che hai aggiunto nel documento della mappa. La classe caratteristica avrà ancora i campi nell'ordine definito. Tecnicamente parlando, non esiste un "ordine" di campi nei database, ma come utente finale potresti voler essere in grado di aggiungere una classe di caratteristiche in un documento della mappa e aprire una tabella di attributi per vedere i campi nel relativo ordine.
Alex Tereshenkov,

1

Ho un metodo per farlo completamente all'interno del modellista in modo relativamente robusto. È un po 'noioso da configurare, ma almeno può essere inserito come parte di un'analisi più ampia del modello:

Strumento Dissolve - ObjectID come campo di dissoluzione. Aggiungi i restanti campi (Statistiche) nell'ordine desiderato e scegli l'opzione (Primo) dal menu a discesa Tipo di statistica. Nell'esempio seguente ho spostato il campo SaltMarsh_Pct in alto nella lista dei campi in posizione 6.

Sciogli il modello con i campi riordinati

Generalmente copio i risultati, quindi rinomino ogni campo (la copia è funzionalmente ridondante e la ridenominazione può essere eseguita anche lì, ma è traballante)

Utilizzare lo strumento Modifica campo per rinominare ciascun campo

Modifica i nomi dei campi indietro all'originale (rimuovendo PRIMA)

Tutti insieme in un modello sembra così:

Esempio di modello da riordinare

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.