Zmienić nazwę pola za pomocą ArcPy?

9

Co muszę zrobić:

  1. zmień nazwę nazwy tabeli / klasy obiektów
  2. skopiuj wszystkie wartości do nowego pola

Do tej pory zrobiłem następujący kod, jak sugeruje @ artwork21:

import sys
import traceback
import arcpy
from arcpy import env

## ARGUMENTS
# argv[1] = input table/feature class path
# argv[2] = input old field name
# argv[3] = input new field name  

path = sys.argv[1]
oldFieldName = sys.argv[2] 
newFieldName = sys.argv[3] 

env.overwriteOutput = True

fields = arcpy.ListFields(path)
for field in fields:
    if field.aliasName == oldFieldName:
        if not oldFieldName == newFieldName:
            fieldType = field.type
            # Add new field
            arcpy.AddField_management(path, newFieldName, fieldType)
            #Calculates the new field based on old field values
            arcpy.CalculateField_management(path, newFieldName, "!"+oldFieldName+"!", "PYTHON", "")
            # Delete the old field (if necessary)
            arcpy.DeleteField_management(path, oldFieldName)

Jak mogę odwzorować field.typena AddField_managementtyp pola metody? A gdy pole znajduje się na środkowym miejscu, wówczas pole jest usuwane ze środka i dodawane do ostatniego. Nie wygląda to tak, jakby nazwa pola została zmieniona.

Czy jest jakieś lepsze rozwiązanie, które pomaga mi robić te rzeczy?

Emi
źródło
Nazwa twojego pola warstwy obiektów nie jest tutaj zmieniana, fieldInfo.setNewName (indeks, „stat”). Dlatego pojawia się błąd w wierszu row.setValue („stat”, gValue).
artwork21
2
setNewName (indeks, nowa_nazwa_pola), musi tylko ustawiać nowe nazwy pól, a nie zmieniać nazw istniejących.
artwork21
2
Obiekt FieldInfo nie robi nic z danymi bazowymi, jest po prostu reprezentacją właściwości pola, które można wykorzystać jako dane wejściowe do niektórych narzędzi do tworzenia nowych danych, podobnie jak obiekt FieldMappings.
blah238
1
Czy old_fieldnazwa zmiennej lub rzeczywista nazwa starego pola? Jeśli jest to nazwa zmiennej, musisz użyć formatowania łańcucha lub konkatenacji, aby zawrzeć wartość zmiennej w nawiasach (parser VB) lub wykrzyknikach (parser Python).
blah238
1
Alias w ogóle jest „nick” lub pseudonim . Niekoniecznie jest równa rzeczywistej nazwie kolumny w bazie danych.
blah238

Odpowiedzi:

15

Wypróbuj to, używając kombinacji narzędzi Arcpy Dodaj pole, Oblicz pole i Usuń pole:

if fieldInfo.getFieldName(index) == "status":
    arcpy.AddField_management(layer, "stat", "TEXT", "", "", "50", "",        "NULLABLE", "NON_REQUIRED", "")                     
    arcpy.CalculateField_management(layer, "stat", "!status!", "PYTHON_9.3", "")
    arcpy.DeleteField_management(layer, "status")
grafika 21
źródło
1
Chcę, aby dwa pola były takie same. ale nazwy field_Type i AddField_management metody field_typ są różne. Co robić?
Emi
@Emi, nie rozumiem, co rozumiesz przez „dwa takie same pola”? Chcesz, aby wartość w „statusie” znalazła się w nowym polu o nazwie „stat”?
artwork21
tak, chcę, aby wartość w „status” wstawiła nowe pole o nazwie „stat”
Emi
Próbowałem też fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")zamiast fieldInfo.setNewName(index, "stat"). Ale ten sam błąd wystąpił w moim kodzie.
Emi
W przypadku wierszy = arcpy.UpdateCursor (inputFeatureClass), może wypróbuj wiersze = arcpy.UpdateCursor (warstwa)
artwork21
9

Możesz teraz zmienić nazwę pola za pomocą podstawowego narzędzia ArcGIS Desktop GP - Alter Field (zarządzanie danymi) . To narzędzie umożliwia zmianę nazwy pól lub zmianę aliasów pól dla dowolnej tabeli geobazy lub klasy obiektów.

To narzędzie jest dostępne od wersji 10.2.1 .

Alex Tereshenkov
źródło
5
Obsługuje tylko niektóre formaty danych. W szczególności generuje błąd w plikach kształtu.
jpmc26 30.09.16
3

Aby zmienić nazwę pola w tabeli lub klasie elementów, spróbowałbym wykonać procedurę opisaną tutaj .

  1. Uruchom ArcMap i otwórz okno katalogu.
  2. Znajdź bazę danych zawierającą tabelę, którą chcesz zmienić.
  3. Kliknij tabelę prawym przyciskiem myszy i wybierz Właściwości.
  4. Kliknij kartę Pola.
  5. Kliknij istniejący tekst w kolumnie Nazwa pola i wpisz nową nazwę.

Właśnie przetestowałem to na tabeli geobazy danych pliku przy użyciu ArcGIS dla Desktop Standard 10.1 SP1 i działało dobrze.

Niestety, po napisaniu tego, przeszukałem plik PDF Co nowego w ArcGIS 10.1 i stwierdziłem, że ta funkcja mogła zostać dodana w tej wersji - nadal warto przetestować najnowszy dodatek Service Pack 10.0, aby sprawdzić, czy również został tam z powrotem przeniesiony.

PolyGeo
źródło
1
Wierzę, że Emi szuka rozwiązania w stylu arcpy.
artwork21
Właściwie szukam rozwiązania arcpy
Emi
1
Mój błąd - myślałem, że @Emi powiedział: „Czy jest jakieś lepsze rozwiązanie ...” [moje śmiałość].
PolyGeo
1

dwa duże problemy z kodem:

  • jeśli dataType nie jest FeatureLayer, program pominie manipulacje fieldinfo, a następnie spróbuje ustawić wartość na nowe / zmienione pole, którego nigdy nie utworzono / zmieniono nazwę

  • Dwie linie:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    mam duży problem. Jeśli wcześniejszy kod działał Pole „status” nie istnieje.

mhoran_psprep
źródło
Sprawdziłem kod i chociaż jest to warstwa funkcji, a klasa funkcji zawiera pole o nazwie „status”, daje ten sam błąd
Emi
Jeśli pierwsza linia działa, druga linia nie.
mhoran_psprep
zmieniłeś informacje w warstwie, ale czytasz i zapisujesz dane z / do klasy obiektów
mhoran_psprep
1

Jak zmapować typ field.type na typ pola metody AddField_management?

Odbywa się to automatycznie, zgodnie z tym postem .

A gdy pole znajduje się na środkowym miejscu, wówczas pole jest usuwane ze środka i dodawane do ostatniego. Nie wygląda to tak, jakby nazwa pola została zmieniona. Czy jest jakieś lepsze rozwiązanie, które pomaga mi robić te rzeczy?

Jak wspomniałem w drugim pytaniu , jedynymi innymi opcjami są upuszczenie i odtworzenie całej klasy / tabeli funkcji lub zmodyfikowanie definicji kolumny w bazowym systemie DBMS.

Przypuszczam, że mogłoby usunąć wszystkie kolumny użytkowników i ponownie utworzyć je w odpowiedniej kolejności, ale to trochę szalony. Skrypt w tej odpowiedzi właśnie to robi, prawdopodobnie możesz go dostosować do swoich potrzeb.

blah238
źródło
podczas gdy field.type = "string", musimy przekazać "text" na AddField_management. Sprawdziłem to.
Emi
Jesteś pewny? Działa dla mnie w wersji 10.0 SP5.
blah238
Daje mi błąd: arcgisscripting.ExecuteError: Nie powiodło się. Parametry są niepoprawne. BŁĄD 000800: Wartość nie jest członkiem TEKSTU | PŁYWAK | DOUBLE | KRÓTKI | DŁUGIE | DATA | BLOB | RASTER | GUID. Nie udało się wykonać (AddField).
Emi
W jakiej wersji / SP jesteś?
blah238
Używam 10.0. Nie znam numeru dodatku Service Pack.
Emi