Mehr

Umgang mit mehrspaltigen Wertetabellen in ArcGIS Python Toolbox?


Ich baue ein relativ einfaches Python-Tool für ArcGIS 10.3, das den Prozess der Generierung von Zusammenfassungsstatistiken für mehrere Raster-Datasets für Polygone in einem Polygon-Dataset mit dem Zonalen Statistikwerkzeug von ESRI automatisiert. Die Schlüsselkomponente des Tools ist eine mehrspaltige Wertetabelle, die es dem Benutzer ermöglicht, Folgendes einzugeben:

  1. ein Raster-Dataset (zur Zusammenfassung)
  2. zusammenfassende Statistik, die berechnet wird (d. h. Mittelwert, Bereich, Max usw.)
  3. Name der Spalte, die dem Polygon-Dataset hinzugefügt wird (das die zusammenfassenden Statistikwerte enthält)

Da ich eine Wertetabelle verwenden muss, habe ich mich entschieden, eine Python-Toolbox als Schnittstelle für mein Python-Skript zu verwenden. Ich habe den Code getestet, der die Geoverarbeitung durchführt, und er funktioniert. Das Problem, das ich jetzt habe, ist, dass die Wertetabelle, wenn sie aus der Toolbox an mein Python-Skript übergeben wird, als gesendet wird Unicode, und mein Skript erkennt diese Variable nicht als Wertetabelle. Ich nehme an, dies liegt daran, dass die Parameter mit diesem Code gesendet werden (der von ESRI empfohlen wird):

Parameter[2].valueAsText

was zu diesem Fehler führt:

Zeile 14, in main param_count = param_tbl.rowCount AttributeError: 'unicode'-Objekt hat kein Attribut 'rowCount'

Ich habe versucht zu ändern, wie der Parameter gesendet wird, d.h.

Parameter[2].Werte

Dies führt jedoch zu:

AttributeError: 'list'-Objekt hat kein Attribut 'rowCount'

Wie genau soll eine Wertetabelle von der Python-Tool-Ausführungsfunktion gesendet werden oder muss ich die Variable aus einer Zeichenfolge wieder in eine Wertetabelle in meinem Geoverarbeitungsskript konvertieren?

Hier ist der relevante Code aus der Python Toolbox (.pyt):

param2 = arcpy.Parameter( displayName="Summary data list", name="stat_list", datatype="GPValueTable", parameterType="Required", direction="Input") param2.columns = [['Raster Dataset',' Raster Dataset'], ['GPString','Statistic Type'], ['GPString', 'Summary Field Name']] param2.filters[1].type = 'ValueList' param2.filters[1].list = [ 'ALL', 'MEAN', 'MAXIMUM', 'MINIMUM', 'RANGE', 'STD', 'SUM'] def execute(self, parameters, Messages): """Der Quellcode des Tools."" " ps.main(parameters[0].valueAsText, Parameter[1].valueAsText, Parameter[2].valueAsText, Parameter[3].valueAsText, Parameter[4].valueAsText) return

und hier ist der relevante Code aus dem Python-Skript, das die statistische Zusammenfassung und Geoverarbeitung durchführt:

arcpy aus arcpy.sa importieren * polystat_util importieren als u arcpy.CheckOutExtension("SPATIAL") arcpy.env.overwriteOutput = True def main(in_fc, in_fc_join_field, param_tbl, out_path, out_fc): arcpy.MakeFeatureLayer_management(in_fc, "in_fc" ) param_count = param_tbl.rowCount # neue Felder zur Polygon-Feature-Class hinzufügen, die zusammengefasste Statistiken enthalten param_names = [] zone_field = "ZONE_INDEX" für i in range(param_count): param_val = param_tbl.getValue(i,2) param_names.append( param_val) arcpy.AddField_management("in_fc_lyr", zone_field, "TEXT") arcpy.CalculateField_management("in_fc_lyr", zone_field, "!" + in_fc_join_field + "!", "Python_9.3") ply_tmp = u.AddStatFields("in ._fc_ly) ", zone_field, param_names) für j in range(param_count): raster_name = param_tbl.getValue(j,0) stat_name = param_tbl.getValue(j,1) field_name = param_tbl.getValue(j,2) ras_lyr = arcpy.MakeRasterLayer_management( raster_name, "ras_lyr") zstat_result = ZonalStatisticsAsTable(ply_tmp, zone_field, ras_lyr, "in_m emoryzstat", "DATA", stat_name) u.JoinCalc(ply_tmp, zone_field, field_name, zstat_result, stat_name) arcpy.FeatureClassToFeatureClass_conversion(ply_tmp, out_path, out_fc) return

Hier ist mein überarbeiteter Codeausschnitt, basierend auf Farids Antwort:

def main(in_fc, in_fc_join_field, param_tbl, out_path, out_fc): # Werte aus der Wertetabelle extrahieren param_rows = param_tbl.split(';') vt_array = [] for r in param_rows: vt_array.append(r.split()) param_count = len(param_rows) für j in range(param_count): raster_name = vt_array[j][0] stat_name = vt_array[j][1] field_name = vt_array[j][2] ras_lyr = arcpy.MakeRasterLayer_management(raster_name, "ras_lyr ") zstat_result = ZonalStatisticsAsTable(ply_tmp, zone_field, ras_lyr, "in_memoryzstat", "DATA", stat_name)

Innerhalb der Methode execute kann auf den Wert jedes Parameters über die Liste zugegriffen werdenWertAsTextMethode. Auf andere Parameter-Objekteigenschaften kann nach Bedarf zugegriffen werden.

Hier ist Ihre Lösung:

def execute(self, parameters, messages): #parameters[0] ist Ihre Wertetabelle vt_text = parameters[0].valueAsText arcpy.AddMessage(vt_text) #für eine zweizeilige Wertetabellenausgabe: #col1 col2 #;col1 col2 col3 wobei # für not set # steht, um die Zeilenanzahl zu erhalten if vt_text !=": arcpy.AddMessage("Row Count: " + str(len(vt_text.split(';')))) else: arcpy.AddMessage(" Zeilenanzahl: 0") zurück


Schau das Video: Python in ArcGIS. Python Toolbox. Новый сезон (Oktober 2021).