Cơ bản If / Then trong Python Parser của ArcGIS Field Calculator?


18

Tôi đang sử dụng ArcGIS 10.2 cho Máy tính để bàn và tôi đã xem qua trang web này và dường như chưa thể tìm ra câu trả lời của tôi. Rất mới đối với VBA và Python, nhưng rất nhiều năm với ArcGIS. Tôi biết tôi có thể làm điều này một cách chậm chạp với Chọn theo thuộc tính, nhưng tốn thời gian.

Tôi đang cố gắng tham gia không gian giữa các trường hợp mắc bệnh (lớp điểm) và Vùng điều tra dân số Hoa Kỳ (lớp đa giác). Điều này đòi hỏi dữ liệu đếm. Đối với mỗi điểm / trường hợp, tôi có một trường có tên là NĂM ​​với các phạm vi ngày 2001 đến 2012 tùy thuộc vào năm xảy ra vụ án. Tôi cần một cột đếm cho mỗi năm. Ví dụ: cái đầu tiên tôi gọi là COUNT01. Nếu ngày trường hợp trong NĂM là 2001, thì COUNT01 sẽ có 1 trong đó. Nếu đó là bất kỳ năm nào khác (2002-2012), thì sẽ cần phải có 0. Tôi sẽ có các cột COUNT02, COUNT03 ... COUNT12. Không thể có giá trị "Null".

Đây là những gì tôi đã thử cho đến nay

nhập mô tả hình ảnh ở đây

Và đây là những gì dữ liệu trông giống như trong Arc.

nhập mô tả hình ảnh ở đây


3
Tôi khuyên bạn nên làm điều này bằng Python và chỉnh sửa Câu hỏi của bạn để thay thế vbavbscriptcác thẻ bằng một pythonthẻ. Mặc dù chưa biến mất nhưng VBScript đang trong quá trình bị phản đối . Tôi hy vọng sẽ dễ dàng thực hiện với trình phân tích cú pháp Python khi bạn cung cấp mô tả chi tiết hơn bao gồm hình ảnh / bảng của một số hàng mẫu hiển thị đầu vào thực tế và đầu ra dự kiến. NĂM là trường ngày hay trường số nguyên chứa các giá trị tương ứng với năm?
PolyGeo

Cảm ơn lời khuyên và giúp đỡ. Tôi đã thêm một hình ảnh của bảng thuộc tính. Biến đầu vào NĂM hiện được lưu trữ dưới dạng Double (Nó được phân tích cú pháp từ Ngày SAS) và cột biến đầu ra Counts01 được lưu dưới dạng Số nguyên ngắn.
BenW

1
Bạn đã xem xét sử dụng Thống kê Tóm tắt với NĂM làm trường hợp của bạn chưa? Điều đó sẽ cung cấp cho bạn COUNT mỗi năm mà không cần sử dụng Python hoặc Máy tính trường.
PolyGeo

Cảm ơn lời khuyên của bạn. Tôi đã xem xét Thống kê Tóm tắt, nhưng mục tiêu cuối cùng là tính số trường hợp hàng năm trên 1.249 vùng điều tra dân số riêng lẻ từ đó tôi có thể tính tỷ lệ mới mắc trung bình hàng năm và 10yr trên 100k. Một số vùng điều tra dân số đã không có trường hợp, một số đã có một tấn, nhưng tôi cần tất cả chúng để được bao gồm. Ngay cả việc tóm tắt các Vùng theo năm cũng bỏ qua 278 trong số các vùng đó mà không có trường hợp nào.
BenW

Câu trả lời:


38

Tôi nghĩ rằng đây là những gì bạn muốn .... bằng cách sử dụng python, bạn có thể thực hiện các thao tác sau (giả sử các trường NĂM và COUNT0X là số nguyên)

  • Thay đổi thành Python như được tô sáng bên dưới
  • Thêm mã vào hộp nhập 'Pre Logic'
  • Thay đổi yearVal khi cần cho từng lĩnh vực bạn tính toán (Count01 sẽ sử dụng 2001, Count02 sẽ sử dụng 2002, v.v.)

Lưu ý Python sử dụng thụt lề để phân tích mã để đảm bảo khoảng cách là chính xác.

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

điều này


3
@BenW - nếu điều này giải quyết được vấn đề của bạn, vui lòng đánh dấu đây là câu trả lời (đánh dấu vào ô dưới số phiếu trả lời).
Chad Cooper

Phải làm gì nếu tôi muốn kiểm tra một giá trị chuỗi trong câu lệnh if có chứa các chữ cái có dấu không?
greyline

Phải làm gì nếu các trường nằm trên một loại khác, ví dụ văn bản, gấp đôi, v.v.?
khaliff

@khaliff bạn có thể chèn một số chức năng chuyển đổi loại trong mã python Ví dụ if (int(year) == yearVal): hoặc các loại khác (xem: notifyit.com/articles/article.aspx?p=459269&seqNum=7 ).
gisnside

Cảm ơn bạn. Bạn cũng có một liên kết nơi tôi có thể tìm thấy khi nào nên sử dụng myCalc, myFunc, Reclass, v.v.?
khaliff

8

Câu trả lời này về cơ bản giống như được liệt kê ở trên, tuy nhiên đó là cách không phải sử dụng khối mã ... cho trường Count01, bạn sẽ đặt trình phân tích cú pháp thành Python và sau đó đặt phép tính của bạn thành

1 if !YEAR! == 2001 else 0

Cách đọc này là: Đặt trường thành 1 nếu trường NĂM là 2001, nếu không phải là 2001, sau đó đặt thành 0 ...

Nếu bạn có nhiều điều kiện if, bạn có thể lồng các điều kiện "nếu" thứ 2 (và tiếp theo) bên trong câu lệnh khác, chẳng hạn như ...

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

Cách đọc này là: Đặt trường thành 1 nếu trường NĂM là 2001, nếu không phải là 2001, sau đó đặt thành 2 nếu là 2002, nếu không, sau đó đặt thành 0 ...


Tôi nên sửa đổi tính toán này như thế nào nếu tôi có nhiều hơn một điều kiện, ý tôi là như thể chúng ta đang sử dụng "elif"?
khaliff

Nếu bạn có nhiều hơn một điều kiện, bạn có thể lồng các điều kiện "nếu" thứ 2 (và tiếp theo) bên trong câu lệnh khác ... để bạn có thể kết thúc với một cái gì đó như thế này ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller

6

Nếu bạn định sử dụng VBScript thì tính toán trường của bạn đã được thiết lập sai. Đầu tiên tôi sẽ không sử dụng một biến là tên của trường, điều này gây nhầm lẫn, sử dụng một tên khác để nó rõ ràng những gì bạn đang đặt. "Endif" của bạn đã sai, nó phải là "end if" và mã của bạn phải nằm trong phần kịch bản tiền logic. Cách chính xác để thiết lập này được hiển thị dưới đây. Nhưng như những người khác đã nói, cố gắng không sử dụng VBScript vì ESRI đang cố gắng loại bỏ nó để ủng hộ Python.

Cách sử dụng máy tính trường đúng


cảm ơn rất nhiều về sự giúp đỡ của bạn. Cuối cùng tôi đã đi với Python vì đó dường như là sự đồng thuận chung.
BenW
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.