Réorganiser les champs de façon permanente à l'aide de l'outil ArcGIS Make Query Table?

15

Dans les champs Répondre à la réorganisation (de manière permanente) dans la géodatabase fichier à l'aide d'ArcGIS Desktop? il a été indiqué que l'outil Créer une table de requête pouvait être utilisé pour réorganiser les champs des tables et des classes d'entités de manière permanente.

Cependant, lorsque j'ouvre la boîte de dialogue de cet outil, je ne vois aucun endroit permettant de réorganiser les champs. Tout ce que je peux voir, c'est que les champs peuvent être parcourus ou supprimés à l'aide de cases à cocher mais dans le même ordre.

En supposant que c'est possible, quelqu'un peut-il décrire les étapes plus en détail, s'il vous plaît?

Boîte de dialogue de l'outil Créer une table de requête

PolyGeo
la source

Réponses:

13

J'ai compris comment le faire en utilisant l' outil Make Query Table , Copy As Python Snippet , la fenêtre Python et l' outil Copy Features .

Après avoir exécuté l'outil Créer une table de requête pour parcourir uniquement les champs que je voulais voir apparaître dans la sortie, j'ai pu copier ce code Python à partir du géotraitement | Fenêtre des résultats dans la fenêtre Python d'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 #","#")

et le modifier pour devenir:

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 #","#")

Notez que le nouveau QueryTable2 conserve le champ Shape (afin que je puisse le copier) et que j'ai réorganisé les champs NAME, YR11STUDENT & YR12STUDENT. J'ai également profité de l'occasion pour abandonner quelques champs supplémentaires.

La dernière étape consiste à utiliser l'outil Copier les fonctionnalités sur QueryTable2, ce que j'ai fait via sa boîte de dialogue d'outils pour créer une nouvelle classe d'entités avec les champs réorganisés en permanence.

PolyGeo
la source
2
Remarque: vous pouvez également utiliser MakeQueryTable pour modifier les noms de vos champs en saisissant une liste de listes de noms de champs et d'alias ([[fieldname1, alias1], [fieldname2, alias2] ...])
ndimhypervol
1
La même fonctionnalité est exposée lorsque vous exécutez la classe d'entités sur la classe d'entités, puis sur Copier en tant qu'extrait Python.
Alex Tereshenkov
2

Avec l' outil de fusion , vous pouvez facilement réorganiser les champs de façon permanente. Il fonctionne avec des tables et des classes d'entités. La réorganisation peut être effectuée via un script python et même avec la boîte de dialogue Outil (en supprimant un champ et en l'ajoutant à nouveau dans la boîte de dialogue). Bien que la réorganisation via la boîte de dialogue ne soit pas une approche parfaite.

Il est recommandé d'utiliser l'outil Fusionner une fois, puis d'utiliser Copier en tant qu'extrait Python , puis de modifier manuellement l'ordre des champs, puis de coller le code Python dans les fenêtres Python.

Voici un script python qui utilise l'outil de fusion pour réorganiser les champs (copié à partir d' ici )

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

USAGE:

new_field_order = ["field2", "field3", "field1"]
reorder_fields(in_fc, out_fc, new_field_order)
Farid Cheraghi
la source
Pourriez-vous lister les étapes précises que vous utilisez pour ce faire à travers sa boîte de dialogue d'outils, s'il vous plaît? D'après mon test 10.3.1, il semble que le panneau de mappage de champ ne permet pas de réorganiser. De plus, je pense que cette réponse sera mieux placée sur une autre question ( gis.stackexchange.com/questions/32119/… ) car celle-ci est spécifiquement liée à l'utilisation de l'outil Make Query Table.
PolyGeo
Oui, je l'ai remarqué dans le titre de votre question. Mais ce message peut favoriser les futurs visiteurs qui n'ont besoin que de réorganiser les champs, de la manière la plus simple.
Farid Cheraghi
La réorganisation peut être effectuée en supprimant le champ a et en l'ajoutant à nouveau dans la boîte de dialogue. Mais ce n'est pas une approche parfaite.
Farid Cheraghi
1
J'ai voté pour cette réponse sur l'autre question où je pense que c'est maintenant la meilleure réponse, mais parce qu'il s'agit d'une "réponse en double", et non d'une réponse directe à la question posée ici, je ne pense pas qu'un deuxième vote serait approprié.
PolyGeo
@FaridCher, merci d'avoir partagé le code. Juste besoin de réorganiser les champs très rapidement en Python, et cela fonctionnait très bien. Impressionnant.
Alex Tereshenkov
1

Après avoir lu ceci Modifier l'ordre des attributs dans une table et essayer de réorganiser l'ordre des champs, j'ai trouvé cette solution simple dans ArcMap 10,1 ...

  1. Faites un clic droit sur la fonctionnalité que vous souhaitez modifier dans la table des matières
  2. cliquez sur Propriétés
  3. cliquez sur l'onglet Champs
  4. cliquez sur un champ
  5. cliquez sur la flèche "monter" ou "descendre"
  6. Appliquer, OK

entrez la description de l'image ici

KonstaNtie
la source
3
Bon essai. Mais malheureusement, cela ne s'applique qu'à la couche que vous avez ajoutée dans le document ArcMap. La classe d'entités aura toujours les champs dans l'ordre défini. Techniquement parlant, il n'y a pas d '"ordre" de champs dans les bases de données, mais en tant qu'utilisateur final, vous voudrez peut-être pouvoir ajouter une classe d'entités dans un document ArcMap et ouvrir une table attributaire pour voir les champs dans l'ordre correspondant à votre commande.
Alex Tereshenkov
1

J'ai une méthode pour le faire complètement dans le générateur de modèles d'une manière relativement robuste. C'est un peu fastidieux à mettre en place mais au moins il peut être inséré dans le cadre d'une analyse de constructeur de modèle plus large:

Dissoudre outil - ObjectID que le champ se dissoudre. Ajoutez les champs (Statistiques) restants dans l'ordre souhaité et choisissez l'option (Premier) dans la liste déroulante Type statique. Dans l'exemple ci-dessous, j'ai déplacé le champ SaltMarsh_Pct vers le bas dans la liste des champs à la position 6.

Dissoudre le modèle avec des champs réorganisés

Je copie généralement les résultats, puis je renomme chaque champ (la copie est fonctionnellement redondante et le changement de nom peut également y être effectué mais il est irrégulier)

Utilisez l'outil Modifier le champ pour renommer chaque champ

Modifier les noms de champ pour revenir à l'original (supprimer en premier)

Tous ensemble dans un modèle, cela ressemble à ceci:

Exemple de modèle à réorganiser

Robbie
la source