Ponowne zamawianie pól na stałe za pomocą narzędzia ArcGIS Make Query Table?

15

W polach Odpowiedź na zmianę kolejności (na stałe) w geobazie pliku za pomocą ArcGIS Desktop? stwierdzono, że narzędzie Stwórz tabelę zapytań może być używane do stałego porządkowania pól w tabelach i klasach elementów.

Jednak po otwarciu okna dialogowego dla tego narzędzia nie widzę nigdzie, co umożliwiałoby zmianę kolejności pól. Widzę tylko, że pola można przenosić lub upuszczać za pomocą pól wyboru, ale w tej samej kolejności.

Zakładając, że jest to możliwe, czy ktoś może bardziej szczegółowo opisać kroki?

Okno dialogowe Utwórz tabelę zapytań

PolyGeo
źródło

Odpowiedzi:

13

Zrozumiałem, jak to zrobić, używając narzędzia Utwórz tabelę zapytań , Kopiuj jako fragment kodu w Pythonie, okna Python i narzędzia Kopiuj funkcje .

Po uruchomieniu narzędzia Utwórz tabelę zapytań, aby przeciągnąć tylko pola, które chciałem wyświetlić w danych wyjściowych, mogłem skopiować jako fragment kodu Python ten fragment z Geoprocessing | Okno wyników do okna Python 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 #","#")

i edytuj go, aby stał się:

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

Zauważ, że nowy QueryTable2 zachowuje pole Shape (dzięki czemu mogę go skopiować) i zmieniłem kolejność pól NAME, YR11STUDENT i YR12STUDENT. Skorzystałem również z okazji, aby zrezygnować z kilku dodatkowych pól.

Ostatnim krokiem jest użycie narzędzia Kopiuj funkcje w QueryTable2, które zrobiłem za pomocą okna dialogowego tego narzędzia, aby utworzyć nową klasę obiektów z polami na stałe ponownie uporządkowanymi.

PolyGeo
źródło
2
Uwaga: możesz także użyć MakeQueryTable, aby zmienić nazwy swoich pól, wprowadzając listę list nazw i aliasów pól ([[nazwa pola1, alias1], [nazwa pola2, alias2] ...])
ndimhypervol
1
Ta sama funkcjonalność jest widoczna, gdy uruchomisz klasę elementów na klasę elementów, a następnie skopiujesz jako fragment kodu w języku Python.
Alex Tereshenkov
2

Dzięki narzędziu Scalanie możesz z łatwością porządkować pola na stałe. Działa z tabelami i klasami funkcji. Zmiana kolejności może odbywać się za pomocą skryptu Python, a nawet za pomocą okna dialogowego Narzędzia (poprzez usunięcie pola i ponowne dodanie go w oknie dialogowym). Chociaż ponowne zamówienie za pośrednictwem okna dialogowego nie jest idealnym podejściem.

Zaleca się jednorazowe użycie narzędzia Scal, a następnie użycie opcji Kopiuj jako fragment kodu w Pythonie, a następnie ręczną zmianę kolejności pól, a następnie wklejenie kodu Pythona w oknach Pythona.

Oto skrypt w języku Python, który używa narzędzia korespondencji seryjnej do zmiany kolejności pól (skopiowane stąd )

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

STOSOWANIE:

new_field_order = ["field2", "field3", "field1"]
reorder_fields(in_fc, out_fc, new_field_order)
Farid Cheraghi
źródło
Czy byłbyś w stanie podać dokładne kroki, które wykonujesz, aby to zrobić za pomocą okna dialogowego narzędzia? Z mojego testu 10.3.1 właśnie teraz wygląda na to, że panel mapowania pola nie pozwala na zmianę kolejności. Sądzę też, że lepiej odpowiedzieć na inne pytanie ( gis.stackexchange.com/questions/32119/... ), ponieważ to pytanie dotyczy konkretnie użycia narzędzia Make Query Table.
PolyGeo
Tak, zauważyłem to w tytule twojego pytania. Ale ten post może faworyzować przyszłych użytkowników, którzy muszą tylko uporządkować pola w najprostszy sposób.
Farid Cheraghi,
Zmiana kolejności może odbywać się poprzez usunięcie pola i ponowne dodanie go w oknie dialogowym. Nie jest to jednak idealne podejście.
Farid Cheraghi,
1
Głosowałem za tą odpowiedzią na inne pytanie, które moim zdaniem jest teraz najlepszą odpowiedzią, ale ponieważ jest to „duplikat odpowiedzi”, a nie bezpośrednia odpowiedź na zadane tutaj pytanie, nie sądzę, aby drugi głos był odpowiedni.
PolyGeo
@FaridCher, dzięki za udostępnienie kodu. Wystarczyło bardzo szybko zmienić kolejność pól w Pythonie i zadziałało świetnie. Niesamowite.
Alex Tereshenkov,
1

Po przeczytaniu Zmieniając kolejność atrybutów w tabeli i próbując zmienić kolejność pól, znalazłem to proste rozwiązanie w ArcMap 10,1 ...

  1. Kliknij prawym przyciskiem myszy funkcję, którą chcesz zmienić w spisie treści
  2. kliknij Właściwości
  3. kliknij kartę Pola
  4. kliknij pole
  5. kliknij strzałkę „w górę” lub „w dół”
  6. Zastosuj, OK

wprowadź opis zdjęcia tutaj

KonstaNtie
źródło
3
Dobra próba. Ale niestety dotyczy to tylko warstwy dodanej do dokumentu mapy. Klasa obiektów nadal będzie miała zdefiniowane pola w kolejności. Technicznie rzecz biorąc, nie ma „kolejności” pól w bazach danych, ale jako użytkownik końcowy możesz chcieć mieć możliwość dodawania klasy obiektów do dokumentu mapy i otwierania tabeli atrybutów, patrz pola w odpowiednim dla ciebie zamówieniu.
Alex Tereshenkov
1

Mam metodę zrobienia tego całkowicie w programie budującym modele w stosunkowo solidny sposób. Konfiguracja jest trochę uciążliwa, ale przynajmniej można ją wstawić w ramach większej analizy konstruktora modeli:

Narzędzie Rozpuszczanie - ObjectID jako pole rozpuszczania. Dodaj pozostałe pola (Statystyka) w żądanej kolejności i wybierz opcję (Pierwsza) z listy rozwijanej Typ statyczny. W poniższym przykładzie przesunąłem pole SaltMarsh_Pct z góry w dół na liście pól do pozycji 6.

Model rozpuszczony z zmienionymi polami

Zasadniczo kopiuję wyniki, a następnie zmieniam nazwy każdego pola (kopia jest funkcjonalnie redundantna i można tam również zmienić nazwę, ale jest niestabilna)

Użyj narzędzia Zmień pole, aby zmienić nazwę każdego pola

Zmień nazwy pól z powrotem na oryginalne (usuwanie PIERWSZE)

Wszystko razem w modelu wygląda następująco:

Przykładowy model do zmiany kolejności

Robbie
źródło