Más

Arcpy; Seleccionar por atributo con una declaración If, then

Arcpy; Seleccionar por atributo con una declaración If, then


¿Cómo construyo una declaración if, then basada en una consulta SQL de selección por atributo o algún otro método (cursor de búsqueda?)?

Estoy pidiendo a los usuarios que ingresen un ID único (arcpy.GetParameterAsText (0)), basado en ese ID Quiero buscar un campo de shapefile para ese valor (arcpy.SelectLayerByAttribute_management o arcpy.SearchCursor?), Si no se encuentra, yo desea buscar un shapefile diferente. Cuando se encuentra la ID única, necesito exportar (arcpy.CopyFeatures_management) y aislar la función.

Tengo problemas para encontrar algo que indique si la identificación única se encuentra en el campo o no.

Básicamente, estoy buscando algo como lo que ocurre con el clic de evento del botón Verificar expresión -> "La expresión se verificó correctamente, PERO NO SE DEVOLVERON REGISTROS".


Digamos que tiene una lista de shapefiles y el nombre del campo para el atributo es el mismo en cada shapefile. Eso significa que puede realizar la consulta SQL al principio del script, por lo que el primer bit podría verse así:

search_id = arcpy.GetParameterAsText (0) shps = [r "ruta  a  shp1.shp", r "ruta  a  shp2.shp"] output_shp = r "ruta  a  output.shp" campo = "ID_FIELD_NAME" sql = '"{0}" = ' {1}  ". formato (campo, id_búsqueda)

Aquí hay dos formas de realizar su proceso de selección. El primero usa una cláusula where en MakeFeatureLayer () y GetCount (), y el segundo usa un SearchCursor () para encontrar el atributo y procede a MakeFeatureLayer (). No estoy seguro de cuál es más rápido, pero supongo que el segundo. Lo más probable es que la velocidad sea muy similar si no tienes toneladas de shapefiles.

para shp en shps: # hacer capa de entidades si arcpy.Exists ("fl"): arcpy.management.Delete ("fl") fl = arcpy.management.MakeFeatureLayer (shp, "fl", sql) # comprobar recuento de entidades en la nueva capa de entidades, salte al siguiente shp si == 0 if int (arcpy.management.GetCount (fl) .getOutput (0)) == 0: continue # copiar entidades, solo ocurre si hay una entidad en la entidad capa arcpy.management.CopyFeatures (fl, output_shp)

y aquí está el segundo. En este, se usa un SearchCursor para verificar la presencia de la característica, y luego se usa MakeFeatureLayer (). Creo que esta probablemente sea la forma más rápida:

para shp en shps: # use la lista de comprensión con un SearchCursor para verificar el id all_ids = [r [0] para r en arcpy.da.SearchCursor (shp, field)] si no search_id en all_ids: continue # ahora haga la capa de entidades y copiar características si arcpy.Exists ("fl"): arcpy.management.Delete ("fl") fl = arcpy.management.MakeFeatureLayer (shp, "fl", sql) # copiar características arcpy.management.CopyFeatures (fl, output_shp)

EDITAR:

Con diferentes nombres de campo, puede almacenarlos e iterar los shapefiles de esta manera:

shps = [(r "ruta  a  shp1.shp", "ID_FIELD_NAME1"), (r "ruta  a  shp2.shp", "ID_FIELD_NAME2")] output_shp = r "ruta  a  salida.shp" para item in shps: shp = item [0] field = item [1] sql = '"{0}" = ' {1}  ". format (field, search_id) #continuar con el resto del código como arriba

Ver el vídeo: Map Algebra Functionality and Advanced Raster Calculator Calculations