Более

Запрос определения с 3 плюс переменными для цикла с Python и сохранения файлов слоев

Запрос определения с 3 плюс переменными для цикла с Python и сохранения файлов слоев


У меня есть сценарий, который принимает входной класс пространственных объектов и использует поле в этом классе для создания запроса определения для каждого уникального поля. Вопрос о том, как это сделать, указан ниже, сохраняя слои для каждого уникального атрибута.

Мой скрипт работает, когда у меня есть один файл.

Теперь я заинтересован в использовании более одной переменной поля в запросе. В идеале мне нравится использовать три.

Мои поля будут СТРАНА, СПОРТ, МЕДИА

Запрос определения будет примерно таким:

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

Проблема в том, что это определение работает только в некоторых случаях. Не все страны будут заниматься определенным видом спорта и, следовательно, не будут иметь медиа-тип, связанный с этим видом спорта. Кроме того, если в стране есть спорт, он может не иметь этого типа СМИ. Поэтому мне нужен способ не создавать слои, если эти отношения между полями не существуют.

На данный момент приведенный ниже код создаст файлы слоев для всех возможных примеров, многие из которых не существуют. См. Код ниже

import arcpy from arcpy import env # Здесь устанавливается среда, и файл берется из location = r "U:  Stage_Area  GIS  Users  Team_Members  TWATER  DATA_SPORTS.gdb" arcpy.env.workspace = location # класс объектов Source_File = "OVERVIEW" # Поле, которое будет использоваться User_Feild_1 = "COUNTRY" User_Feild_2 = "SPORT" User_Feild_3 = "MEDIA" ## Это часть, где создается отдельный список уникальных значений для каждой группы The_list_User_Feild_1 = [row [0] для строки в arcpy.da.SearchCursor (Source_File, User_Feild_1)] # Все значения перечислены, и их нужно разделить до только уникальных, которые можно использовать в lopp Unique_list_1 = set (The_list_User_Feild_1) print Unique_list_1 The_list_User_Feild_2 = [row [0] для строки в arcpy.da.SearchCursor (Source_File, User_Feild_2)] # Все значения перечислены, и их нужно разделить до только уникальных, которые можно использовать в lopp Unique_list_2 = установить (The_list_User_Feild_2) print Unique_lis t_2 The_list_User_Feild_3 = [row [0] для строки в arcpy.da.SearchCursor (Source_File, User_Feild_3)] # Все значения перечислены в списке, и их нужно сократить до только уникальных, которые можно использовать в lopp Unique_list_3 = set (The_list_User_Feild_3) print Unique_list_3 ## Предложение Where_clause строит запрос определения в последнем цикле для значения в Unique_list_2: для Second_Value в Unique_list_1: для thrid_value в The_list_User_Feild_3: # Это имя слоя, который временно_layerVal = name_of + '_' + str (значение) + '_' + str (thrid_value) out_layer = name_of_layer #MakeFeatureLayer переменные in_features = Source_File where_clause = '"' + User_Feild_1 + '"' + "=" + "'" + Second_Value + " '"+" AND "+'" '+ User_Feild_2 +' "'+" = "+"' "+ value +" '"+" AND "+'" '+ User_Feild_3 +' "'+" = "+" '"+ thrid_value +"' "print ' n', where_clause arcpy.env.workspace = r" U:  Stage_Area  GIS  Users  Team_Members  TWATER  DATA_SPORTS.gdb "try: # Выполнить MakeFeatureLayer arcpy.MakeFeatureLayer_management (in_features, name_of_layer, where_clause) # Execute SaveToLayerFile ## это место, где мне нравится сохранять файлы arcpy.env.workspace = r "U:  Stage_Area  GIS  Users  TWATER  Team_Members DATA_SPORTS "arcpy.SaveToLayerFile_management (name_of_layer, out_layer," ABSOLUTE ") за исключением: print arcpy.GetMessages ()

Мне было интересно, у некоторых есть подходы, идеи работы с этими переменными. Я нашел здесь похожий пост.

У этого есть определение, но, похоже, оно зависит от используемого инструмента. Также я изо всех сил пытался понять концепцию

аналогичный вопрос


Я бы добавилеслизаявление иGetCount_managementперед твоимSaveToLayerFile_mangement. Если векторный слой не имеет записей, вы можете пропустить итерацию.

Может быть:

если int (arcpy.GetCount_mangement (name_of_layer) .getOutput (0)) == 0: продолжить

Я смог найти решение. В моем исходном коде было три отдельных списка, созданных с помощью курсора поиска. Каждый из этих списков состоит из уникальных значений в полях. Но на самом деле меня интересует уникальное значение трех объединенных полей.

Поэтому вместо того, чтобы делать три отдельных курсора поиска

Я сделал одно, но извлек три поля, которые меня интересовали. Затем я добавил эти значения курсора в список. Сделал уникальный набор для этого списка.

Когда-то у меня был уникальный список. Я мог бы перебрать это, а затем вызвать отдельные поля для использования в моем имени слоя и предложении Where_clause.

fc = r "U:  Stage_Area  GIS  Users  Team_Members  TWATER  DATA_SPORTS.gdb  data" fields = [User_Feild_1, User_Feild_2, User_Feild_3] List_of_all_values ​​= [] с arcpy.da.SearchCursor (fc, fields) в качестве курсора: для строки в курсоре: #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) # Получение списка элементов в Uniquelist: name_of_layer = str (items [0]) + '_' + str (items [1]) + '_' + str (items [2]) out_layer = name_of_layer #MakeFeatureLayer variables in_features = Source_File where_clause = '"' + User_Feild_1 + '"' + "=" + "'" + (items [0]) + "'" + "AND" +' "'+ User_Feild_2 +'" '+ "=" + "'" + (items [1]) + "'" + "AND" +' "'+ User_Feild_3 + '"' +" = "+" '"+ (элементы [2]) +"' "