Saya mencoba mengadaptasi model dan kombinasi skrip yang ditemukan di situs blog ESRI berjudul 'Menghasilkan daftar pilihan multinilai'.
Namun, saya telah menyimpulkan bahwa bagian dari validasi yang digunakan dalam skrip tertanam bergantung pada Alat 'Frekuensi' agar dapat berfungsi dengan baik, tetapi ini hanya tersedia dengan Lisensi lanjutan (lumpuh). Posting blog menjelaskan alur kerja dan tempat untuk mengunduh model dan skrip (tapi saya akan dengan senang hati mempostingnya di sini atas permintaan). Sejauh yang saya tahu, inti dari fungsionalitas yang saya cari, menghasilkan daftar pilihan multinilai:
..is didasarkan pada skrip validasi yang berfungsi dengan baik. Tanpa validasi, saya tidak bisa mendapatkan nilai dari bidang muncul sebagai daftar. Adakah yang bisa saya hapus dari skrip validasi ini untuk mendapatkan fungsionalitas yang saya kejar, atau ada solusinya? Saya tidak terbiasa dengan proses validasi. Berikut adalah kode untuk validasi (saya akan memposting sebagai Contoh Kode, tetapi sepertinya ini lebih mudah untuk diikuti):
[ Catatan editor: ini kode validasi aktual, gambarnya tidak benar]
import arcpy
class ToolValidator(object):
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
self.params = arcpy.GetParameterInfo()
def initializeParameters(self):
"""Refine the properties of a tool's parameters. This method is
called when the tool is opened."""
return
def updateParameters(self):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parmater
has been changed."""
if self.params[1].altered: #Set condition - if the input field value changes
if self.params[1].value: #if the field parameter has a value
for field in arcpy.Describe(self.params[0].value).fields: #iterate through fields in the input dataset
if field.name.lower() == self.params[1].value.value.lower(): #find the field object with the same name as field parameter
try:
if self.params[2].values: #if this parameter has seleted values
oldValues = self.params[2].values #set old values to the selected values
except Exception:
pass
values = set() #create an empty set
fieldname = self.params[1].value.value #set the value of variable fieldname equal to the input field value
FrequencyTable = arcpy.Frequency_analysis (self.params[0].value, "in_memory\Frequency", self.params[1].value.value, "") #for large tables create a frequency table
cursor = arcpy.SearchCursor(FrequencyTable, "", "", self.params[1].value.value, "{0} A".format(self.params[1].value.value)) #open a search cursor on the frequency table
for row in cursor: #loop through each value
values.add(row.getValue(fieldname)) #add the value to the set
self.params[2].filter.list = sorted(values) #set the filter list equal to the sorted values
newValues = self.params[2].filter.list
try:
if len(oldValues): # if some values are selected
self.params[2].values = [v for v in oldValues if v in newValues] # check if seleted values in new list,
# if yes, retain the seletion.
except Exception:
pass
def updateMessages(self):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
Mungkinkah asumsi saya (melalui pengujian) bahwa validasi adalah bagian kunci adalah salah, dan bahwa hal lain tidak memungkinkan nilai-nilai diekspos sebagai daftar yang dapat dipilih? Banyak terima kasih sebelumnya. Memiliki jenis fungsi ini akan benar-benar melompat memulai adopsi dari beberapa alur kerja utama yang saya coba distribusikan di perusahaan kami!
sumber
arcpy.da.SearchCursor
jauh lebih cepat dan lebih cocok untuk tugas ini daripada yang lebih tuaarcpy.SearchCursor
.Jawaban:
Saya pikir beberapa orang mungkin menganggap ini berharga. ESRI cukup ramah untuk membantu mengatasi hal ini dan menemukan alternatif untuk validasi yang digunakan dalam posting blog yang tidak memerlukan lisensi Tingkat Lanjut. Meskipun saya tentu harus mencari tahu beberapa item tambahan, saya tidak dapat mengambil kredit untuk kode validasi. Tetapi, tujuan membenarkan cara dan ini memenuhi syarat sebagai jawaban untuk pertanyaan saya. Ini dia:
Menggunakan arcpy.da.SearchCursor mengembalikan nilai dari bidang yang dipilih dengan sangat cepat mengingat jumlah catatan pencariannya (setidaknya dalam data saya). Saya dapat memulai utas baru untuk melihat apakah ada yang punya ide tentang cara menerapkan filter ke validasi berdasarkan permintaan. Saya harap ini membantu seseorang, tapi saya senang kami punya jawaban!
sumber
Saya melakukannya dengan cara lain: menggunakan basis data terdiri dari tingkat fivel, tanpa memilih shapefile atau bidang hanya dengan memilih item dari tingkat pertama, skrip validasi menghasilkan nilai untuk tingkat kedua sesuai dengan pilihan Anda di tingkat pertama, dengan skripnya:
sumber
sumber
{ }
tombol untuk memformat kode Anda dengan benar.