Переименование поля с помощью ArcPy?

9

Что я должен сделать:

  1. переименовать имя поля таблицы / класса объектов
  2. скопировать все значения в новое поле

До сих пор я сделал следующий код, как подсказывает @ 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)

Как я могу сопоставить field.typeс AddField_managementтипом поля методы? И если поле находится посередине, то поле удаляется из середины и добавляется к последнему. Это не похоже на то, как будто имя поля переименовано.

Есть ли лучшее решение, которое поможет мне сделать эти вещи?

Emi
источник
Ваше поле векторного слоя здесь не переименовывается, fieldInfo.setNewName (index, "stat"). Вот почему вы получаете свою ошибку в строке row.setValue ("stat", gValue).
artwork21
2
setNewName (index, new_field_name), должно быть только для установки новых имен полей, а не переименования существующих.
artwork21
2
Объект FieldInfo ничего не делает с базовыми данными, он просто представляет свойства поля, которые можно использовать в качестве входных данных для определенных инструментов для создания новых данных, аналогично объекту FieldMappings.
blah238
1
Является ли old_fieldимя переменной или фактическое имя старого поля? Если это имя переменной, вам нужно использовать форматирование или конкатенацию строк, чтобы обернуть значение переменной в скобки (VB-анализатор) или восклицательные знаки (Python-анализатор).
blah238
1
В общем, псевдоним - это псевдоним или псевдоним . Это не обязательно равно фактическому имени столбца в базе данных.
blah238

Ответы:

15

Попробуйте это с помощью комбинации инструментов Arcpy Add Field, Calculate Field и Delete Field:

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")
artwork21
источник
1
Я хочу сделать два типа поля одинаковыми. но имена field_Type и метода addField_management field_type не совпадают. Что делать?
Эми
@ Эми, я не понимаю, что ты имеешь в виду под "два одинаковых типа поля"? Вы хотите, чтобы значение в "status" было помещено в новое поле с именем "stat"?
artwork21
да, я хочу, чтобы значение в поле «status» добавлялось в новое поле под названием «stat»
Emi
Я тоже попробовал fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")вместо fieldInfo.setNewName(index, "stat"). Но та же ошибка произошла с моим кодом.
Эми
Для rows = arcpy.UpdateCursor (inputFeatureClass), возможно, попробуйте row = arcpy.UpdateCursor (layer)
artwork21
9

Теперь вы можете переименовать поле с помощью основного инструмента ArcGIS Desktop GP - Изменить поле (Управление данными) . Этот инструмент предоставляет возможность переименовывать поля или переименовывать псевдонимы полей для любой таблицы базы геоданных или класса пространственных объектов.

Этот инструмент доступен начиная с 10.2.1 .

Алекс Терешенков
источник
5
Это поддерживает только определенные форматы данных. Примечательно, что он выдает ошибку в шейп-файлах.
jpmc26
3

Чтобы переименовать поле в таблице или классе объектов, я бы попробовал описанную здесь процедуру .

  1. Запустите ArcMap и откройте окно Каталога.
  2. Найдите базу данных, которая содержит таблицу, которую вы хотите изменить.
  3. Щелкните правой кнопкой мыши таблицу и выберите «Свойства».
  4. Нажмите вкладку Поля.
  5. Нажмите на существующий текст в столбце «Имя поля» и введите новое имя.

Я только что проверил это на таблице файловой базы геоданных, используя ArcGIS for Desktop Standard 10.1 SP1, и она работала нормально.

К сожалению, после написания этого я искал PDF-файл «Что нового в ArcGIS 10.1» и обнаружил, что эта функциональность может быть добавлена ​​в эту версию - тем не менее, возможно, стоит протестировать последний пакет обновления 10.0, чтобы проверить, не был ли он перенесен туда же.

PolyGeo
источник
1
Я полагаю, что Эми ищет дрянное решение.
artwork21
На самом деле я ищу arcpy решение
Emi
1
Моя ошибка - я думал , что @Emi сказала : «Есть ли какое - нибудь лучшее решение ...» [мое вскипание].
PolyGeo
1

две большие проблемы с кодом:

  • если dataType не FeatureLayer, программа пропустит манипуляции с fieldinfo и попытается установить значение для нового / переименованного поля, которое никогда не создавалось / не переименовывалось

  • Две строки:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    есть большая проблема. Если предыдущий код работал, поле «статус» не существует.

mhoran_psprep
источник
Я проверил код, и в то время как это слой объектов, а класс объектов содержит поле с именем «status», выдает ту же ошибку
Emi
Если первая строка работает, вторая строка не будет.
mhoran_psprep
Вы изменили информацию в слое, но читаете и записываете данные из / в класс объектов
mhoran_psprep
1

Как я могу сопоставить field.type с типом поля метода AddField_management?

Это делается автоматически, согласно этому посту .

И если поле находится посередине, то поле удаляется из середины и добавляется к последнему. Это не похоже на то, как будто имя поля переименовано. Есть ли лучшее решение, которое поможет мне сделать эти вещи?

Как я уже упоминал в вашем другом вопросе , ваши единственные другие варианты - удалить и заново создать весь класс / таблицу пространственных объектов или изменить определение столбца в базовой СУБД.

Я полагаю, вы могли бы удалить все пользовательские столбцы и воссоздать их в нужном порядке, но это немного безумие. Сценарий в этом ответе делает именно это, вы, вероятно, могли бы адаптировать его к вашим потребностям.

blah238
источник
в то время как field.type = "string", мы должны передать "text" в AddField_management. Я проверил это.
Эми
Ты уверен? У меня работает на 10.0 SP5.
blah238
Это дает мне ошибку: arcgisscripting.ExecuteError: Не удалось выполнить. Параметры не действительны. ОШИБКА 000800: значение не является членом TEXT | FLOAT | ДВОЙНОЙ | КОРОТКИЙ | ДОЛГО | ДАТА | BLOB | РАСТЕР | GUID. Не удалось выполнить (AddField).
Эми
На какой версии / SP вы находитесь?
blah238
Я использую 10.0. Я не знаю номер пакета обновления.
Эми