การเปลี่ยนชื่อฟิลด์โดยใช้ 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ประเภทฟิลด์ของวิธีได้อย่างไร และในขณะที่สนามอยู่ในสถานที่กลางจากนั้นเขตข้อมูลที่ถูกลบจากกลางและเพิ่มไปที่ล่าสุด ดูเหมือนจะไม่เปลี่ยนชื่อเป็นชื่อฟิลด์

มีวิธีแก้ปัญหาที่ดีกว่าที่ช่วยให้ฉันทำสิ่งเหล่านี้หรือไม่?


ฟิลด์เลเยอร์คุณลักษณะของคุณไม่ได้ถูกเปลี่ยนชื่อที่นี่ fieldInfo.setNewName (ดัชนี "stat") นี่คือเหตุผลที่คุณได้รับข้อผิดพลาดของคุณในบรรทัด row.setValue ("stat", gValue)
artwork21

2
setNewName (ดัชนี new_field_name) ต้องเป็นเพียงการตั้งค่าชื่อเขตข้อมูลใหม่ไม่เปลี่ยนชื่อที่มีอยู่
artwork21

2
วัตถุ FieldInfo ไม่ได้ทำอะไรกับข้อมูลพื้นฐานมันเป็นเพียงการเป็นตัวแทนของคุณสมบัติของเขตข้อมูลที่สามารถใช้เป็นอินพุตกับเครื่องมือบางอย่างสำหรับการสร้างข้อมูลใหม่คล้ายกับวัตถุ FieldMappings
blah238

1
คือold_fieldชื่อตัวแปรหรือชื่อจริงของข้อมูลเก่าหรือไม่? หากเป็นชื่อตัวแปรคุณต้องใช้การจัดรูปแบบสตริงหรือการต่อข้อมูลเพื่อตัดค่าของตัวแปรด้วยวงเล็บ (VB parser) หรือเครื่องหมายอัศเจรีย์ (Python parser)
blah238

1
นามแฝงทั่วไปคือ "ชื่อเล่น" หรือนามแฝง ไม่จำเป็นต้องเท่ากับชื่อคอลัมน์จริงในฐานข้อมูล
blah238

คำตอบ:


15

ลองใช้การรวมกันของ Add Field, คำนวณ Field, และ Delete arcpy tools:

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
ฉันต้องการทำให้ทั้งสองประเภทฟิลด์เหมือนกัน แต่ field.Type และชื่อ field_type ของ AddField_management ของวิธีการนั้นไม่เหมือนกัน จะทำอย่างไร?
Emi

@Emi ฉันไม่เข้าใจว่าคุณหมายถึง "สองประเภทเขตข้อมูลเดียวกัน"? คุณต้องการค่าใน "สถานะ" ที่จะใส่ในเขตข้อมูลใหม่ที่เรียกว่า "stat"?
artwork21

ใช่ฉันต้องการค่าใน "สถานะ" เพื่อใส่ในเขตข้อมูลใหม่ที่เรียกว่า "stat"
Emi

ฉันยังพยายามแทนfieldInfo.addField ("status", "stat", "VISIBLE", "NONE") fieldInfo.setNewName(index, "stat")แต่เกิดข้อผิดพลาดเดียวกันกับรหัสของฉัน
Emi

สำหรับแถว = arcpy.UpdateCursor (inputFeatureClass) อาจลองใช้แถว = arcpy.UpdateCursor (เลเยอร์)
ศิลปะ 21

9

ตอนนี้คุณสามารถเปลี่ยนชื่อฟิลด์โดยใช้หลักเครื่องมือ ArcGIS สก์ท็อป GP - Alter สนาม (การจัดการข้อมูล) เครื่องมือนี้ให้ความสามารถในการเปลี่ยนชื่อเขตข้อมูลหรือเปลี่ยนชื่อนามแฝงของฟิลด์สำหรับตารางฐานข้อมูลหรือคลาสคุณลักษณะใด ๆ

เครื่องมือนี้สามารถใช้ได้กับการเริ่มต้น 10.2.1


5
รองรับเฉพาะรูปแบบข้อมูลบางอย่างเท่านั้น มันเป็นข้อผิดพลาดในรูปร่าง shapefiles
jpmc26

3

การเปลี่ยนชื่อเขตข้อมูลในตารางหรือคุณลักษณะระดับผมจะพยายามขั้นตอนที่อธิบายที่นี่

  1. เริ่ม ArcMap และเปิดหน้าต่างแคตตาล็อก
  2. ค้นหาฐานข้อมูลที่มีตารางที่คุณต้องการแก้ไข
  3. คลิกขวาที่ตารางและคลิกคุณสมบัติ
  4. คลิกที่แท็บฟิลด์
  5. คลิกที่ข้อความที่มีอยู่ในคอลัมน์ชื่อฟิลด์และพิมพ์ชื่อใหม่

ฉันเพิ่งทดสอบสิ่งนี้ในตารางฐานข้อมูลไฟล์โดยใช้ ArcGIS สำหรับเดสก์ท็อปมาตรฐาน 10.1 SP1 และทำงานได้ดี

น่าเสียดายหลังจากเขียนสิ่งนี้ฉันค้นหาสิ่งใหม่ใน ArcGIS 10.1 ไฟล์ PDF และพบว่าฟังก์ชั่นนี้อาจถูกเพิ่มเข้ามาในเวอร์ชั่นนั้น - มันอาจคุ้มค่าที่จะทดสอบเซอร์วิสแพ็คล่าสุด 10.0 เพื่อดูว่ามีการย้ายกลับมาที่นั่นหรือไม่


1
ฉันเชื่อว่า Emi กำลังมองหาวิธีแก้ปัญหา arcpy
artwork21

จริงๆแล้วฉันกำลังค้นหาวิธีแก้ปัญหา arcpy
Emi

1
ความผิดพลาดของฉัน - ฉันคิดว่า @Emi กล่าวว่า "มีใด ๆทางออกที่ดีกว่า ..." [หนาของฉัน]
PolyGeo

1

สองปัญหาใหญ่กับรหัส:

  • หาก dataType ไม่ใช่ FeatureLayer โปรแกรมจะข้ามไปที่การจัดการ fieldinfo และลองตั้งค่าเป็นเขตข้อมูลใหม่ / เปลี่ยนชื่อที่ไม่เคยสร้าง / เปลี่ยนชื่อ

  • สองบรรทัด:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    มีปัญหาใหญ่ หากรหัสก่อนหน้านี้ใช้งานได้ฟิลด์ "สถานะ" ไม่มีอยู่


ฉันตรวจสอบรหัสและในขณะที่มันเป็นเลเยอร์คุณลักษณะและคลาสคุณลักษณะมีฟิลด์ชื่อ "สถานะ" ให้ข้อผิดพลาดเดียวกัน
Emi

หากบรรทัดแรกใช้งานได้บรรทัดที่สองจะไม่ทำงาน
mhoran_psprep

คุณเปลี่ยนข้อมูลในเลเยอร์ แต่เป็นการอ่านและเขียนข้อมูลจาก / เป็น Featureclass
mhoran_psprep

1

ฉันจะแมป field.type กับประเภทฟิลด์ของเมธอด AddField_management ได้อย่างไร

สิ่งนี้จะทำโดยอัตโนมัติตามโพสต์นี้

และในขณะที่สนามอยู่ในสถานที่กลางจากนั้นเขตข้อมูลที่ถูกลบจากกลางและเพิ่มไปที่ล่าสุด ดูเหมือนจะไม่เปลี่ยนชื่อเป็นชื่อฟิลด์ มีวิธีแก้ปัญหาที่ดีกว่าที่ช่วยให้ฉันทำสิ่งเหล่านี้หรือไม่?

ดังที่ฉันพูดถึงในคำถามอื่นของคุณตัวเลือกอื่น ๆ ของคุณคือการปล่อยและสร้างคลาส / ตารางคุณลักษณะทั้งหมดใหม่หรือแก้ไขคำจำกัดความของคอลัมน์ใน DBMS พื้นฐาน

ฉันคิดว่าคุณทำได้ลบคอลัมน์ผู้ใช้ทั้งหมดและสร้างใหม่ตามลำดับที่ต้องการ แต่มันก็บ้าไปหน่อย สคริปต์ในคำตอบนี้ตรงกับที่คุณอาจปรับให้เข้ากับความต้องการของคุณ


ในขณะที่ field.type = "string" เราต้องผ่าน "text" ที่ AddField_management ฉันได้ตรวจสอบแล้ว
Emi

คุณแน่ใจไหม? มันใช้งานได้สำหรับฉันที่ 10.0 SP5
blah238

มันทำให้ฉันมีข้อผิดพลาด: arcgisscripting.ExecuteError: ล้มเหลวในการดำเนินการ พารามิเตอร์ไม่ถูกต้อง ข้อผิดพลาด 000800: ค่าไม่ใช่สมาชิกของ TEXT | ลอย สองเท่า | SHORT | LONG | DATE | BLOB | RASTER | GUID ไม่สามารถดำเนินการ (AddField)
Emi

คุณอยู่ที่เวอร์ชัน / SP ใด
blah238

ฉันใช้ 10.0 ฉันไม่ทราบหมายเลขเซอร์วิสแพ็ค
Emi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.