Mengganti nama bidang menggunakan ArcPy?

9

Apa yang perlu saya lakukan:

  1. ganti nama bidang dari kelas tabel / fitur
  2. salin semua nilai ke bidang baru

Sejauh ini saya telah melakukan kode berikut seperti yang disarankan @ 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)

Bagaimana saya bisa memetakan field.typeke AddField_managementjenis bidang metode? Dan sementara bidang di tengah, maka bidang dihapus dari tengah dan ditambahkan ke yang terakhir. Itu tidak tampak seperti jika nama bidang diubah namanya.

Apakah ada solusi yang lebih baik yang membantu saya melakukan hal-hal ini?

Emi
sumber
Bidang lapisan fitur Anda tidak diganti namanya di sini, fieldInfo.setNewName (indeks, "stat"). Inilah sebabnya mengapa Anda mendapatkan kesalahan Anda di baris row.setValue ("stat", gValue).
artwork21
2
setNewName (index, new_field_name), harus hanya untuk menetapkan nama bidang baru, bukan mengganti nama yang sudah ada.
artwork21
2
Objek FieldInfo tidak melakukan apa pun pada data yang mendasarinya, itu hanya representasi properti bidang yang dapat digunakan sebagai input ke alat tertentu untuk membuat data baru, mirip dengan objek FieldMappings.
blah238
1
Apakah old_fieldnama variabel atau nama sebenarnya dari bidang lama? Jika itu nama variabel, Anda perlu menggunakan pemformatan string atau gabungan untuk membungkus nilai variabel dengan tanda kurung (parser VB) atau tanda seru (parser Python).
blah238
1
Sebuah alias pada umumnya adalah "julukan" atau nama samaran . Itu tidak harus sama dengan nama kolom aktual dalam database.
blah238

Jawaban:

15

Coba ini menggunakan kombinasi alat Tambah Field, Calculate Field, dan Delete Field arcpy:

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
sumber
1
Saya ingin membuat kedua jenis bidang sama. tetapi nama field_type field.Type dan AddField_management tidak sama. Apa yang harus dilakukan?
Emi
@ Emi, saya tidak mengerti apa yang Anda maksud dengan "dua jenis bidang yang sama"? Anda ingin nilai dalam "status", dimasukkan ke dalam bidang baru yang disebut "stat"?
artwork21
ya saya ingin nilai dalam "status", untuk dimasukkan ke dalam bidang baru yang disebut "stat"
Emi
Saya juga mencoba fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")bukan fieldInfo.setNewName(index, "stat"). Tetapi kesalahan yang sama terjadi dengan kode saya.
Emi
Untuk baris = arcpy.UpdateCursor (inputFeatureClass), mungkin coba baris = arcpy.UpdateCursor (layer)
artwork21
9

Anda sekarang dapat mengganti nama bidang menggunakan alat ArcGIS Desktop GP inti - Alter Field (Manajemen Data) . Alat ini menyediakan kemampuan untuk mengubah nama bidang atau mengubah nama alias bidang untuk tabel geodatabase atau kelas fitur apa pun.

Alat ini tersedia mulai dari 10.2.1 .

Alex Tereshenkov
sumber
5
Ini hanya mendukung format data tertentu. Khususnya, itu membuat kesalahan pada shapefile.
jpmc26
3

Untuk mengganti nama bidang dalam tabel atau kelas fitur, saya akan mencoba prosedur yang dijelaskan di sini .

  1. Mulai ArcMap dan buka jendela Katalog.
  2. Temukan database yang berisi tabel yang ingin Anda ubah.
  3. Klik kanan tabel dan klik Properti.
  4. Klik tab Fields.
  5. Klik pada teks yang ada di kolom Nama Bidang dan ketikkan nama baru.

Saya baru saja menguji ini pada tabel file geodatabase menggunakan ArcGIS untuk Desktop Standar 10.1 SP1 dan itu bekerja dengan baik.

Sayangnya, setelah menulis ini saya mencari file PDF ArcGIS 10.1 yang baru dan menemukan bahwa fungsionalitas ini mungkin telah ditambahkan pada versi itu - masih layak untuk menguji paket layanan terbaru 10.0 untuk melihat apakah porting itu kembali porting di sana juga.

PolyGeo
sumber
1
Saya percaya Emi mencari solusi yang buruk.
artwork21
Sebenarnya saya sedang mencari solusi arcpy
Emi
1
Kesalahan saya - saya pikir @Emi mengatakan "Apakah ada setiap solusi yang lebih baik ..." [saya huruf tebal].
PolyGeo
1

dua masalah besar dengan kode:

  • jika dataType bukan FeatureLayer, program akan melewati manipulasi fieldinfo, dan kemudian mencoba mengatur nilainya ke bidang baru / diganti namanya yang tidak pernah dibuat / diganti namanya

  • Dua baris:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    punya masalah besar. Jika kode sebelumnya berfungsi, kolom "status" tidak ada.

mhoran_psprep
sumber
Saya memeriksa kode dan sementara, itu adalah lapisan fitur dan kelas fitur berisi bidang bernama "status", memberikan kesalahan yang sama
Emi
Jika baris pertama berfungsi, baris kedua tidak.
mhoran_psprep
Anda mengubah info di layer, tetapi sedang membaca dan menulis data dari / ke featureclass
mhoran_psprep
1

Bagaimana saya bisa memetakan field.type ke jenis bidang metode AddField_management?

Ini dilakukan secara otomatis, sesuai dengan posting ini .

Dan sementara bidang di tengah, maka bidang dihapus dari tengah dan ditambahkan ke yang terakhir. Itu tidak tampak seperti jika nama bidang diubah namanya. Apakah ada solusi yang lebih baik yang membantu saya melakukan hal-hal ini?

Seperti yang saya sebutkan dalam pertanyaan Anda yang lain , satu-satunya pilihan Anda adalah membuang dan membuat ulang seluruh kelas / tabel fitur atau memodifikasi definisi kolom dalam DBMS yang mendasarinya.

Saya kira Anda bisa menghapus semua kolom pengguna dan membuatnya kembali dalam urutan yang diinginkan tapi itu sedikit gila. Skrip dalam jawaban ini tidak persis seperti itu, Anda mungkin dapat menyesuaikannya dengan kebutuhan Anda.

blah238
sumber
sedangkan field.type = "string", kita harus meneruskan "text" di AddField_management. Saya sudah memeriksanya.
Emi
Apakah kamu yakin Ini bekerja untuk saya di 10.0 SP5.
blah238
Ini memberi saya kesalahan: arcgisscripting.ExecuteError: Gagal dieksekusi. Parameter tidak valid. GALAT 000800: Nilainya bukan anggota TEXT | FLOAT | GANDA | PENDEK | PANJANG | TANGGAL | Gumpalan | RASTER | GUID. Gagal menjalankan (AddField).
Emi
Versi / SP apa yang Anda pakai?
blah238
Saya menggunakan 10.0. Saya tidak tahu nomor paket layanan.
Emi