ArcPy kullanarak alan yeniden adlandırılsın mı?


9

Yapmam gerekenler:

  1. tablo / özellik sınıfının alan adını yeniden adlandırma
  2. tüm değerleri yeni alana kopyala

Şimdiye kadar @ artwork21 önerdiği gibi aşağıdaki kodu yaptık:

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)

Nasıl haritalayabilirsiniz field.typeiçin AddField_managementyöntemin alan türü? Ve alan orta bir yerdeyken, alan ortadan silinir ve sonuncuya eklenir. Alan adı yeniden adlandırılmış gibi görünmüyor.

Bunları yapmama yardımcı olacak daha iyi bir çözüm var mı?


Özellik katmanı alanınız burada yeniden adlandırılmıyor, fieldInfo.setNewName (index, "stat"). Hatayı line..setValue ("stat", gValue) satırından almanızın nedeni budur.
artwork21

2
setNewName (dizin, yeni_alan_adı), yalnızca yeni alan adlarını ayarlamak için olmalı, mevcut olanları yeniden adlandırmamalıdır.
artwork21

2
Bir FieldInfo nesnesi temeldeki verilere hiçbir şey yapmaz, basitçe bir FieldMappings nesnesine benzer şekilde yeni veri oluşturmak için belirli araçlara giriş olarak kullanılabilen alan özelliklerinin bir temsilidir.
blah238

1
old_fieldDeğişken adı mı yoksa eski alanın gerçek adı mı? Değişken adı ise, değişkenin değerini parantez (VB ayrıştırıcısı) veya ünlem işareti (Python ayrıştırıcısı) ile sarmak için dize biçimlendirmesi veya birleştirme kullanmanız gerekir.
blah238

1
Bir diğer adı genel olarak bir "takma" ya da bir takma . Veritabanındaki gerçek sütun adına eşit olması gerekmez.
blah238

Yanıtlar:


15

Bunu Alan Ekle, Alan Hesapla ve Alan kavisli araçlarını bir arada kullanarak deneyin:

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
İki alan türünü aynı yapmak istiyorum. ancak field.Type ve AddField_management yönteminin field_type adları aynı değildir. Ne yapalım?
Emi

@Emi, "iki alan türü aynı" ile ne demek istediğini anlamıyorum? "Durum" daki değerin "stat" adlı yeni bir alana yerleştirilmesini mi istiyorsunuz?
artwork21

evet "stat" deki değerin "stat" adlı yeni alana konmasını istiyorum
Emi

Ben de fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")yerine denedim fieldInfo.setNewName(index, "stat"). Ama aynı hata benim kodumda oldu.
Emi

Satırlar = arcpy.UpdateCursor (inputFeatureClass) için belki satırları deneyin = arcpy.UpdateCursor (layer)
artwork21

9

Artık bir alanı temel ArcGIS Desktop GP aracını (Alanı Değiştir (Veri Yönetimi)) kullanarak yeniden adlandırabilirsiniz . Bu araç, herhangi bir coğrafi veritabanı tablosu veya özellik sınıfı için alanları yeniden adlandırma veya alan takma adlarını yeniden adlandırma olanağı sağlar.

Bu araç 10.2.1'den itibaren kullanılabilir .


5
Bu yalnızca belirli veri formatlarını destekler. Özellikle şekil dosyalarına bir hata verir.
jpmc26

3

Bir tablo veya özellik sınıfındaki bir alanı yeniden adlandırmak için burada açıklanan yordamı deneyeceğim .

  1. ArcMap'i başlatın ve Katalog penceresini açın.
  2. Değiştirmek istediğiniz tabloyu içeren veritabanını bulun.
  3. Tabloyu sağ tıklatın ve Özellikler'i tıklatın.
  4. Alanlar sekmesini tıklayın.
  5. Alan Adı sütununda mevcut metni tıklatın ve yeni bir ad yazın.

Ben sadece ArcGIS for Desktop Standard 10.1 SP1 kullanarak bir dosya geodatabase tablosunda test ve iyi çalıştı.

Ne yazık ki, bunu yazdıktan sonra ArcGIS 10.1 PDF dosyasındaki Yenilikleri aradım ve bu işlevin bu sürüme eklenmiş olabileceğini buldum - yine de geri taşınmış olup olmadığını görmek için 10.0'un en son hizmet paketini test etmeye değer olabilir.


1
Emi'nin kıvrımlı bir çözüm aradığına inanıyorum.
artwork21

Aslında ben arcpy çözüm arıyorum
Emi

1
Hatam - Ben @Emi düşünce "var mı dedi herhangi [my kalınlaştırma] daha iyi bir çözüm ...".
PolyGeo

1

kodla ilgili iki büyük sorun:

  • dataType bir FeatureLayer değilse, program fieldinfo manipülasyonlarını atlar ve değeri hiç oluşturulmamış / yeniden adlandırılmamış yeni / yeniden adlandırılmış bir alana ayarlamaya çalışır

  • İki çizgi:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    büyük bir sorun var. Önceki kod işe yaradıysa "status" alanı mevcut değil.


Kodu kontrol ettim ve bir özellik katmanı ve özellik sınıfı "durum" adlı bir alan içeriyor, aynı hatayı veriyor
Emi

İlk satır çalışırsa, ikinci satır çalışmaz.
mhoran_psprep

katmandaki bilgileri değiştirdiniz, ancak
özellik sınıfından

1

Field.type dosyasını AddField_management yönteminin alan türüyle nasıl eşleyebilirim?

Bu gönderiye göre bu otomatik olarak yapılır .

Ve alan orta bir yerdeyken, alan ortadan silinir ve sonuncuya eklenir. Alan adı yeniden adlandırılmış gibi görünmüyor. Bunları yapmama yardımcı olacak daha iyi bir çözüm var mı?

Diğer sorunuzda belirttiğim gibi , diğer seçenekleriniz tüm özellik sınıfını / tablosunu bırakmak ve yeniden oluşturmak veya temel DBMS'deki sütun tanımını değiştirmek.

Ben varsayalım olabilir tüm kullanıcı sütunları silmek ve istenilen sıraya göre yeniden oluşturun ama bu biraz deli. Bu cevaptaki komut dosyası tam olarak bunu yapar, muhtemelen ihtiyaçlarınıza göre uyarlayabilirsiniz.


field.type = "string" olurken, AddField_management'ta "text" iletmeliyiz. Kontrol ettim.
Emi

Emin misiniz? Benim için 10.0 SP5'te çalışıyor.
blah238

Bana hata veriyor: arcgisscripting.ExecuteError: Yürütülemedi. Parametreler geçerli değil. HATA 000800: Değer TEXT üyesi değil | YÜZER | ÇİFT | KISA | UZUN | TARİH | BLOB | RASTER | GUID. (AddField) yürütülemedi.
Emi

Hangi versiyonda / SP'desınız?
blah238

10.0 kullanıyorum. Hizmet paketi numarasını bilmiyorum.
Emi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.