Sıklığı kullanmadan Araç Doğrulama'yı kullanarak ArcGIS'te çok değerli seçim listesi oluşturuluyor mu?


11

ESRI'nin 'Çok değerli bir seçim listesi oluşturma' başlıklı blog sitesinde bulunan bir model ve komut dosyası kombinasyonunu uyarlamaya çalışıyorum .

Ancak, gömülü komut dosyasında kullanılan doğrulamanın bir kısmının düzgün çalışması için 'Frekans' Aracı'na bağlı olduğu sonucuna vardım, ancak bu yalnızca ve Gelişmiş lisans (topal) ile kullanılabilir. Blog gönderisi, iş akışını ve modelleri ve komut dosyalarını nereden indireceğinizi açıklar (ancak istek üzerine bunları memnuniyetle buraya gönderirim). Anlayabildiğim kadarıyla, peşinde olduğum işlevselliğin özü, çok değerli bir seçim listesi oluşturarak:

resim açıklamasını buraya girin

.. Doğrulama betiğinin düzgün çalışmasına dayanıyor. Doğrulama olmadan, alandaki değerleri bir liste olarak görünecek şekilde alamıyorum. Sonradan işlevselliği elde etmek için bu doğrulama komut dosyasından kaldırabileceğim bir şey var mı, yoksa bir geçici çözüm var mı? Doğrulama sürecine aşina değilim. İşte doğrulama için kod (Ben bir kod örneği olarak göndermek için gidiyordu, ama bu takip etmek daha kolay olabilir gibi görünüyor): resim açıklamasını buraya girin

[ Editör notu: İşte gerçek doğrulama kodu, görüntü doğru değil]

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

Doğrulamanın anahtar parça olduğu (test yoluyla) varsayımımın ve değerlerin seçilebilir bir liste olarak gösterilmesine izin vermediği başka bir şey olabilir mi? Şimdiden çok teşekkürler. Bu tür bir işleve sahip olmak gerçekten atlayacaktır Şirketimizde dağıtmaya çalıştığım birkaç anahtar iş akışını benimsemeye başlayın!


1
Hangi ArcGIS sürümünü kullanıyorsunuz? Soruyorum çünkü 10.1'de arcpy.da.SearchCursorbu görev için eskisinden çok daha hızlı ve daha uygun arcpy.SearchCursor.
blah238

1
Bağladığınız araç kutusunun doğrulama kodu, bağladığınız görüntüdeki doğrulama kodundan farklı. Birincisi, Frekans aracını kullandığından gelişmiş bir lisans gerektirir. Daha önceki bir blog gönderisinde ayrıntılı olarak belirtilen sonuncusu, yalnızca SearchCursor gibi standart arcpy işlevlerini kullandığı için olmamalıdır. Sana bir cevabım yok ama ikisini bir araya getirirsen belki çözebilirsin.
blah238

@ blah268 Onun 10.2'si, özlediğim için üzgünüm. Hmm, şimdi bu çok ilginç bir gözlem. Buna bakacağım, ama merak ediyorum: Doğrulamanın değerleri bir seçim listesi olarak ileten şeyin doğru olduğunu anladım mı? çoktan seçmeli olduğum işlevselliktir. Size geri döneceğim ve yanıtınız için çok teşekkürler!
Ocak'ta Clickinaway

1
Komut dosyası aracı parametre özellikleri, parametre listesini ve özelliklerini (MultiValue özelliğini içerir) ayarladığınız yerdir. Komut dosyası aracı doğrulaması, bu aracın çok değerli parametre değerlerini diğer parametre değerlerine (özellik sınıfı ve alan adı) dayalı olarak doldurduğu yerdir. Daha büyük özellik sınıfları için onunla oynamak, bunu üretime sokmazdım. Coğrafi işleme seçeneklerinde "Coğrafi işleme işlemlerinin çıktılarının üzerine yaz" seçeneğini işaretlemediyseniz, çok yavaş ve hata veriyor.
blah238

1
Sohbet edemiyorum ancak önerebileceğim, gereksinimlerinizi, denediklerinizi ve nelerin çalışmadığını ayrıntılandırmak için sorunuzu düzenlemek.
blah238

Yanıtlar:


9

Bazı insanların bunu değerli bulabileceğini düşündüm. ESRI, bunun üstesinden gelmek ve Blog yayında kullanılan ve Gelişmiş lisans gerektirmeyen bir doğrulama bulmak için yeterince zarifti. Kesinlikle bazı ek öğeler bulmak zorunda kaldım, ancak doğrulama kodu için kredi alamıyorum. Ancak, amaçlar araçları haklı çıkarır ve bu sorumun cevabı olarak nitelendirilir. Hadi bakalım:

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 parameter
    has been changed."""
    if self.params[0].value and self.params[1].value:
        self.params[2].filter.list = sorted({row[0] for row in arcpy.da.SearchCursor(self.params[0].value, self.params[1].value.value) if row[0]})

  def updateMessages(self):
    """Modify the messages created by internal validation for each tool
    parameter.  This method is called after internal validation."""
    return

Arcpy.da.SearchCursor kullanmak, seçtiği alandaki değerleri, aradığı kayıtların sayısı göz önüne alındığında (en azından verilerimde) çok hızlı döndürür. Herkes sorguya dayalı doğrulama için bir filtre uygulamak hakkında herhangi bir fikir olup olmadığını görmek için yeni bir iş parçacığı başlayabilir. Umarım bu birisine yardımcı olur, ama cevap verdiğimiz için mutluyum!


1

Bunu başka bir şekilde yaptım: veritabanı kullanarak, ilk düzeydeki öğeleri seçerek şekil dosyası veya alanları seçmeden, fivel düzeylerinden oluşur, doğrulama komut dosyası, birinci düzeydeki seçime göre ikinci düzey için değerleri üretir, komut dosyası:

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):

    fc="C:/LUCS/System_shapes/sys.shp"
##    fc = arcpy.MakeFeatureLayer_management(Lucssys)  
    """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[0].value and self.params[0].value:


    fc="C:/LUCS/System_shapes/sys.shp"  
    col=  ("L1_NAM") 
    self.params[0].filter.list = [str(val) for val in  
                                    sorted(  
                                      set(  
                                        row.getValue(col)  
                                        for row in arcpy.SearchCursor(fc, None, None,col)))]  
    if self.params[0].value not in self.params[0].filter.list:  
      self.params[0].value = self.params[0].filter.list[0]


    if self.params[0].value:

        fc="C:/LUCS/System_shapes/sys.shp"  
        col1=  ("L1_NAM")
        col2=  ("L2_NAM") 
        fields=(col1,col2)
##___________level2___________________________________________________________
    fc="C:/LUCS/System_shapes/sys.shp" 
    col1=  ("L1_NAM")
    col2=  ("L2_NAM") 
    fields=(col1,col2)

    Level0list=[]
    Level0list_uniq=[]
    cursor = arcpy.SearchCursor(fc)
    for row in cursor:
              if (row.getValue(col1)) ==(str(self.params[0].value)):
                      Level0list.append (row.getValue(col2))

    for elem in Level0list:
              if elem not in Level0list_uniq:
                  Level0list_uniq.append(elem)


    if self.params[1].value not in self.params[1].filter.list:  
        self.params[1].filter.list =Level0list_uniq
##________________level3______________________________________________________        
    fc="C:/LUCS/System_shapes/sys.shp" 
    col2=  ("L2_NAM")
    col3=  ("L3_NAM") 
    fields=(col2,col3)
    Level2list=[]
    Level2list_uniq=[]
    cursor = arcpy.SearchCursor(fc)
    for row in cursor:
              if (row.getValue(col2)) ==(str(self.params[1].value)):
                      Level2list.append (row.getValue(col3))
    for elem in Level2list:
              if elem not in Level2list_uniq:
                  Level2list_uniq.append(elem)
    if self.params[2].value not in self.params[2].filter.list:  
        self.params[2].filter.list =Level2list_uniq
##________________level4______________________________________________________        
    fc="C:/LUCS/System_shapes/sys.shp" 
    col3=  ("L3_NAM")
    col4=  ("L4_NAM") 
    fields=(col3,col4)

    Level3list=[]
    Level3list_uniq=[]
    cursor = arcpy.SearchCursor(fc)
    for row in cursor:
              if (row.getValue(col3)) ==(str(self.params[2].value)):
                      Level3list.append (row.getValue(col4))
    for elem in Level3list:
              if elem not in Level3list_uniq:
                  Level3list_uniq.append(elem)
    if self.params[3].value not in self.params[3].filter.list:  
        self.params[3].filter.list =Level3list_uniq
##________________level5______________________________________________________        
    fc="C:/LUCS/System_shapes/sys.shp" 
    col4=  ("L4_NAM")
    col5=  ("L5_NAM") 
    fields=(col4,col5)

    Level4list=[]
    Level4list_uniq=[]
    cursor = arcpy.SearchCursor(fc)
    for row in cursor:
              if (row.getValue(col4)) ==(str(self.params[3].value)):
                      Level4list.append (row.getValue(col5))
    for elem in Level4list:
              if elem not in Level4list_uniq:
                  Level4list_uniq.append(elem)
    if self.params[4].value not in self.params[4].filter.list:  
        self.params[4].filter.list =Level4list_uniq

  def updateMessages(self):  
    """Modify the messages created by internal validation for each tool  
    parameter.  This method is called after internal validation."""  

0
Add new conditions to ensure a single option when the same term exists in more than one category. ِand to force arcpy to deal with arabic fonts

import arcpy
import sys

reload(sys)

sys.setdefaultencoding('utf-8')

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 updateParameters(self):

    fc="C:/LUCS/System_shapes/sys.shp"
    col=  ("L1_NAM")
 ##________________level1_________________

    self.params[0].filter.list = [str(val) for val in  
                                    sorted(  
                                      set(  
                                        row.getValue(col)  
                                        for row in arcpy.SearchCursor(fc, None, None,col)))]  
    if self.params[0].value not in self.params[0].filter.list:  
      self.params[0].value = self.params[0].filter.list[0]



    if self.params[0].value:

        fc="C:/LUCS/System_shapes/sys.shp"  
        col1=  ("L1_NAM")
        col2=  ("L2_NAM")
        col3=  ("L3_NAM") 
        col4=  ("L4_NAM")
        col5=  ("L5_NAM") 
        fields=(col1,col2,col3,col4,col5)
        Level1list=[]
        Level1list_uniq=[]
        Level2list=[]
        Level2list_uniq=[]
        Level3list=[]
        Level3list_uniq=[]
        Level4list=[]
        Level4list_uniq=[]
        Level5list=[]
        Level5list_uniq=[]

        cursor = arcpy.SearchCursor(fc)
        for row in cursor:
                        if (row.getValue(col1)) ==(str(self.params[0].value)):
                                Level1list.append (row.getValue(col2))

        for elem in Level1list:
                        if elem not in Level1list_uniq:
                            Level1list_uniq.append(elem)


        if self.params[1].value not in self.params[1].filter.list:  
              self.params[1].filter.list =Level1list_uniq
      ##________________level3_________________        
        cursor = arcpy.SearchCursor(fc)
        for row in cursor:
                  if (row.getValue(col1)) ==(str(self.params[0].value)):
                    if (row.getValue(col2)) ==(str(self.params[1].value)):
                            Level2list.append (row.getValue(col3))
        for elem in Level2list:
                    if elem not in Level2list_uniq:
                        Level2list_uniq.append(elem)
        if self.params[2].value not in self.params[2].filter.list:  
              self.params[2].filter.list =Level2list_uniq
      ##________________level4_______________       
        cursor = arcpy.SearchCursor(fc)
        for row in cursor:
              if (row.getValue(col1)) ==(str(self.params[0].value)):

                    if (row.getValue(col3)) ==(str(self.params[2].value)):
                            Level3list.append (row.getValue(col4))
        for elem in Level3list:
                    if elem not in Level3list_uniq:
                        Level3list_uniq.append(elem)
        if self.params[3].value not in self.params[3].filter.list:  
              self.params[3].filter.list =Level3list_uniq
      ##________________level5_______________      
        cursor = arcpy.SearchCursor(fc)
        for row in cursor:
            if (row.getValue(col1)) ==(str(self.params[0].value)):
                    if (row.getValue(col4)) ==(str(self.params[3].value)):
                            Level4list.append (row.getValue(col5))
        for elem in Level4list:
                    if elem not in Level4list_uniq:
                        Level4list_uniq.append(elem)
        if self.params[4].value not in self.params[4].filter.list:  
              self.params[4].filter.list =Level4list_uniq

    return

Lütfen kodunuzun tamamını doğru şekilde biçimlendirin.
Marcelo Villa-Piñeros

yapıldı, 10.5.0'da çalışıyor
Younes Idriss

Kodunuzun bir kısmı oluşturulmuştur, ancak gördüğünüz gibi diğer satırlar değildir ( örneğin , kodunuzun içe aktarma ifadeleri). { }Kodunuzu doğru şekilde biçimlendirmek için düğmeyi kullanın .
Marcelo Villa-Piñeros

Ayrıca, bir sınıfın tanımını kaçırdığınız görülüyor.
Marcelo Villa-Piñeros
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.