Más

Problemas con los bucles anidados: ¿cómo empezar desde 0?

Problemas con los bucles anidados: ¿cómo empezar desde 0?


Tengo :

  • Clases de entidad de 12 líneas (lineFC)
  • Una clase de entidad poligonal (cuadrícula)
  • Otra clase de entidad poligonal con polígonos mucho más grandes (gridDivision)

El proceso:

  • Seleccione una línea FC de una lista
  • Seleccione una división de cuadrícula
  • Seleccionar todos los polígonos en la cuadrícula dentro de gridDivision
  • Seleccionar líneas dentro de gridDivision
  • Hacer unión espacial entre líneas y cuadrícula

Esto se hace para todos los gridDivision. Hay un bucle con SearchCursor que busca el oid. El resultado es 5 FC de unión espacial

Una vez hecho esto, las 5 combinaciones espaciales se fusionan y se convierten en un ráster.

El problema:

Esto funciona bien para la clase de entidad de primera línea de la lista. La segunda vez que se ejecuta el bucle, el oid no comienza desde 0, sino que permanece en el último valor. Entonces no obtengo 5 combinaciones espaciales sino solo una.

¿POR QUÉ?

He intentado cursor.reset () pero no funcionó.

Lo he intentado con diferentes sangrías de los bucles pero tampoco funcionó.

# Importar importar arcpy importar tiempo importar re # Establecer temporizador desde fecha y hora importar fecha y hora startTime = datetime.now () # Establecer entorno arcpy.env.workspace = r "E:  DensityMaps  DensityMapsTest.gdb" arcpy.env.overwriteOutput = True # Establezca variables locales y cree capas gridDivision = arcpy.MakeFeatureLayer_management ("GridDivisionTEST", "GridDivisionTEST_lyr") grid = arcpy.MakeFeatureLayer_management (r "E:  DensityMaps  DensityMaps1Km_1Odbal_GridOffice", Haga una lista de todas las líneas linesList = arcpy.ListFeatureClasses ("* Lines_Project") #print linesList # Revise todas las clases de entidades de líneas para lineFC en linesList: print "ESTE ES EL ARCHIVO DE LINEAS:" + lineFC con arcpy.da.SearchCursor (gridDivision , ["OID @"]) como cursor: para oid en el cursor: print (oid [0]) #print "ESTE ES EL OID" + str (oid [0]) # Prepárate para hacer la consulta para seleccionar un cuadrado grande de GridDivision a la vez descObj = arcpy.Describe (gridDivision) field = desc Obj.OIDFieldName df = arcpy.AddFieldDelimiters (gridDivision, field) query = df + "=" + str (oid [0]) #print query #Seleccionar cuadrados de gridDivision comenzando con 1 arcpy.SelectLayerByAttribute_management (gridDivision, "NEW_SELECTION ) imprimir "GridDivision number" + str (oid [0]) + "selected:" + str (datetime.now () - startTime) # Seleccionar cuadrícula dentro de gridDivision arcpy.SelectLayerByLocation_management (cuadrícula, "DENTRO", gridDivision) imprimir "Cuadrícula selected: "+ str (datetime.now () - startTime) # Crea una capa de la selección. (Esto es para mantener la selección) arcpy.MakeFeatureLayer_management (grid, "grid_lyr") # Seleccione líneas dentro de gridDivision y agréguelas a la selección anterior print "Selecting" + lineFC + "inside GridDivision" + str (oid) + "…" arcpy .SelectLayerByLocation_management ("grid_lyr", matchOption, lineFC, "", "ADD_TO_SELECTION") print lineFC + "selected:" + str (datetime.now () - startTime) # Make Spatial Join print "Haciendo SpatialJoin entre" + lineFC + "y grid dentro de GridDivision "+ str (oid) +"… "arcpy.SpatialJoin_analysis (grid, lineFC, lineFC +" _ SpatialJoin _ "+ str (oid [0])," JOIN_ONE_TO_MANY "," "," ", matchOption) print" Spatial Join of división de cuadrícula "+ str (oid) +" y "+ lineFC +" hecho: "+ str (datetime.now () - startTime) +"  n "# Seleccionar partes de Spatial Join fileList = arcpy.ListFeatureClasses (lineFC +" _ SpatialJoin * ") # Busca el nombre del mes en líneas string month = re.search ('scope_ais _ (. +?) _ Lines_Project', lineFC) .group (1) #print month # Merge them print" Fusionando las uniones espaciales de "+ mes + "…" ar cpy.Merge_management (fileList, month + "_ Merged") print month + "merged:" + str (datetime.now () - startTime) + " n" # Elimina clases de entidad de unión espacial para ahorrar espacio en el disco para eliminarSpatialJoinFC en fileList: arcpy .Delete_management (deleteSpatialJoinFC) imprimir "Uniones espaciales eliminadas para ahorrar espacio en el disco" # Disolverlo imprimir "Disolver" + mes + "…" arcpy.Dissolve_management (mes + "_ Fusionado", mes + "_ Disolver", "TARGET_FID", [["Join_Count "," SUM "]]) print" Disuelto: "+ str (datetime.now () - startTime) +"  n "#Elimina clases de entidad fusionadas para ahorrar espacio en el disco arcpy.Delete_management (mes +" _ Merged ") print" Se eliminó la clase de entidad combinada para ahorrar espacio en el disco "+"  n "# Hacer impresión ráster" Making "+ mes +" ráster ... "arcpy.FeatureToRaster_conversion (mes +" _ Disolver "," SUM_Join_Count ", mes +" _ 2014_Raster ") imprimir" RASTER " + mes + "LISTO !!:" + str (datetime.now () - startTime) + " n" #Imprimir la hora de finalización print "Finished" + str (datetime.now () - startTime)

Estos mensajes impresos también pueden ayudar a comprender el problema. Puedes ver eso después del mensaje:

RASTER abril LISTO !!: 0: 00: 24.593000

el nuevo archivo scope_ais_august_Lines_Project comienza pero el OID es 7 y no 0

ESTE ES EL ARCHIVO DE LÍNEA: scope_ais_april_Lines_Project 1 GridDivision número 1 seleccionado: 0: 00: 01.656000 Grid seleccionado: 0: 00: 01.687000 Seleccionando scope_ais_april_Lines_Project dentro de GridDivision (1,)… scope_ais_ais_april_Lines_Projectial_amplia_interior: 0 (1,)… Unión espacial de la división de cuadrícula (1,) y scope_ais_april_Lines_Project done: 0: 00: 05.265000 2 GridDivision número 2 seleccionado: 0: 00: 05.297000 Cuadrícula seleccionada: 0: 00: 05.312000 Seleccionando scope_ais_april_Lines_Project dentro de GridDivision (2,) … Scope_ais_april_Lines_Project selected: 0: 00: 05.469000 Haciendo SpatialJoin entre scope_ais_april_Lines_Projectand grid dentro de GridDivision (2,)… Spatial Join de la división de grid (2,) y scope_ais_april_Lines_Project done: 0: 5 00: 08.891 Cuadrícula seleccionada: 0: 00: 08.937000 Seleccionando scope_ais_april_Lines_Project dentro de GridDivision (5,)… scope_ais_april_Lines_Project seleccionado: 0: 00: 09.094000 Haciendo SpatialJoin entre scope_ais_april_Lines_Projectand grid dentro de GridDivision (5,) ... Spatial Join de la división de grid (5,) y scope_ais_april_Lines_Project done: 0: 00: 12.511000 6 GridDivision número 6 seleccionado: 0: 00: 12.527:00000 : 12.558000 Seleccionando scope_ais_april_Lines_Project dentro de GridDivision (6,)… scope_ais_april_Lines_Project seleccionado: 0: 00: 12.714000 Haciendo SpatialJoin entre scope_ais_april_Lines_Projectand grid dentro de GridDivision (6, grid)… GridDivision número 7 seleccionado: 0: 00: 16.168000 Grid seleccionado: 0: 00: 16.183000 Seleccionando scope_ais_april_Lines_Project dentro de GridDivision (7,) ... scope_ais_april_Lines_Project seleccionado: 0: 00: 16.355000 Haciendo SpatialJoin entre scope_ais_april_april grid division (7,) y scope_ais_april_Lines_Project done: 0: 00: 19.777000 Fusionando las uniones espaciales de abril… fusión de abril d: 0: 00: 21.365000 Uniones espaciales eliminadas para ahorrar espacio en el disco Disolviendo abril… Disuelto: 0: 00: 23.249000 Se eliminó la clase de entidad combinada para ahorrar espacio en el disco Haciendo ráster de abril… ¡RASTER abril LISTO !!: 0: 00: 24.593000 ESTO ES EL OID 7 ESTE ES EL ARCHIVO DE LÍNEA: scope_ais_august_Lines_Project 7 GridDivision número 7 seleccionado: 0: 00: 24.624000 Grid seleccionado: 0: 00: 24.640000 Seleccionando scope_ais_august_Lines_Project dentro de GridDivision (7,) ... scope_ais_august_Lines_Projectand grid dentro de GridDivision (7,)… Spatial Join de grid division (7,) y scope_ais_august_Lines_Project hecho: 0: 00: 28.259000 Fusionando las uniones espaciales de agosto… agosto fusionado: 0: 00: 28.884000 Espacio eliminado en las uniones espaciales para ahorrar espacio Disolviendo agosto… Disuelto: 0: 00: 29.633000 Se eliminó la clase de entidad fusionada para ahorrar espacio en el disco. Haciendo el ráster de agosto… ¡RASTER augusto LISTO !!: 0: 00: 30.930000 ESTE ES EL OID 7 Finalizado 0: 00: 30.930000

Esto se debe a que crea una selección en sugridDivisioncapa. A continuación, el cursor solo recorre las características seleccionadas.

Borre su selección después de su cursor.

# Revisar todas las clases de entidad de líneas para lineFC en linesList: imprime "ESTE ES EL ARCHIVO DE LÍNEA:" + lineFC con arcpy.da.SearchCursor (gridDivision, ["OID @"]) como cursor: para oid en cursor: print (oid [0]) #print "ESTE ES EL OID" + str (oid [0])… otro código… # Borrar selección <--------- NUEVO CÓDIGO arcpy.SelectLayerByAttribute_management (gridDivision, "CLEAR_SELECTION")