Đổi tên trường bằng ArcPy?


9

Những gì tôi cần làm:

  1. đổi tên trường của bảng / lớp đối tượng
  2. sao chép tất cả các giá trị sang trường mới

Cho đến nay tôi đã thực hiện theo mã như @ tác phẩm nghệ thuật21 gợi ý:

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)

Làm cách nào tôi có thể ánh xạ field.typetới AddField_managementloại trường của phương thức? Và trong khi trường nằm ở giữa, sau đó trường bị xóa từ giữa và thêm vào cuối cùng. Điều đó không giống như tên trường được đổi tên.

Có giải pháp nào tốt hơn giúp tôi làm những việc này không?


Trường lớp tính năng của bạn không được đổi tên ở đây, fieldInfo.setNewName (index, "stat"). Đây là lý do tại sao bạn nhận được lỗi của mình trên dòng row.setValue ("stat", gValue).
nghệ thuật21

2
setNewName (index, new_field_name), chỉ dành cho việc đặt tên trường mới, không đổi tên tên hiện có.
nghệ thuật21

2
Đối tượng FieldInfo không làm gì với dữ liệu cơ bản, nó chỉ đơn giản là một đại diện của các thuộc tính trường có thể được sử dụng làm đầu vào cho một số công cụ nhất định để tạo dữ liệu mới, tương tự như đối tượng FieldMappings.
blah238

1
old_fieldmột tên biến hoặc tên thực tế của trường cũ? Nếu đó là tên biến, bạn cần sử dụng định dạng chuỗi hoặc nối chuỗi để bọc giá trị của biến bằng dấu ngoặc (trình phân tích cú pháp VB) hoặc dấu chấm than (trình phân tích cú pháp Python).
blah238

1
Một bí danh nói chung là một "biệt danh" hoặc một bút danh . Nó không nhất thiết phải bằng tên cột thực tế trong cơ sở dữ liệu.
blah238

Câu trả lời:


15

Hãy thử điều này bằng cách sử dụng kết hợp các công cụ thêm trường, tính toán trường và xóa trường

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
Tôi muốn làm cho hai loại trường giống nhau. nhưng tên trường_type của phương thức field.Type và AddField_man không giống nhau. Phải làm sao
Emi

@Emi, tôi không hiểu ý của bạn là "hai loại trường giống nhau"? Bạn muốn giá trị trong "trạng thái", được đặt trong một trường mới gọi là "stat"?
nghệ thuật21

có, tôi muốn giá trị trong "trạng thái", đặt vào trường mới gọi là "stat"
Emi

Tôi cũng đã thử fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")thay thế fieldInfo.setNewName(index, "stat"). Nhưng lỗi tương tự đã xảy ra với mã của tôi.
Emi

Đối với hàng = arcpy.UpdateC tiền (inputFeatureClass), có thể thử hàng = arcpy.UpdateC tiền (lớp)
nghệ thuật21

9

Bây giờ bạn có thể đổi tên một trường bằng cách sử dụng công cụ ArcGIS Desktop GP cốt lõi - Trường thay đổi (Quản lý dữ liệu) . Công cụ này cung cấp khả năng đổi tên các trường hoặc đổi tên bí danh của trường cho bất kỳ bảng cơ sở dữ liệu địa lý hoặc lớp tính năng nào.

Công cụ này có sẵn bắt đầu với 10.2.1 .


5
Điều này chỉ hỗ trợ các định dạng dữ liệu nhất định. Đáng chú ý, nó ném một lỗi trên shapefiles.
jpmc26

3

Để đổi tên một trường trong bảng hoặc lớp đối tượng, tôi sẽ thử quy trình được mô tả ở đây .

  1. Bắt đầu ArcMap và mở cửa sổ Catalog.
  2. Xác định vị trí cơ sở dữ liệu chứa bảng bạn muốn thay đổi.
  3. Bấm chuột phải vào bảng và bấm Thuộc tính.
  4. Nhấp vào tab Trường.
  5. Nhấp vào văn bản hiện có trong cột Tên trường và nhập tên mới.

Tôi vừa thử nghiệm điều này trên bảng cơ sở dữ liệu địa lý tập tin bằng ArcGIS cho Desktop Standard 10.1 SP1 và nó hoạt động tốt.

Thật không may, sau khi viết bài này, tôi đã tìm kiếm tệp What's New trong ArcGIS 10.1 và thấy rằng chức năng này có thể đã được thêm vào ở phiên bản đó - vẫn có thể thử nghiệm gói dịch vụ mới nhất 10.0 để xem liệu nó có được chuyển ở đó không.


1
Tôi tin rằng Emi đang tìm kiếm một giải pháp hấp dẫn.
nghệ thuật21

Thật ra tôi đang tìm kiếm giải pháp Arcpy
Emi

1
Sai lầm của tôi - Tôi nghĩ @Emi đã nói "Có giải pháp nào tốt hơn không ..." [ bẻ cong của tôi].
PolyGeo

1

Hai vấn đề lớn với mã:

  • nếu dataType không phải là FeatureLayer, chương trình sẽ bỏ qua các thao tác fieldinfo và sau đó thử đặt giá trị thành trường mới / được đổi tên không bao giờ được tạo / đổi tên

  • Hai dòng:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    có một vấn đề lớn Nếu mã trước đó hoạt động Trường "trạng thái" không tồn tại.


Tôi đã kiểm tra mã và trong khi đó, nó là một lớp đối tượng và lớp đối tượng chứa một trường có tên là "trạng thái", đưa ra cùng một lỗi
Emi

Nếu dòng đầu tiên hoạt động, dòng thứ hai sẽ không.
mhoran_psprep

bạn đã thay đổi thông tin trong lớp, nhưng đang đọc và ghi dữ liệu từ / sang
featureclass

1

Làm cách nào tôi có thể ánh xạ loại trường.type sang loại trường của phương thức AddField_man quản lý?

Điều này được thực hiện tự động, theo bài viết này .

Và trong khi trường nằm ở giữa, sau đó trường bị xóa từ giữa và thêm vào cuối cùng. Điều đó không giống như tên trường được đổi tên. Có giải pháp nào tốt hơn giúp tôi làm những việc này không?

Như tôi đã đề cập trong câu hỏi khác của bạn , chỉ có các tùy chọn khác của bạn là bỏ và tạo lại toàn bộ lớp / bảng tính năng hoặc sửa đổi định nghĩa cột trong DBMS cơ bản.

Tôi cho rằng bạn có thể xóa tất cả các cột người dùng và tạo lại chúng theo thứ tự mong muốn nhưng điều đó hơi điên rồ. Kịch bản trong câu trả lời này thực hiện chính xác điều đó, có lẽ bạn có thể điều chỉnh nó theo nhu cầu của mình.


trong khi trường.type = "chuỗi", chúng ta phải chuyển "văn bản" tại AddField_man quản lý. Tôi đã kiểm tra nó.
Emi

Bạn có chắc không? Nó hoạt động với tôi ở 10.0 SP5.
blah238

Nó cho tôi lỗi: arcgisscripting.ExecuteError: Không thể thực thi. Các thông số không hợp lệ. LRI 000800: Giá trị không phải là thành viên của TEXT | SÀN | NHÂN ĐÔI | NGẮN HẠN | DÀI | NGÀY | BLOB | ĐÔNG | HƯỚNG DẪN. Không thể thực thi (AddField).
Emi

Bạn đang ở phiên bản / SP nào?
blah238

Tôi đang sử dụng 10.0. Tôi không biết số gói dịch vụ.
Emi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.