Tạo danh sách lựa chọn đa giá trị trong ArcGIS bằng Xác thực công cụ mà không sử dụng Tần suất?


11

Tôi đang cố gắng điều chỉnh kết hợp mô hình và tập lệnh được tìm thấy trên trang blog của ESRI có tiêu đề 'Tạo danh sách lựa chọn đa giá trị'.

Tuy nhiên, tôi đã kết luận rằng một phần xác thực được sử dụng trong tập lệnh nhúng phụ thuộc vào Công cụ 'Tần số' để hoạt động chính xác, nhưng điều này chỉ khả dụng với Giấy phép nâng cao (khập khiễng). Bài đăng trên blog giải thích quy trình làm việc và nơi để tải xuống các mô hình và tập lệnh (nhưng tôi sẽ vui vẻ đăng chúng lên đây theo yêu cầu). Theo như tôi có thể nói, cốt lõi của chức năng mà tôi đang theo đuổi, tạo ra một danh sách lựa chọn đa giá trị:

nhập mô tả hình ảnh ở đây

.. được xác nhận dựa trên kịch bản xác nhận hoạt động đúng. Nếu không có xác thực, tôi không thể lấy các giá trị từ trường để xuất hiện dưới dạng danh sách. Có bất cứ điều gì tôi có thể loại bỏ khỏi tập lệnh xác thực này để có được chức năng mà tôi đang theo dõi, hoặc có một cách giải quyết không? Tôi không quen với quy trình xác nhận. Đây là mã để xác thực (Tôi sẽ đăng dưới dạng Mẫu mã, nhưng điều này có vẻ như có thể dễ theo dõi hơn): nhập mô tả hình ảnh ở đây

[ Ghi chú của biên tập viên: đây là mã xác thực thực tế, hình ảnh không chính xác]

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

Có thể giả định của tôi (thông qua thử nghiệm) rằng xác thực là phần chính là sai và điều gì đó khác không cho phép các giá trị được hiển thị dưới dạng danh sách có thể chọn? Rất cám ơn trước. Có loại chức năng này sẽ thực sự bắt đầu áp dụng một số quy trình công việc chính mà tôi đang cố gắng phân phối trong công ty của chúng tôi!


1
Phiên bản nào của ArcGIS bạn đang sử dụng? Tôi yêu cầu bởi vì tại 10.1, arcpy.da.SearchCursornhanh hơn và phù hợp hơn cho nhiệm vụ này so với cũ arcpy.SearchCursor.
blah238

1
Mã xác nhận cho hộp công cụ bạn liên kết khác với mã xác thực trong hình ảnh bạn đã liên kết. Cái trước đòi hỏi phải có giấy phép nâng cao vì nó sử dụng công cụ Tần số. Cái sau, chi tiết trong một bài đăng trên blog trước đó, không nên bởi vì nó chỉ sử dụng các hàm tiêu chuẩn như SearchCoder. Tôi không có câu trả lời cho bạn nhưng nếu bạn ghép cả hai lại với nhau có lẽ bạn có thể tìm ra nó.
blah238

@ blah268 Nó là 10.2, xin lỗi vì đã bỏ lỡ điều đó. Hmm, bây giờ đó là một quan sát rất thú vị. Tôi sẽ xem xét điều đó, nhưng tôi tò mò: tôi có hiểu chính xác rằng xác nhận là những gì vượt qua các giá trị như một danh sách lựa chọn không? đa lựa chọn là chức năng tôi đang theo đuổi. Tôi sẽ lấy lại cho bạn, và cảm ơn rất nhiều vì đã phản hồi!
Clickinaway

1
Các thuộc tính tham số của công cụ tập lệnh là nơi bạn thiết lập danh sách các tham số và thuộc tính của chúng (bao gồm thuộc tính MultiValue). Xác thực công cụ tập lệnh là nơi công cụ cụ thể này tập hợp các giá trị tham số đa giá trị dựa trên các giá trị tham số khác (lớp tính năng và tên trường). Chơi xung quanh nó cho các lớp tính năng lớn hơn, tôi sẽ không đưa nó vào sản xuất. Quá chậm và cũng có lỗi nếu bạn không "Ghi đè đầu ra của các hoạt động xử lý địa lý" được chọn trong các tùy chọn Công cụ địa lý.
blah238

1
Tôi không thể trò chuyện nhưng những gì tôi muốn đề xuất là chỉnh sửa câu hỏi của bạn để chi tiết các yêu cầu của bạn, những gì bạn đã thử và những gì không hoạt động.
blah238

Câu trả lời:


9

Tôi nghĩ rằng một số người có thể tìm thấy giá trị này. ESRI đã đủ duyên dáng để giúp giải quyết vấn đề này và tìm một giải pháp thay thế cho việc xác thực được sử dụng trong bài đăng trên blog không yêu cầu giấy phép Nâng cao. Mặc dù tôi chắc chắn phải tìm ra một số mặt hàng bổ sung, tôi không thể lấy tín dụng cho mã xác nhận. Nhưng, kết thúc biện minh cho phương tiện và điều này đủ điều kiện là câu trả lời cho câu hỏi của tôi. Ở đây bạn đi:

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

Sử dụng arcpy.da.SearchCthon trả về các giá trị từ trường đã chọn rất nhanh khi xem xét số lượng bản ghi tìm kiếm của nó (ít nhất là trong dữ liệu của tôi). Tôi có thể bắt đầu một chủ đề mới để xem có ai có bất kỳ ý tưởng nào về cách áp dụng bộ lọc cho xác thực dựa trên truy vấn không. Tôi hy vọng điều này sẽ giúp được ai đó, nhưng tôi rất vui vì chúng tôi có câu trả lời!


1

Tôi đã làm điều đó theo một cách khác: sử dụng cơ sở dữ liệu bao gồm các mức xoay, mà không chọn shapefile hoặc các trường chỉ bằng cách chọn các mục từ cấp đầu tiên, tập lệnh xác thực tạo các giá trị cho cấp thứ hai theo lựa chọn của bạn ở cấp thứ nhất, theo kịch bản:

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

Vui lòng định dạng cho bạn toàn bộ mã đúng.
Biệt thự Marcelo

nó đã được thực hiện, nó hoạt động vào 10.5.0
Younes Idriss

Một phần mã của bạn được hình thành, nhưng như bạn có thể thấy các dòng khác thì không ( ví dụ: các câu lệnh nhập mã của bạn). Sử dụng { }nút để định dạng đúng mã của bạn.
Biệt thự Marcelo

cảm ơn vì lời khuyên
Younes Idriss

Có vẻ như bạn đang thiếu định nghĩa của một lớp.
Biệt thự Marcelo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.