Selección por atributos y selección por localización con ArcPy

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).

selección por localización con ArcPy

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.

1 comentario en «Selección por atributos y selección por localización con ArcPy»

  1. 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»)

Los comentarios están cerrados.