Rinominare il campo usando ArcPy?


9

Cosa devo fare:

  1. rinominare un nome campo di una tabella / classe di funzionalità
  2. copia tutti i valori nel nuovo campo

Finora ho fatto il seguente codice come suggerisce @ 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)

Come posso mappare field.typeal AddField_managementtipo di campo del metodo? E mentre il campo si trova in una posizione intermedia, il campo viene eliminato dalla metà e aggiunto all'ultimo. Non sembra che il nome del campo sia stato rinominato.

Esiste una soluzione migliore che mi aiuti a fare queste cose?


Il campo del feature layer non viene rinominato qui, fieldInfo.setNewName (indice, "stat"). Questo è il motivo per cui ricevi l'errore sulla riga row.setValue ("stat", gValue).
— artwork21

2
setNewName (index, new_field_name), deve essere solo per l'impostazione di nuovi nomi di campo, non per rinominare quelli esistenti.
— artwork21

2
Un oggetto FieldInfo non fa nulla ai dati sottostanti, è semplicemente una rappresentazione delle proprietà del campo che può essere utilizzata come input per determinati strumenti per la creazione di nuovi dati, simile a un oggetto FieldMappings.
— blah238,

1
È old_fieldun nome variabile o il nome effettivo del vecchio campo? Se si tratta di un nome di variabile, è necessario utilizzare la formattazione della stringa o la concatenazione per racchiudere il valore della variabile tra parentesi (parser VB) o punti esclamativi (parser Python).
— blah238,

1
Un alias in generale è un "soprannome" o uno pseudonimo . Non è necessariamente uguale al nome della colonna effettiva nel database.
— blah238,

Risposte:


15

Prova questo utilizzando una combinazione di strumenti arcpy Aggiungi campo, Calcola campo ed Elimina campo:

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

1
Voglio rendere uguali i due tipi di campo. ma i nomi field_type del metodo field.Type e AddField_management non sono uguali. Cosa fare?
— Emi,

@Emi, non capisco cosa intendi per "due tipi di campo uguali"? Vuoi che il valore in "status" sia inserito in un nuovo campo chiamato "stat"?
— artwork21

si, voglio il valore in "status", da inserire nel nuovo campo chiamato "stat"
— Emi,

Ho anche provato fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")invece di fieldInfo.setNewName(index, "stat"). Ma lo stesso errore si è verificato con il mio codice.
— Emi,

Per righe = arcpy.UpdateCursor (inputFeatureClass), forse prova file = arcpy.UpdateCursor (layer)
— artwork21

9

Ora puoi rinominare un campo usando lo strumento ArcGIS Desktop GP principale: Alter Field (Data Management) . Questo strumento offre la possibilità di rinominare i campi o rinominare gli alias di campo per qualsiasi tabella di geodatabase o classe di caratteristiche.

Questo strumento è disponibile a partire da 10.2.1 .


5
Questo supporta solo determinati formati di dati. In particolare, genera un errore sui shapefile.
— jpmc26,

3

Per rinominare un campo in una tabella o in una feature class, proverei la procedura qui descritta .

  1. Avviare ArcMap e aprire la finestra del catalogo.
  2. Individua il database che contiene la tabella che desideri modificare.
  3. Fare clic con il tasto destro del mouse sulla tabella e selezionare Proprietà.
  4. Fai clic sulla scheda Campi.
  5. Fai clic sul testo esistente nella colonna Nome campo e digita un nuovo nome.

Ho appena provato questo su una tabella di geodatabase di file usando ArcGIS per Desktop Standard 10.1 SP1 e ha funzionato bene.

Sfortunatamente, dopo averlo scritto, ho cercato il file PDF di Novità in ArcGIS 10.1 e ho scoperto che questa funzionalità potrebbe essere stata aggiunta a quella versione, ma potrebbe valere la pena testare l'ultimo service pack di 10.0 per vedere se è stato eseguito il porting anche lì.


1
Credo che Emi stia cercando una soluzione arcpy.
— artwork21

In realtà sto cercando una soluzione arcpica
— Emi,

1
Il mio errore - Ho pensato che @Emi dicesse "Esiste una soluzione migliore ..." [il mio coraggio].
— PolyGeo

1

due grossi problemi con il codice:

  • se il tipo di dati non è un FeatureLayer, il programma salterà le manipolazioni fieldinfo e quindi tenterà di impostare il valore su un campo nuovo / rinominato che non è mai stato creato / rinominato

  • Le due linee:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    ha un grosso problema. Se il codice precedente ha funzionato Il campo "status" non esiste.


Ho controllato il codice e mentre è un feature layer e la feature class contiene un campo chiamato "status", dà lo stesso errore
— Emi,

Se la prima riga funziona, la seconda riga no.
— mhoran_psprep,

hai modificato le informazioni nel layer, ma stai leggendo e scrivendo dati da / verso la featureclass
— mhoran_psprep

1

Come posso mappare field.type sul tipo di campo del metodo AddField_management?

Questo viene fatto automaticamente, secondo questo post .

E mentre il campo si trova in una posizione intermedia, il campo viene eliminato dalla metà e aggiunto all'ultimo. Non sembra che il nome del campo sia stato rinominato. Esiste una soluzione migliore che mi aiuti a fare queste cose?

Come ho già detto nella tua altra domanda , le uniche altre opzioni sono eliminare e ricreare l'intera classe / tabella di caratteristiche o modificare la definizione di colonna nel DBMS sottostante.

Suppongo che potresti eliminare tutte le colonne dell'utente e ricrearle nell'ordine desiderato, ma è un po 'folle. Lo script in questa risposta fa esattamente questo, probabilmente potresti adattarlo alle tue esigenze.


mentre field.type = "string", dobbiamo passare "text" su AddField_management. L'ho controllato.
— Emi,

Sei sicuro? Funziona per me a 10.0 SP5.
— blah238,

Mi dà errore: arcgisscripting.ExecuteError: Impossibile eseguire. I parametri non sono validi ERRORE 000800: il valore non è un membro di TEXT | GALLEGGIANTE | DOUBLE | CORTO | LUNGO | DATA | BLOB | RASTER | GUID. Impossibile eseguire (AddField).
— Emi,

A quale versione / SP sei?
— blah238,

Sto usando 10.0. Non conosco il numero del service pack.
— Emi,
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.