Saya memiliki beberapa lusin kelas fitur, salah satunya berisi bidang yang saya cari. Mereka disimpan dalam beberapa file geodatabases yang berbeda.
Apakah ada cara cepat mencari setiap kelas fitur untuk menemukan yang memiliki bidang saya? Atau apakah saya harus memeriksa tabel atribut masing-masing dalam Katalog? Beberapa file memiliki nama yang sama tetapi disimpan di lokasi yang berbeda.
Saya ingin dapat melakukan ini di dalam Calculate Value
alat di ModelBuilder, sehingga setiap kali saya perlu, saya bisa menjalankan model pada satu file gdb dan akan mencari melalui semua kelas fitur dalam gdb itu dan mencari bidang .
Sejauh ini, saya memiliki iterator kelas fitur yang beralih ke semua kelas fitur dalam file gdb secara rekursif. Di dalam Calculate Value
saya memiliki kode berikut:
findField(r"%Feature%", "%Search Field%")
def findField(fc, fi):
lst = arcpy.ListFields(fc)
for f in lst:
if f.name == fi:
return fc
else:
return "not found"
Nilai yang dikembalikan dikumpulkan Output Values
sebagai string. Output untuk semua kelas fitur telah "tidak ditemukan", meskipun bidang ada di setidaknya 4 dari mereka.
sumber
Calculate Value
untuk mencari bidang, dan mengembalikan jalur kelas fitur sebagai string jika menemukan bidang - lihat jawaban saya di bawah ini.Jawaban:
Saya lebih suka pemahaman daftar daripada operasi string (seperti jawaban yang diterima). Menurut pendapat saya, ini lebih mudah dibaca dan pythonic. Lebih jauh, pendekatan pemahaman daftar dapat diperluas dengan menambahkan fungsionalitas lebih lanjut (
str.lower()
, seperti yang dilakukan @RyanDalton) dengan sangat mudah.Jika Anda lebih suka satu kalimat jika-pernyataan lain:
Atau bahkan lebih pendek, tetapi kurang mudah dibaca:
sumber
Periksa fungsi ini dari oleh Bjorn Kuiper untuk menguji apakah ada bidang :
dengan contoh penggunaan berikut:
sumber
Anda bisa menggunakan arcpy:
Selain itu, Anda dapat menggunakan os.walk untuk file di drive Anda sebagai:
semoga membantu ....
sumber
Arabella, apakah kacamata feature Anda di Feature Datasets? Jika demikian, solusi @ Aragon tidak akan berfungsi karena Anda perlu menelusuri kumpulan data fitur dan kemudian memeriksa kacamata feature.
Menggunakan kode @ Aragon serta kode @ gotchula dari Daftar semua kelas fitur di GDB, termasuk dalam dataset fitur , saya menghasilkan kode berikut yang akan membaca semua dataset fitur dan kacamata fitur dalam geodatabase.
CATATAN : Secara default, ListFields tampaknya peka terhadap huruf besar-kecil. Saya telah menambahkan kode untuk mengonversi fieldname yang ditentukan pengguna dan nama ListField ke huruf kecil untuk pencarian case-insensitive. Anda mungkin juga ingin menonaktifkan sebagian besar pernyataan cetak, tetapi saya membiarkannya di sana sehingga Anda dapat mengikuti kode ketika sedang berjalan. Saya juga membuat subfungsi FindField di dalam sehingga saya bisa menyebutnya beberapa kali dalam skrip tanpa harus kode ulang.
sumber
Calculate Value
kembalikan - bisakah sayareturn "true" if FindField(fc,myField) =="true" else "false"
?Beberapa telah menari di sekitar cara saya akan melakukan ini, tetapi saya hanya ingin menambahkan cara satu-line yang mudah untuk melakukan ini:
Apa yang mungkin lebih berguna (jika Anda mengulangi banyak fitur kelas) Saya akan menggunakan kebalikan dari yang di atas sebagai filter:
sumber
Temukan jawabannya dengan bantuan kode dalam menjawab pertanyaan ini . Saya mengambil semua nama bidang, mengubahnya menjadi string dan kemudian mencari string untuk bidang saya. Kode di
Calculate Value
sekarang terlihat sebagai berikut:The
Output Values
sekarang berisi daftar lengkap kelas fitur yang memiliki bidang saya mencari, dannot found
untuk sisanya.sumber