Ich versuche, eine Modell- und Skriptkombination anzupassen, die auf der ESRI-Blog-Site mit dem Titel "Generieren einer mehrwertigen Auswahlliste" zu finden ist.
Ich bin jedoch zu dem Schluss gekommen, dass ein Teil der im eingebetteten Skript verwendeten Validierung vom 'Frequenz'-Tool abhängt, um ordnungsgemäß zu funktionieren. Dies ist jedoch nur mit einer erweiterten Lizenz (lahm) verfügbar. Der Blog-Beitrag erklärt den Workflow und wo die Modelle und Skripte heruntergeladen werden können (aber ich werde sie auf Anfrage gerne hier veröffentlichen). Soweit ich das beurteilen kann, ist der Kern der Funktionalität, nach der ich suche, die Erstellung einer mehrwertigen Auswahlliste:
..ist vorausgesetzt, dass das Validierungsskript ordnungsgemäß funktioniert. Ohne die Validierung kann ich die Werte aus dem Feld nicht als Liste anzeigen lassen. Gibt es etwas, das ich aus diesem Validierungsskript entfernen kann, um die gewünschte Funktionalität zu erhalten, oder gibt es eine Problemumgehung? Ich bin mit dem Validierungsprozess nicht vertraut. Hier ist der Code für die Validierung (ich wollte ihn als Codebeispiel veröffentlichen, aber es sieht so aus, als ob es einfacher wäre, ihm zu folgen):
[ Anmerkung des Herausgebers: Hier ist der tatsächliche Validierungscode, das Bild ist nicht korrekt.]
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
Ist es möglich, dass meine Annahme (durch Testen), dass die Validierung das Schlüsselelement ist, falsch ist und dass etwas anderes nicht zulässt, dass die Werte als auswählbare Liste angezeigt werden? Vielen Dank im Voraus. Diese Art von Funktionalität wird die Einführung mehrerer wichtiger Workflows, die ich in unserem Unternehmen zu verteilen versuche, wirklich beschleunigen!
quelle
arcpy.da.SearchCursor
viel schneller und besser für diese Aufgabe geeignet ist als das älterearcpy.SearchCursor
.Antworten:
Ich dachte, einige Leute finden das vielleicht wertvoll. ESRI war so freundlich, dies zu lösen und eine Alternative zu der im Blog-Beitrag verwendeten Validierung zu finden, für die keine erweiterte Lizenz erforderlich ist. Obwohl ich sicherlich einige zusätzliche Elemente herausfinden musste, kann ich den Validierungscode nicht gutschreiben. Aber die Ziele rechtfertigen die Mittel und dies ist die Antwort auf meine Frage. Bitte schön:
Die Verwendung von arcpy.da.SearchCursor gibt sehr schnell Werte aus dem ausgewählten Feld zurück, wenn man die Anzahl der Datensätze berücksichtigt, die durchsucht werden (zumindest in meinen Daten). Ich kann einen neuen Thread starten, um zu sehen, ob jemand Ideen hat, wie ein Filter auf die Validierung basierend auf einer Abfrage angewendet werden kann. Ich hoffe das hilft jemandem, aber ich bin froh, dass wir eine Antwort haben!
quelle
Ich habe es auf eine andere Weise gemacht: Die Verwendung der Datenbank besteht aus fünf Ebenen, ohne das Shapefile oder die Felder auszuwählen, indem nur Elemente aus der ersten Ebene ausgewählt werden. Das Validierungsskript generiert die Werte für die zweite Ebene gemäß Ihrer Auswahl in der ersten Ebene. Ihr Skript:
quelle
quelle
{ }
Schaltfläche, um Ihren Code richtig zu formatieren.