Basic If / Then di Python Parser dari ArcGIS Field Calculator?

18

Saya menggunakan ArcGIS 10.2 untuk Desktop, dan saya telah mencari-cari di situs ini, dan sepertinya belum dapat menemukan jawaban saya. Sangat baru untuk VBA dan Python, tetapi banyak tahun dengan ArcGIS. Saya tahu saya bisa melakukan ini dengan cara lambat dengan Select By Attributes, tetapi itu memakan waktu.

Saya mencoba gabungan spasial antara kasus-kasus penyakit (lapisan poin) dan US Census Tracts (lapisan poligon). Ini membutuhkan data jumlah. Untuk setiap titik / kasus, saya memiliki bidang yang disebut TAHUN dengan rentang tanggal 2001 hingga 2012 tergantung pada tahun apa kasus itu terjadi. Saya perlu kolom hitungan untuk setiap tahun. Misalnya, yang pertama saya panggil COUNT01. Jika tanggal kasus dalam TAHUN adalah 2001, maka COUNT01 akan memiliki 1 di dalamnya. Jika tahun lainnya (2002-2012), maka harus ada 0. Saya akan memiliki COUNT02, COUNT03 ... COUNT12 kolom. Tidak dapat memiliki nilai "Null".

Inilah yang saya coba sejauh ini

masukkan deskripsi gambar di sini

Dan inilah tampilan data di Arc.

masukkan deskripsi gambar di sini

BenW
sumber
3
Saya menyarankan Anda melakukan ini menggunakan Python dan mengedit Pertanyaan Anda untuk mengganti vbadan vbscripttag dengan pythontag. Meskipun belum hilang VBScript sedang dalam proses menjadi usang . Saya berharap ini akan mudah dilakukan dengan parser Python setelah Anda memberikan deskripsi yang lebih rinci yang mencakup gambar / tabel dari beberapa baris sampel yang menunjukkan input aktual dan output yang diharapkan. Apakah YEAR bidang tanggal atau bidang bilangan bulat yang berisi nilai yang sesuai dengan tahun?
PolyGeo
Terima kasih atas saran dan bantuannya. Saya telah menambahkan gambar dari tabel atribut. Variabel input YEAR saat ini disimpan sebagai Double (Diuraikan dari Tanggal SAS), dan kolom variabel output Counts01 disimpan sebagai Integer Pendek.
BenW
1
Sudahkah Anda mempertimbangkan untuk menggunakan Statistik Ringkasan dengan YEAR sebagai bidang kasus Anda? Itu akan memberi Anda COUNT untuk setiap tahun tanpa perlu menggunakan Python atau Field Calculator.
PolyGeo
Terima kasih atas saranmu. Saya memang mempertimbangkan Statistik Ringkasan, tetapi tujuan akhirnya adalah untuk memiliki jumlah kasus tahunan per 1.249 trus sensus individu yang darinya saya dapat menghitung tingkat kejadian rata-rata tahunan dan 10 tahun per 100 ribu. Beberapa traktus sensus tidak memiliki kasing, beberapa ada ton, tetapi saya perlu semuanya dimasukkan. Bahkan meringkas Tract per tahun menghilangkan 278 traktat tanpa case.
BenW

Jawaban:

38

Saya pikir ini adalah apa yang Anda inginkan .... menggunakan python Anda bisa melakukan hal berikut (mengasumsikan bidang TAHUN dan COUNT0X adalah bilangan bulat)

  • Ubah ke Python seperti yang disorot di bawah ini
  • Tambahkan kode ke kotak input 'Pre Logic'
  • Ubah yearVal sesuai kebutuhan untuk setiap bidang yang Anda hitung (Count01 akan menggunakan 2001, Count02 akan menggunakan 2002, dll)

Catatan Python menggunakan lekukan untuk mengurai kode sehingga memastikan jaraknya benar.

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

ini

fader gelap
sumber
3
@BenW - jika ini menyelesaikan masalah Anda, harap tandai ini sebagai jawaban (centang kotak di bawah penghitungan suara jawaban).
Chad Cooper
Apa yang harus saya lakukan jika saya ingin memeriksa nilai string dalam pernyataan if yang berisi huruf-huruf beraksen?
greyline
Apa yang harus dilakukan jika bidang berada pada tipe lain misalnya teks, ganda, dll?
khaliff
@khaliff Anda dapat menyisipkan beberapa fungsi konversi tipe dalam kode python Misalnya if (int(year) == yearVal): , atau yang lain (lihat: informit.com/articles/article.aspx?p=459269&seqNum=7 ).
gisnside
Terima kasih. Apakah Anda juga memiliki tautan tempat saya dapat menemukan kapan harus menggunakan myCalc, myFunc, Reclass, dll.?
khaliff
8

Jawaban ini pada dasarnya sama dengan yang tercantum di atas, namun cara untuk tidak harus menggunakan blok kode ... untuk bidang Count01, Anda akan mengatur parser ke Python dan kemudian mengatur perhitungan Anda ke

1 if !YEAR! == 2001 else 0

Cara ini berbunyi: Setel bidang ke 1 jika bidang TAHUN adalah 2001, jika bukan 2001, maka setel ke 0 ...

Jika Anda memiliki beberapa kondisi if, Anda dapat membuat kondisi ke-2 (dan selanjutnya) ke-2 di dalam pernyataan lain, seperti ini ...

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

Cara membaca ini adalah: Setel bidang ke 1 jika bidang TAHUN adalah 2001, jika bukan tahun 2001, lalu setel ke 2 jika tahun 2002, jika tidak, maka setel ke 0 ...

Jason Miller
sumber
Bagaimana saya harus memodifikasi perhitungan ini jika saya memiliki lebih dari satu syarat, maksud saya seolah-olah kita menggunakan "elif"?
khaliff
Jika Anda memiliki lebih dari satu syarat, Anda dapat membuat kondisi ke-2 "dan selanjutnya" di dalam pernyataan lain ... sehingga Anda mungkin berakhir dengan sesuatu seperti ini ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller
6

Jika Anda akan menggunakan VBScript maka perhitungan bidang Anda salah. Pertama saya tidak akan menggunakan variabel yang merupakan nama bidang, ini membingungkan, gunakan nama yang berbeda sehingga sangat jelas apa yang Anda setting. "Endif" Anda salah, seharusnya "berakhir jika" dan kode Anda seharusnya ada di bagian skrip pra-logika. Cara yang benar untuk mengatur ini ditunjukkan di bawah ini. Tetapi seperti yang dikatakan orang lain, cobalah untuk tidak menggunakan VBScript karena ESRI sangat ingin menyingkirkannya demi Python.

Penggunaan Kalkulator Bidang yang Benar

Hornbydd
sumber
Terima kasih banyak atas bantuannya. Saya akhirnya pergi dengan Python karena tampaknya menjadi konsensus keseluruhan.
BenW