Mehr

Definitionsabfrage mit 3 plus Variablen zum Schleifen mit Python und Speichern von Layer-Dateien


Ich habe ein Skript, das eine Eingabe-Feature-Class verwendet und ein Feld innerhalb dieser Klasse verwendet, um eine Definitionsabfrage für jedes eindeutige Feld zu erstellen. Eine Frage, wie dies zu tun ist, ist unten aufgeführt, um Ebenen für jedes einzelne Attribut zu speichern

Mein Skript funktioniert, wenn ich eine Datei habe.

Ich bin jetzt daran interessiert, mehr als eine Feldvariable in der Abfrage zu verwenden. Am liebsten verwende ich drei.

Meine Felder sind COUNTRY , SPORT , MEDIA

Die Definitionsabfrage wäre so etwas wie

"Country"= 'a_country' AND "Sport"= 'a_sport' AND "MEDIA"= 'a_Media_type'

Das Problem ist nun, dass diese Definition nur in einigen Fällen funktioniert. Nicht alle Länder werden eine bestimmte Sportart ausüben und haben daher keinen Medientyp, der mit dieser Sportart verbunden ist. Auch wenn ein Land einen Sport hat, hat es diesen Medientyp möglicherweise nicht. Ich brauche also eine Möglichkeit, keine Ebenen zu erstellen, wenn diese Beziehungen zwischen den Feldern nicht existieren.

Im Moment erstellt der folgende Code Layer-Dateien für alle möglichen Beispiele, von denen viele nicht existieren. Siehe Code unten

import arcpy from arcpy import env # Hier wird die Umgebung eingestellt und die Datei wird von location = r"U:Stage_AreaGISUsersTeam_MembersTWATERDATA_SPORTS.gdb" arcpy.env.workspace abgeholt = Standort # die Feature-Class Source_File = "OVERVIEW" # Zu verwendendes Feld User_Feild_1 = "COUNTRY" User_Feild_2 = "SPORT" User_Feild_3 = "MEDIA" ## Dies ist der Teil, in dem eine separate Liste mit eindeutigen Werten für jeden Bereich erstellt wird The_list_User_Feild_1 = [row[0] for row in arcpy.da.SearchCursor (Source_File,User_Feild_1)] # Alle Werte werden aufgelistet und sie müssen nur auf eindeutige reduziert werden, die innerhalb des lopp verwendet werden können Unique_list_1 = set (The_list_User_Feild_1) print Unique_list_1 The_list_User_Feild_2 = [row[0] for row in arcpy.da.SearchCursor(Source_File,User_Feild_2)] # Alle Werte werden aufgelistet und müssen auf nur eindeutige reduziert werden, die innerhalb verwendet werden können the lopp Unique_list_2 = set(The_list_User_Feild_2) print Unique_lis t_2 The_list_User_Feild_3 = [row[0] for row in arcpy.da.SearchCursor(Source_File,User_Feild_3)] # Alle Werte werden aufgelistet und sie müssen nur auf eindeutige reduziert werden, die innerhalb des lopp verwendet werden können Unique_list_3 = set(The_list_User_Feild_3) print Unique_list_3 ## Die Where_clause erstellt die Definitionsabfrage in der letzten Schleife for value in Unique_list_2: for Second_Value in Unique_list_1: for thrid_value in The_list_User_Feild_3: #Dies ist der Name des Layers der temporär erstellt wird name_Second_Value str +'_'+ str(value) + '_'+ str(thrid_value) out_layer = name_of_layer #MakeFeatureLayer-Variablen in_features = Source_File where_clause = '"' + User_Feild_1 + '"' + " = " + "'" + Second_Value + " '" + " AND " + '"' + User_Feild_2 + '"' + " = " + "'" + Wert + "'" + " AND " + '"' + User_Feild_3 + '"' + " = " + " '" + thrid_value + "'" print '
',where_clause arcpy.env.workspace = r"U:Stage_AreaGISUsersTeam_MembersTWATERDATA_SPORTS.gdb" try: # Ausführen MakeFeatureLayer arcpy.MakeFeatureLayer_management(in_features, name_of_layer, where_clause) # Execute SaveToLayerFile ## Dies ist der Ort, an dem die Dateien gespeichert werden sollen arcpy.env.workspace = r"U:Stage_AreaGISUsersTeam_MembersTWATER DATA_SPORTS" arcpy.SaveToLayerFile_management(name_of_layer, out_layer, "ABSOLUTE") außer: print arcpy.GetMessages()

Ich wunderte mich, dass einige Ansätze und Ideen hatten, mit diesen Variablen zu arbeiten. Einen ähnlichen Beitrag habe ich hier gefunden.

Dies hat eine Definition, aber sie scheint spezifisch für das verwendete Tool zu sein. Außerdem hatte ich Mühe, das Konzept zu verstehen

ähnliche Frage


Ich würde eine hinzufügenwennAussage und aGetCount_managementvor deinemSaveToLayerFile_mangement. Wenn der Feature-Layer keine Datensätze enthält, können Sie die Iteration überspringen.

Kann sein:

if int(arcpy.GetCount_mangement (name_of_layer).getOutput (0)) == 0: weiter

Lösung konnte ich finden. In meinem Originalcode hatte ich drei separate Listen, die aus einem Suchcursor erstellt wurden. Jede dieser Listen bestand aus eindeutigen Werten innerhalb der Felder. Aber was mich wirklich interessiert, ist der einzigartige Wert von drei Feldern kombiniert

Anstatt also drei separate Suchcursor zu verwenden

Ich habe eine gemacht, aber die drei Felder extrahiert, die mich interessierten. Ich habe dann diese Cursorwerte an eine Liste angehängt. Habe ein einzigartiges Set für diese Liste gemacht.

Einmal hatte ich die einzigartige Liste. Ich könnte darüber iterieren und dann die separaten Felder zur Verwendung in meinem Layer-Namen und Where_clause aufrufen

fc = r"U:Stage_AreaGISUsersTeam_MembersTWATERDATA_SPORTS.gdbdata" fields = [User_Feild_1, User_Feild_2 ,User_Feild_3] List_of_all_values ​​=[] with arcpy.da.SearchCursor(fc, fields) als Cursor: für Zeile im Cursor: #print("{0}, {1}".format(row[0], row[1])) curse = str(row[0]), str(row[1]), str (row[2]) #print curse List_of_all_values.append(curse) del curse #print List_of_all_values ​​Uniquelist = set(List_of_all_values) # Abrufen der Liste für Elemente in Uniquelist: name_of_layer = str(items[0])+ '_' + str(items[1])+ '_' + str(items[2]) out_layer = name_of_layer #MakeFeatureLayer-Variablen in_features = Source_File where_clause = '"' + User_Feild_1 + '"' + " = " + "'" + (items [0]) + "'" + " AND " + '"' + User_Feild_2 + '"' + " = " + "'" + (items[1]) + "'" + " AND " + '"' + User_Feild_3 + '"' + " = " + "'" + (items[2]) + "'"


Schau das Video: Python Tutorial deutsch 1624 - Die for Schleife (Oktober 2021).