การสร้างรายการตัวเลือกหลายค่าใน ArcGIS โดยใช้การตรวจสอบเครื่องมือโดยไม่ใช้ความถี่?


11

ฉันกำลังพยายามปรับรูปแบบและชุดสคริปต์ที่พบในเว็บไซต์บล็อกของ ESRI ชื่อ 'การสร้างรายการตัวเลือกหลายค่า'

อย่างไรก็ตามฉันได้ข้อสรุปว่าส่วนหนึ่งของการตรวจสอบความถูกต้องที่ใช้ในสคริปต์ฝังตัวนั้นอาศัยเครื่องมือ 'ความถี่' เพื่อให้สามารถทำงานได้อย่างถูกต้อง แต่สามารถใช้งานได้เฉพาะกับสิทธิ์การใช้งานขั้นสูง (อ่อนแอ) โพสต์บล็อกอธิบายเวิร์กโฟลว์และสถานที่ในการดาวน์โหลดแบบจำลองและสคริปต์ (แต่ฉันจะโพสต์ไว้ที่นี่ตามคำร้องขอ) เท่าที่ฉันสามารถบอกได้ว่าเป็นหน้าที่หลักของฉันในการสร้างรายการตัวเลือกหลายค่า:

ป้อนคำอธิบายรูปภาพที่นี่

.. เป็นที่สคริปต์การตรวจสอบความถูกต้องทำงานอย่างถูกต้อง หากไม่มีการตรวจสอบความถูกต้องฉันไม่สามารถรับค่าจากฟิลด์ให้ปรากฏเป็นรายการได้ มีสิ่งใดบ้างที่ฉันสามารถลบออกจากสคริปต์ตรวจสอบนี้เพื่อรับฟังก์ชั่นที่ฉันใช้อยู่หรือมีวิธีแก้ไขชั่วคราว ฉันไม่คุ้นเคยกับกระบวนการตรวจสอบ นี่คือรหัสสำหรับการตรวจสอบความถูกต้อง (ฉันกำลังจะโพสต์เป็นตัวอย่างโค้ด แต่ดูเหมือนว่าจะติดตามได้ง่ายกว่า): ป้อนคำอธิบายรูปภาพที่นี่

[ หมายเหตุบรรณาธิการ:นี่คือรหัสการตรวจสอบจริงภาพไม่ถูกต้อง]

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

เป็นไปได้หรือไม่ที่ข้อสันนิษฐานของฉัน (ผ่านการทดสอบ) ที่การตรวจสอบความถูกต้องเป็นชิ้นส่วนที่เป็นเท็จและเป็นอย่างอื่นที่ไม่อนุญาตให้ค่าถูกเปิดเผยเป็นรายการที่เลือกได้? ขอบคุณมากล่วงหน้า การมีฟังก์ชั่นประเภทนี้จะเป็นการเริ่มต้นการใช้เวิร์กโฟลว์สำคัญ ๆ หลายอย่างที่ฉันพยายามกระจายใน บริษัท ของเรา!


1
คุณใช้ ArcGIS รุ่นใดอยู่ ผมถามเพราะที่ 10.1 มากขึ้นเร็วขึ้นและมากขึ้นเหมาะสำหรับงานนี้กว่าเก่าarcpy.da.SearchCursor arcpy.SearchCursor
blah238

1
รหัสตรวจสอบสำหรับกล่องเครื่องมือที่คุณเชื่อมโยงนั้นแตกต่างจากรหัสตรวจสอบในรูปภาพที่คุณเชื่อมโยง อดีตต้องการใบอนุญาตขั้นสูงเนื่องจากใช้เครื่องมือความถี่ หลังมีรายละเอียดในการโพสต์บล็อกก่อนหน้านี้ไม่ควรเพราะมันใช้ฟังก์ชั่น arcpy มาตรฐานเช่น SearchCursor ฉันไม่มีคำตอบให้คุณ แต่ถ้าคุณรวมสองส่วนเข้าด้วยกันบางทีคุณก็สามารถหาคำตอบได้
blah238

@ blah268 มัน 10.2 ขอโทษที่คิดถึงมัน อืมตอนนี้เป็นข้อสังเกตที่น่าสนใจมาก ฉันจะดูสิ่งนั้น แต่ฉันอยากรู้: ฉันเข้าใจถูกต้องหรือไม่ว่าการตรวจสอบความถูกต้องคือสิ่งที่ผ่านค่าเป็นรายการตัวเลือกหรือไม่ แบบปรนัยเป็นฟังก์ชั่นที่ฉันทำอยู่หลังจากนั้น ฉันจะกลับไปหาคุณและขอบคุณมากสำหรับการตอบสนอง!
Clickinaway

1
คุณสมบัติพารามิเตอร์เครื่องมือสคริปต์คือตำแหน่งที่คุณตั้งค่ารายการพารามิเตอร์และคุณสมบัติ (รวมถึงคุณสมบัติ MultiValue) การตรวจสอบเครื่องมือสคริปต์คือตำแหน่งที่เครื่องมือเฉพาะนี้เติมค่าพารามิเตอร์หลายค่าตามค่าพารามิเตอร์อื่น ๆ (คลาสคุณลักษณะและชื่อฟิลด์) เล่นกับมันสำหรับคลาสฟีเจอร์ที่ใหญ่กว่าฉันจะไม่นำเรื่องนี้ไปผลิต ช้าเกินไปและเกิดข้อผิดพลาดหากคุณไม่ได้เลือก "เขียนทับการประมวลผลการประมวลผลทางภูมิศาสตร์" ในตัวเลือกการประมวลผลทางภูมิศาสตร์
blah238

1
ฉันไม่สามารถแชทได้ แต่สิ่งที่ฉันอยากจะแนะนำคือการแก้ไขคำถามของคุณเพื่อให้รายละเอียดความต้องการของคุณสิ่งที่คุณได้ลองและสิ่งที่ไม่ทำงาน
blah238

คำตอบ:


9

ฉันคิดว่าบางคนอาจพบว่ามีค่านี้ ESRI มีน้ำใจมากพอที่จะช่วยแก้ไขปัญหานี้และค้นหาทางเลือกอื่นสำหรับการตรวจสอบความถูกต้องที่ใช้ในการโพสต์บล็อกซึ่งไม่จำเป็นต้องมีใบอนุญาตขั้นสูง ในขณะที่ฉันต้องคิดรายการเพิ่มเติมบางอย่างแน่นอนฉันไม่สามารถรับเครดิตสำหรับรหัสตรวจสอบได้ แต่ท้ายที่สุดจะแสดงให้เห็นถึงวิธีการและสิ่งนี้มีคุณสมบัติเป็นคำตอบสำหรับคำถามของฉัน ไปเลย:

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 ส่งคืนค่าจากฟิลด์ที่เลือกอย่างรวดเร็วโดยพิจารณาจากจำนวนระเบียนที่ค้นหา (อย่างน้อยก็ในข้อมูลของฉัน) ฉันอาจเริ่มหัวข้อใหม่เพื่อดูว่าใครมีแนวคิดในการใช้ตัวกรองกับการตรวจสอบตามแบบสอบถาม ฉันหวังว่านี่จะช่วยให้ใครบางคน แต่ฉันดีใจที่เรามีคำตอบ!


1

ฉันทำมันด้วยวิธีอื่น: การใช้ฐานข้อมูลประกอบด้วยระดับการหมุนโดยไม่ต้องเลือกรูปร่างไฟล์หรือฟิลด์เพียงแค่เลือกรายการจากระดับแรกสคริปต์ตรวจสอบจะสร้างค่าสำหรับระดับที่สองตามระดับที่คุณเลือกในสคริปต์ระดับแรก:

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

โปรดจัดรูปแบบรหัสทั้งหมดให้ถูกต้อง
Marcelo Villa-Piñeros

เสร็จสิ้นแล้วทำงานใน 10.5.0
Younes Idriss

รหัสบางส่วนของคุณได้รับการจัดทำขึ้น แต่คุณสามารถดูบรรทัดอื่น ๆ ได้ ( เช่นคำสั่งนำเข้าของรหัสของคุณ) ใช้{ }ปุ่มเพื่อจัดรูปแบบรหัสของคุณอย่างถูกต้อง
Marcelo Villa-Piñeros

ดูเหมือนว่าคุณไม่มีคำจำกัดความของคลาส
Marcelo Villa-Piñeros
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.