Більше

Проблеми з вкладеними циклами - як почати з 0?


Я маю :

  • 12 рядків класів функцій (lineFC)
  • Клас багатокутників (сітка)
  • Ще один клас об’єктів багатокутників із набагато більшими багатокутниками (gridDivision)

Процес:

  • Виберіть один зі рядків FC зі списку
  • Виберіть один gridDivision
  • Виділіть усі полігони в сітці всередині gridDivision
  • Виділіть рядки всередині gridDivision
  • Зробіть просторове з’єднання між лініями та сіткою

Це робиться для всіх gridDivision. Існує цикл з SearchCursor, який шукає oid. Результат - 5 просторових об'єднань FC

Після цього всі 5 просторових об’єднань об’єднуються і перетворюються в растр.

Проблема:

Це чудово працює для класу функцій першого рядка зі списку. Другий раз цикл запускає oid не починається з 0, але він залишається на останньому значенні. Тож я не отримую 5 просторових об’єднань, а лише одне.

ЧОМУ?

Я спробував cursor.reset (), але це не спрацювало.

Я пробував із різними відступами петель, але це теж не спрацьовувало.

# Імпорт імпорту arcpy час імпорту re re # Встановити таймер з дати і часу імпорту дати і часу startTime = datetime.now () # Встановити середовище arcpy.env.workspace = r "E:  DensityMaps  DensityMapsTest.gdb" arcpy.env.overwriteOutput = True # Встановіть локальні змінні та зробіть шари gridDivision = arcpy.MakeFeatureLayer_management ("GridDivisionTEST", "GridDivisionTEST_lyr") grid = arcpy.MakeFeatureLayer_management (r "E:  DensityMaps  DensityMaps1Km_ridse_MatCut_BB_Grab_Cut_BB_Class_MB_Class_BG_BG_BG_BG_BG_BG_BG Складіть список усіх рядків linesList = arcpy.ListFeatureClasses ("* Lines_Project") #print linesList # Пройдіть усі класи функцій рядків для lineFC у linesList: print "ЦЕ ФАЙЛ РЯДКУ:" + lineFC з arcpy.da.SearchCursor (gridDivision , ["OID @"]) як курсор: для oid в курсорі: print (oid [0]) #print "ЦЕ ІМЕННЕ" + str (oid [0]) # Підготуйтеся до запиту, щоб вибрати один великий квадрат з GridDivision за раз descObj = arcpy.Describe (gridDivision) field = desc Obj.OIDFieldName df = arcpy.AddFieldDelimiters (gridDivision, field) query = df + "=" + str (oid [0]) #print query # Виберіть квадрати gridDivision, починаючи з 1 arcpy.SelectLayerByAttribute_management (gridDievision, SELECT, GridDivision, "gridDivision," ) print "GridDivision number" + str (oid [0]) + "selected:" + str (datetime.now () - startTime) # Виберіть сітку всередині gridDivision arcpy.SelectLayerByLocation_management (grid, "WITHIN", gridDivision) print "Grid вибрано: "+ str (datetime.now () - startTime) # Зробити шар виділення. (Це для утримання виділення) arcpy.MakeFeatureLayer_management (grid, "grid_lyr") # Виділіть рядки всередині gridDivision і додайте їх до попереднього виділеного друку "Вибір" + lineFC + "всередині GridDivision" + str (oid) + "..." arcpy .SelectLayerByLocation_management ("grid_lyr", matchOption, lineFC, "", "ADD_TO_SELECTION") print lineFC + "selected:" + str (datetime.now () - startTime) # Make Spatial Join print "Making SpatialJoin between" + lineFC + "and grid всередині GridDivision "+ str (oid) +" ... "arcpy.SpatialJoin_analysis (grid, lineFC, lineFC +" _ SpatialJoin _ "+ str (oid [0])," JOIN_ONE_TO_MANY "," "," ", matchOption) print" Spatial Join of поділ сітки "+ str (oid) +" та "+ lineFC +" виконано: "+ str (datetime.now () - startTime) +"  n "# Виділити фрагменти просторового об'єднання fileList = arcpy.ListFeatureClasses (lineFC +" _ SpatialJoin * ") # Шукайте назву місяця в рядках рядок month = re.search ('scope_ais _ (. +?) _ Lines_Project', lineFC) .group (1) #print month # Merge them print" Merging the spatial spains of "+ місяць + "…" ар cpy.Merge_management (fileList, month + "_ Merged") print month + "merged:" + str (datetime.now () - startTime) + " n" # Видалити класи просторових об'єднань, щоб заощадити місце на диску для deleteSpatialJoinFC у fileList: arcpy .Delete_management (deleteSpatialJoinFC) print "Deleted Spatial Joins to save space on disk" # Dissolve it print "Dissolving" + month + "…" arcpy.Dissolve_management (month + "_ Merged", month + "_ Dissolve", "TARGET_FID", [["Join_Count, [ "," SUM "]])) print" Dissolved: "+ str (datetime.now () - startTime) +"  n "# Видалити об'єднані класи функцій, щоб заощадити місце на диску arcpy.Delete_management (місяць +" _ Об'єднано ") print" Видалено об’єднаний клас об’єктів для економії місця на диску "+"  n "# Зробити друк растром" Виготовлення "+ місяць +" растр ... "arcpy.FeatureToRaster_conversion (місяць +" _ Розчинення "," SUM_Join_Count ", місяць +" _ 2014_Raster ") друк" RASTER " + місяць + "ГОТОВО !!:" + str (datetime.now () - час початку) + " n" # Друк часу закінчення друку "Готово" + str (datetime.now () - час початку)

Ці надруковані повідомлення також можуть допомогти зрозуміти проблему. Ви можете бачити це після повідомлення:

RASTER квітень ГОТОВИЙ !!: 0: 00: 24.593000

новий файл scope_ais_august_Lines_Project починається, але OID дорівнює 7, а не 0

ЦЕ ЛІНІЙНИЙ ФАЙЛ: scope_ais_april_Lines_Project 1 GridDivision № 1 вибрано: 0: 00: 01.656000 Вибрано сітку: 0: 00: 01.687000 Вибір scope_ais_april_Lines_Project всередині GridDivision (1,)… scope_ais_april_Lines_Pro 01_april_Lids_Prid 01Pain_Grid_Prіd_Pair_Dav_Raid_Pro (1,) ... Просторове приєднання поділу сітки (1,) та scope_ais_april_Lines_Project виконано: 0: 00: 05.265000 2 GridDivision № 2 вибрано: 0: 00: 05.297000 Вибрано сітку: 0: 00: 05.312000 Вибір обсягу_ais_april_Lines_Project всередині GridDivision (2), … Scope_ais_april_Lines_Project вибрано: 0: 00: 05.469000 Створення SpatialJoint між сіткою scope_ais_april_Lines_Projectand всередині GridDivision (2,)… Просторове приєднання поділу сітки (2,) та scope_ais_april_Lines_Project: 0: 08: 0: 00: 08: 0: 00: 08: 0: 00: 08: 0: 00: 0: 00 Вибрано сітку: 0: 00: 08.937000 Вибір обсягу_ais_april_Lines_Project всередині GridDivision (5,) ... Вибрано область_ais_april_Lines_Project: 0: 00: 09.094000 Створення SpatialJoint між сіткою scope_ais_april_Lines_Projectand всередині GridDivision (5,) ... Просторове приєднання поділу сітки (5,) та scope_ais_april_Lines_Project виконано: 0: 00: 12.511000 6 Вибрано номер GridDivision 6 0: 0: 00: 12: 00: G: : 12.558000 Вибір scope_ais_april_Lines_Project всередині GridDivision (6) ... scope_ais_april_Lines_Project вибрано: 0: 00: 12.714000 Виготовлення SpatialJoin між scope_ais_april_Lines_Projectand сіткою всередині GridDivision (6) ... Просторове Реєстрація поділки сітки (6) і scope_ais_april_Lines_Project зроблено: 0: 00: 16.136000 7 Вибрано номер 7 GridDivision: 0: 00: 16,168000 Вибрано сітку: 0: 00: 16,183000 Вибрано obseg_ais_april_Lines_Project всередині GridDivision (7,)… Вибрано scope_ais_april_Lines_Project: 0: 00: 16,355000 Виготовлено SpatialJoin з G_Dais_Pail_Raid_Pair розподіл сітки (7,) та scope_ais_april_Lines_Project виконано: 0: 00: 19.777000 Об’єднання просторових об’єднань квітня… злиття квітня d: 0: 00: 21.365000 Видалено просторові об’єднання для економії місця на диску Розчинення квітня… Розчинено: 0: 00: 23.249000 Видалено об’єднаний клас об’єктів для економії місця на диску Створення квітневого растру… RASTER квітень ГОТОВИЙ !!: 0: 00: 24.593000 ЦЕ ЧИ Є OID 7 ЦЕ ФАЙЛ РЯДКА: scope_ais_august_Lines_Project 7 GridDivision номер 7 вибрано: 0: 00: 24.624000 Вибрано сітку: 0: 00: 24.640000 Вибір scope_ais_august_Lines_Project всередині GridDivision (7,)… scope_ais_august_tialJones: 00: Spain scope_ais_august_Lines_Projectand сітка всередині GridDivision (7,)… Просторове приєднання поділу сітки (7,) та scope_ais_august_Lines_Project виконано: 0: 00: 28.259000 Об’єднання просторових об’єднань серпня… серпня об’єднано: 0: 00: 28.884000 Видалено просторові об’єднання для збереження просторових просторових об’єднань Розчинення серпня… Розпущено: 0: 00: 29.633000 Видалено об’єднаний клас об’єктів для економії місця на диску Виготовлення серпня растру… RASTER серпень ГОТОВИЙ !!: 0: 00: 30.930000 ЦЕ ОИД 7 Завершено 0: 00: 30.930000

Це тому, що ви створюєте вибір на своємуgridDivisionшар. Потім курсор перебирає лише вибрані функції.

Очистіть вибір після курсору.

# Пройдіть усі класи функцій рядків для lineFC в linesList: print "ЦЕ ФАЙЛ РЯДКУ:" + lineFC з arcpy.da.SearchCursor (gridDivision, ["OID @"]) як курсор: для oid у курсорі: print (oid [0]) #print "THIS IS THE OID" + str (oid [0]) ... інший код ... # Очистити виділення <--------- НОВИЙ КОД arcpy.SelectLayerByAttribute_management (gridDivision, "CLEAR_SELECTION")


Перегляньте відео: Практична робота 5. Проекти з вкладеними циклами. 6 клас. Ривкінд (Жовтень 2021).