La selección por atributos o por localización, se suele usar en muchos geoprocesos en el día a día de nuestro trabajo como técnicos o analistas GIS. Por ello, es importante conocer bien cómo aplicar estas dos funciones tanto en la interfaz de ArcMap, como mediante código Python utilizando para ello ArcPy.
- Select by attributes nos permite seleccionar determinados atributos de una capa creando una consulta sobre ellos. Esta selección puede ser de varios tipos, como nueva, añadir selección a una ya existente etc.
- Select by location permite seleccionar entidades en base a una relación espacial con otra.
Para ejecutar ambas selecciones se ha de crear una Feature Layer a partir de la entidad que se quiere usar.
Selección por atributos
La sintaxis es la siguiente:
SelectLayerByAttribute_management (in_layer_or_view, {selection_type}, {where_clause})
Explicación de los parámetros:
- in_layer_or_view: capa de la entidad a la que se aplicará la selección.
- selection_type: determina el tipo de selección, pudiendo ser:
- NEW_SELECTION: La selección resultante reemplaza toda selección existente. Opción predeterminada.
- ADD_TO_SELECTION: La selección resultante se agrega a una selección existente. Si no existe ninguna selección, es lo mismo que NEW_SELECTION.
- REMOVE_FROM_SELECTION: La selección resultante se quita de una selección existente.
- SUBSET_SELECTION: La selección resultante se combina con una selección existente. Solo permanecen los registros comunes a ambas selecciones.
- SWITCH_SELECTION: Cambia la selección. Todos los registros seleccionados se quitan de la selección y todos los registros no seleccionados se agregan a la selección.
- CLEAR_SELECTION: Borra o quita cualquier selección.
- Where_clause: expresión SQL para seleccionar un subconjunto de registros.
Ejemplo
Tenemos una capa de carreteras de Madrid y necesitamos trabajar solo con aquellas cuya longitud sea mayor a 5500 metros, ¿Cómo resolvemos este problema mediante código python?
Vamos a ver cómo realizar una selección por atributos mediante código:
import arcpy wks=arcpy.env.workspace=r"C:\ArcPyAvan\Unidad6\Datos\Ejercicio6.gdb" arcpy.env.overwriteOutput = True #Creamos primero la layer para poder realizar la seleccion por atributos arcpy.MakeFeatureLayer_management ("Carreteras", "Carreteras_Lay") #aplicamos la Where Clause WC="Shape_Length >= 5500" #Aplicamos la seleccion y guardamos en la variable SL SL=arcpy.SelectLayerByAttribute_management("Carreteras_Lay", "NEW_SELECTION", WC) #Creamos una entidad con la seleccion para guardarla en nuestra GDB arcpy.CopyFeatures_management(SL, "Carreteras5500")
En primer lugar hemos creado una nueva capa (Carreteras_Lay), hemos aplicado la función SelectLayerByAttribute sobre la nueva capa de carreteras, creando una nueva selección y aplicando la expresión SQL Shape_Length >= 5500.
Por último, al igual que en ArcMap hacemos una exportación de los datos para guardar dicha selección, con ArcPy realizamos el mismo paso mediante CopyFeatures_management()
En amarillo se muestra la nueva capa con las carreteras mayores a 5.500 metros.
Selección por localización
La sintaxis es la siguiente:
SelectLayerByLocation_management (in_layer, {overlap_type}, {select_features}, {search_distance}, {selection_type}, {invert_spatial_relationship})
Explicación de los parámetros:
- in_layer: capa de la entidad que se evaluará con respecto a select_feature. Es la entidad de la cual obtendremos las entidades que queremos.
- overlap_type: determina el tipo de selección, puede ser: INTERSECT, INTERSECT_3D, WITHIN_A_DISTANCE,WITHIN_A_DISTANCE_3D, WITHIN_A_DISTANCE_GEODESIC, CONTAINS, COMPLETELY_CONTAINS, CONTAINS_CLEMENTINI, WITHIN, COMPLETELY_WITHIN, WITHIN_CLEMENTINI, ARE_IDENTICAL_TO, BOUNDARY_TOUCHES, SHARE_A_LINE_SEGMENT_WITH, CROSSED_BY_THE_OUTLINE_OF HAVE_THEIR_CENTER_IN.
- Select_feature: la entidad de la capa que se seleccionará, según su relación con la entidad. Parámetro opcional.
- search_distance: parámetro válido en caso de que overlap_type se ha definido como alguno de los siguientes: WITHIN_A_DISTANCE_GEODESIC, WITHIN_A_DISTANCE, WITHIN_A_DISTANCE_3D, INTERSECT, INTERSECT_3D, HAVE_THEIR_CENTER_IN, CONTAINS, o WITHIN.
- selection_type: Determina cómo se aplicará la selección a la entrada y cómo combinarla con una selección existente.
- overlap_type: determina el tipo de selección, pudiendo ser: NEW_SELECTION, ADD_TO_SELECTION, SUBSET_SELECTION, SWITCH_SELECTION. Para borrar una selección se ha de usar CLEAR_SELECTION. Opcional
- invert_spatial_relationship: una vez evaluada la relación espacial, esta opción determina si el resultado se debe utilizar tal cual o invertido, pudiendo ser NOT_INVERT; el resultado de la consulta no se invertirá. es la opción predeterminada. INVERT; el resultado de la consulta se invertirá. Parámetro opcional de tipo booleano.
Ejemplo
Sobre la anterior capa de carreteras de Madrid, necesitamos trabajar solo con aquellas que interecten con un distrito de la ciudad que tenemos localizado mediante un polígono ¿Cómo saber de qué carreteras se trata resolviendo el problema mediante código python?
Vamos a ver cómo realizar la selección por localización mediante código:
import arcpy wks=arcpy.env.workspace=r"C:\ArcPyAvan\Unidad6\Datos\Ejercicio6.gdb" arcpy.env.overwriteOutput = True #Creamos primero las layers para poder realizar la seleccion por localización arcpy.MakeFeatureLayer_management ("Carreteras", "Carreteras_Lay") arcpy.MakeFeatureLayer_management ("Poligono", "Poligono_Lay") #Aplicamos la seleccion y guardamos esa en la variable SLL SLL=arcpy.SelectLayerByLocation_management("Carreteras_Lay","INTERSECT","Poligono_Lay") #Creamos una entidad con la seleccion para guardarla en nuestra GDB arcpy.CopyFeatures_management(SLL, "Carreteras_Pol")
En este caso vamos a usar dos entidades, carreteras y polígonos.
Creamos una variable SLL para guardar en ella la selección. Aplicamos la función SelectLayerByLocation sobre la capa de carreteras de tal modos que se seleccionen solo aquellas que intersecten con nuestra capa de polígonos.
Igual que en el caso anterior, usamos CopyFeatures_management() para guardar el resultado de la selección en otra capa (Carreteras_Pol).
En amarillo se muestra la nueva capa de carreteras que contiene solo aquellas que intersectan con la capa de polígonos (en color morado)
Y esto es todo, si quieres aprender a trabajar con python en el entorno de ArcGIS, inscríbete ya en nuestro curso online de Python para ArcGIS.
Licenciado en Geografía. Máster en Sistemas de Información Geográfica. Consultor GIS desde el año 2004. En MappingGIS desde el año 2012 para ayudarte a impulsar tu perfil GIS y diferenciarte de la competencia. Echa un vistazo a todos nuestros cursos de SIG online.
Buenas noches, estare muy agradecido su ayuda en arcpy, deseo que los objetos seleccionados por el usuario en arcmap atraparlo en codigo python para usar «SUBSET_SELECTION» en SelectLayerByAttribute_management, pero al ejecutar me crea el shape sin registros(objetos)
import arcpy
arcpy.env.overwriteOutput = True
ruta = arcpy.env.workspace = r»E:\edwar\Clases\Practicando\ARCGIS\HERRAMIENTAS_CREADAS\prueba\prueba.shp»
arcpy.MakeFeatureLayer_management(ruta, «fc_layer»)
arcpy.SelectLayerByAttribute_management(«fc_layer»,»SUBSET_SELECTION»,»BO= ‘prioridad'»)
arcpy.CopyFeatures_management(«fc_layer»,r»E:\edwar\Clases\Practicando\ARCGIS\HERRAMIENTAS_CREADAS\prueba\select3.shp»)
print («ejecutado»)