3 votos

¿Utilizar Select Layer By Attribute en el bucle for con ArcPy?

Estoy tratando de iterar a través de una clase de característica y seleccionar cada característica una por una utilizando el campo OBJECTID. Cuando utilizo un solo valor, el SelectLayerByAttribute funciona, pero ¿cómo puedo comparar el OBJEECTID con una variable que aumenta en el conteo a través del bucle. Se supone que el programa debe crear una capa para cada característica en la clase de características. Esto es lo que tengo hasta ahora:

import arcpy
import os
arcpy.env.workspace = "C:\Users\Daimon Nurse\Desktop\DFMPROJECT\DFMPROJECT.gdb"
arcpy.env.overwriteOutput=True
inlayer = "C:\Users\Daimon Nurse\Desktop\DFMPROJECT\DFMPROJECT.gdb\ZonesPolyline"

with arcpy.da.SearchCursor(inlayer, ("OID@", "SHAPE@AREA")) as cursor:
    i = 1
    for row in cursor:
        print("Feature {0} has an area of {1}".format(row[0], row[1]))
        outlayer = "ZonePolygon"
        arcpy.MakeFeatureLayer_management (inlayer, outlayer)
        arcpy.SelectLayerByAttribute_management (outlayer, "NEW_SELECTION", """           "OBJECTID" = 1 """)
        output = r'C:\Users\Daimon Nurse\Desktop\Grounds Project\DFMGROUNDS.gdb'
        outfile = os.path.join (output, i)
        arcpy.CopyFeatures_management(outlayer, outfile)
        print i
        i = i + 1

3voto

UnkwnTech Puntos 21942

En lugar de utilizar una cláusula where de:

"""           "OBJECTID" = 1 """

Creo que deberías intentarlo:

'"OBJECTID" = {0}'.format(i)

Además, en lugar de:

outfile = os.path.join (output, i)

Inténtalo:

outfile = os.path.join(output, "fc{0}".format(i))

Lo que he utilizado en los dos casos anteriores es el formato de cadena de Python. Las cadenas de Python se pueden delimitar con comillas simples o dobles. En la primera he utilizado simples para no chocar con las comillas dobles que indicaban el nombre del campo. En la segunda he utilizado comillas dobles porque creo que quedan mejor.

He añadido "fc" a su nombre de clase de característica porque no creo que a ArcGIS le guste un nombre de clase de característica que sea, o empiece por, un número.

También puedes ver:

arcpy.env.workspace = "C:\Users\Daimon Nurse\Desktop\DFMPROJECT\DFMPROJECT.gdb"
arcpy.env.overwriteOutput=True
inlayer = "C:\Users\Daimon Nurse\Desktop\DFMPROJECT\DFMPROJECT.gdb\ZonesPolyline"

que necesita escapar las barras invertidas simples en sus nombres de ruta, por ejemplo

arcpy.env.workspace = r"C:\Users\Daimon Nurse\Desktop\DFMPROJECT\DFMPROJECT.gdb"
arcpy.env.overwriteOutput=True
inlayer = r"C:\Users\Daimon Nurse\Desktop\DFMPROJECT\DFMPROJECT.gdb\ZonesPolyline"

1voto

Flinkman Puntos 4821

Creo que deberías aprovechar la cláusula 'where' del MakeFeatureLayer . Aquí hay un extracto de un script mucho más grande que hace la mayor parte de lo que quieres hacer:

desc = arcpy.Describe(InFC)
OIDfield = desc.OIDFieldName

with arcpy.da.SearchCursor(InFC,[OIDfield,"SHAPE@AREA"]) as SCur:
    for Ft in SCur:
        arcpy.MakeFeatureLayer_management(InFC,"Layer","%s = %d" % (OIDfield,Ft[0]))
        # do some stuff
        arcpy.Delete_management("Layer") # remove the layer for each iteration

Nota: el cursor de búsqueda utiliza corchetes en los campos, no paréntesis: SearchCursor(inlayer, ("OID@", "SHAPE@AREA")) es incorrecto, SearchCursor(inlayer, ["OID@", "SHAPE@AREA"]) es correcto.

Obtengo el OIDFieldName utilizando el código (a través de Describa en Propiedades de la tabla ) por lo que funcionará para shapefiles y clases de características de bases de datos geográficas, OID@ también debería funcionar pero no puedo asegurarlo - siempre lo he hecho así ya que necesito el nombre del campo para la consulta.

Notas sobre el formato de las cadenas:

PolyGeo ha mostrado un tipo de formato utilizando '"OBJECTID" = {0}'.format(i) En la mayoría de los casos, utilizo el estilo de formato %. '"OBJECTID" = %d' % i . Cualquiera de las dos formas funciona; yo prefiero el formato % porque es más parecido a C y estoy acostumbrado a leerlo así.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X