ফ্রিকোয়েন্সি ব্যবহার না করে সরঞ্জাম বৈধকরণ ব্যবহার করে আর্কজিআইএসে মাল্টিভ্যালু পছন্দ তালিকা তৈরি করা হচ্ছে?


11

আমি ইএসআরআইয়ের ব্লগ সাইটে 'একটি মাল্টিভালু পছন্দ তালিকা তৈরি করা' শিরোনামে পাওয়া একটি মডেল এবং স্ক্রিপ্ট সংমিশ্রণটি খাপ খাইবার চেষ্টা করছি

যাইহোক, আমি এই সিদ্ধান্তে পৌঁছেছি যে এম্বেড স্ক্রিপ্টটিতে ব্যবহৃত বৈধতার অংশটি সঠিকভাবে কাজ করার জন্য 'ফ্রিকোয়েন্সি' সরঞ্জামের উপর নির্ভরশীল, তবে এটি কেবলমাত্র এবং অ্যাডভান্সড লাইসেন্স (পঙ্গু) দিয়ে উপলভ্য। ব্লগ পোস্টটি ওয়ার্কফ্লো এবং কোথায় মডেলগুলি এবং স্ক্রিপ্টগুলি ডাউনলোড করবেন তা ব্যাখ্যা করেছে (তবে আমি অনুরোধের পরে সেগুলি এখানে আনন্দের সাথে পোস্ট করব)। আমি যতদূর বলতে পারি, কার্যকারিতার মূল কারণটি আমি করছি, একটি মাল্টিভালু পছন্দ তালিকা তৈরি করা:

এখানে চিত্র বর্ণনা লিখুন

..এটি বৈধতা স্ক্রিপ্টটি সঠিকভাবে কাজ করার বিষয়ে পূর্বাভাস দিয়েছে। বৈধতা ছাড়াই, আমি ক্ষেত্র থেকে মান হিসাবে একটি তালিকা হিসাবে উপস্থিত হতে অক্ষম। আমি যা যা করছি তার পরে কার্যকারিতাটি পাওয়ার জন্য এই বৈধতা স্ক্রিপ্টটি থেকে সরিয়ে দেওয়ার মতো কিছু আছে কি না কোনও কার্যকারিতা আছে? আমি বৈধতা প্রক্রিয়া সম্পর্কে অপরিচিত। বৈধতার জন্য কোডটি এখানে রয়েছে (আমি একটি কোড নমুনা হিসাবে পোস্ট করতে যাচ্ছিলাম তবে এটি অনুসরণ করা আরও সহজ হতে পারে বলে মনে হচ্ছে): এখানে চিত্র বর্ণনা লিখুন

[ সম্পাদক দ্রষ্টব্য: এখানে আসল বৈধতা কোডটি রয়েছে, চিত্রটি সঠিক নয়]

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
আপনি আরকিজিআইএস এর কোন সংস্করণ ব্যবহার করছেন? আমি জিজ্ঞাসা করছি কারণ 10.1 এ arcpy.da.SearchCursorএই কাজের জন্য পুরানোের চেয়ে অনেক বেশি দ্রুত এবং উপযুক্ত arcpy.SearchCursor
blah238

1
আপনি লিঙ্ক করেছেন সেই টুলবক্সের বৈধতা কোডটি আপনি লিঙ্ক করেছেন এমন চিত্রের বৈধতা কোডের চেয়ে আলাদা। প্রাক্তনটির জন্য একটি উন্নত লাইসেন্স প্রয়োজন কারণ এটি ফ্রিকোয়েন্সি সরঞ্জামটি ব্যবহার করে। পূর্ববর্তী ব্লগ পোস্টে সবিস্তারে বিস্তারিত বর্ণিত হওয়া উচিত নয় কারণ এটি সন্ধানকার্সারের মতো স্ট্যান্ডার্ড আরকি ফাংশন ব্যবহার করে। আমার কাছে আপনার কাছে কোনও উত্তর নেই তবে আপনি যদি দুজনকে একসাথে টুকরো টুকরো করেন তবে আপনি এটি নির্ধারণ করতে পারেন।
blah238

@ blah268 এটি 10.2, এটি মিস করার জন্য দুঃখিত হুম, এখন এটি একটি খুব আকর্ষণীয় পর্যবেক্ষণ। আমি এটি দেখব, তবে আমি কৌতূহলী: আমি কি সঠিকভাবে বুঝতে পারি যে বৈধতা যা পছন্দ তালিকার হিসাবে মানগুলি পাস করে? মাল্টি-চয়েসটি কার্যকারিতা হ'ল আমি। আমি আপনার কাছে ফিরে আসব, এবং প্রতিক্রিয়া জন্য অনেক ধন্যবাদ!
ক্লিকিনাওয়ে

1
স্ক্রিপ্ট সরঞ্জামের প্যারামিটার বৈশিষ্ট্যগুলি যেখানে আপনি প্যারামিটারগুলি এবং তাদের বৈশিষ্ট্যগুলির তালিকা স্থাপন করেন (এতে একটি মাল্টিভ্যালু সম্পত্তি রয়েছে)। স্ক্রিপ্ট সরঞ্জাম যাচাইকরণ যেখানে এই নির্দিষ্ট সরঞ্জামটি অন্যান্য প্যারামিটার মানের (বৈশিষ্ট্য শ্রেণি এবং ক্ষেত্রের নাম) এর উপর ভিত্তি করে মাল্টিভ্যালু প্যারামিটার মানকে পপুলেট করে। বড় বৈশিষ্ট্যযুক্ত ক্লাসগুলির সাথে এটির সাথে চারপাশে খেলে আমি এটিকে উত্পাদনে রাখি না। জিওপ্রসেসিং বিকল্পগুলিতে চেক করা আপনার "জিওপ্রসেসিং ক্রিয়াকলাপগুলির আউটপুটগুলি ওভাররাইট করুন" না থাকলে খুব ধীর এবং ত্রুটিগুলিও আউট হয়।
blah238

1
আমি চ্যাট করতে পারছি না তবে আমি যা পরামর্শ করব তা হ'ল আপনার প্রশ্নগুলি আপনার প্রয়োজনীয়তার বিবরণে সম্পাদনা করা, আপনি কী চেষ্টা করেছেন এবং কী কাজ করছে না।
blah238

উত্তর:


9

আমি ভেবেছিলাম কিছু লোককে এটি মূল্যবান মনে হতে পারে। ইএসআরআই এর মাধ্যমে কাজ করতে সহায়তা করার জন্য এবং ব্লগ পোস্টে ব্যবহৃত বৈধতার বিকল্প খুঁজে পেতে উন্নত লাইসেন্সের প্রয়োজন নেই বলে যথেষ্ট পরিমাণে অনুগ্রহশীল ছিল। আমাকে অবশ্যই কিছু অতিরিক্ত আইটেম বের করতে হয়েছিল, তবে আমি বৈধকরণ কোডটির জন্য ক্রেডিট নিতে পারি না। তবে, শেষগুলি উপায়গুলি ন্যায্য করে এবং এটি আমার প্রশ্নের উত্তর হিসাবে যোগ্যতা অর্জন করে। আপনি এখানে যান:

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

আরকিপি.ডি.এ ব্যবহার করে সার্চকার্সার তার অনুসন্ধানের রেকর্ডের সংখ্যার (কমপক্ষে আমার ডেটাতে) বিবেচনা করে খুব দ্রুত নির্বাচিত ক্ষেত্র থেকে মানগুলি ফিরিয়ে দেয়। কোয়েরির ভিত্তিতে বৈধতার জন্য কীভাবে ফিল্টার প্রয়োগ করতে হবে সে সম্পর্কে কারও কোনও ধারণা আছে কিনা তা দেখতে আমি একটি নতুন থ্রেড শুরু করতে পারি। আমি আশা করি এটি কাউকে সহায়তা করে তবে আমি উত্তর পেয়ে আনন্দিত!


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

আপনার পুরো কোডটি সঠিকভাবে ফর্ম্যাট করুন।
মার্সেলো ভিলা-পাইনারস

এটি সম্পন্ন হয়েছিল, 10.5.0 এ এটির কাজ
ইউনেস ইদ্রিস

আপনার কোডের কিছু অংশ গঠন করা হয়েছে তবে আপনি দেখতে পাচ্ছেন যে অন্যান্য লাইনগুলি নয় ( যেমন আপনার কোডের আমদানির বিবৃতি)। { }আপনার কোডটি সঠিকভাবে ফর্ম্যাট করতে বোতামটি ব্যবহার করুন ।
মার্সেলো ভিলা-পাইরেস

দেখে মনে হচ্ছে আপনি কোনও শ্রেণির সংজ্ঞা হারিয়ে ফেলছেন।
মার্সেলো ভিলা-পাইরেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.