Trường tăng tự động dựa trên các nhóm trong lớp tính năng?


10

Tôi cần tự động tăng một trường dựa trên các nhóm trong một lớp đối tượng. Tôi có 8 ô trong một đa giác đã cho và tôi cần gán cho chúng một ID từ 1-8 cho mỗi bộ ô trong mỗi đa giác. Đa giác sẽ có số ID duy nhất của riêng nó được sử dụng để nhóm các ô.

Tôi cho rằng nó sẽ là một sự thay đổi của điều này:

rec=0
def autoIncrement():
 global rec
 pStart = 1 
 pInterval = 1 
 if (rec == 0): 
  rec = pStart 
 else: 
  rec = rec + pInterval 
 return rec

1
Bạn có thể muốn đọc về việc sử dụng toán tử mô đun của Python ( %)
Vince

Câu trả lời:


12

Máy tính trường cho Python

d={}
def GroupOrder(groupID):
  if groupID in d: d[groupID]+=1
  else: d[groupID]=1
  return d[groupID]

---------------------------

GroupOrder( !locality! )

Thay đổi! Địa phương! đến lĩnh vực liên quan.

CẬP NHẬT: Biến thể của biểu thức này:

d={}
def GroupOrder(groupID):
  N=d.get(groupID,0);N+=1
  d[groupID]=N
  return N

Nên làm việc nhanh hơn nhiều trên các tập dữ liệu lớn.


Nếu hàm GroupOrder được sử dụng trong tập lệnh python độc lập, thì GroupOrderhàm đó sẽ là code blockđối số và GroupOrder( !locality! )sẽ là đối số 'biểu thức'.
dùng3467260

Trong kịch bản, đó là: a) tạo từ điển b) cập nhật con trỏ trên nhóm 2 trường và một trường được điền. 3-5 dòng mã.
FelixIP

1
Tôi đã bỏ qua đề cập trong nhận xét của mình rằng những đối số đó sẽ được bao gồm trong công cụ trường tính toán phức tạp: arcpy.CalculateField_management(inTable, fieldName, expression, "PYTHON_9.3", codeblock)nếu được sử dụng trong một tập lệnh độc lập. Cảm ơn bạn đã mô tả các bước của một cách tiếp cận khác để sử dụng mã của bạn trong một tập lệnh độc lập.
dùng3467260

Tất cả đều tốt. Dù sao, tôi có ấn tượng rằng con trỏ da nhanh hơn nhiều so với máy tính trường.
FelixIP
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.