¿ArcPy tiene una función de búsqueda espacial para geometría?

10

Mi problema: con ArcPy, quiero recorrer buffers y seleccionar geometry_features dentro de cada buffer y hacer algo (actualizar) solo los objetos encontrados dentro de ese buffer específico. El siguiente código explica lo que quiero hacer (más o menos):

def _update_connections_inside_buffers(self):
    buffers = arcpy.SearchCursor(self.__buffer_class_name)
    in_layer = "connections"
    for i_buffer in buffers:
        shape = i_buffer.shape
        # can not use a geometry to do a selection.. very inconvenient!!
        connections = arcpy.SelectLayerByLocation_management(in_layer, "WITHIN", shape) 
        self._update_connections(connections)

Sin embargo: esto no funcionará porque SelectLayerByLocation_management () no acepta una geometría, "forma" como argumento, pero espera un feature_class_name (nombre de capa). ¿Existe un método arcpy que pueda hacer una búsqueda utilizando un predicado espacial? No pude encontrar cómo hacer esto en el manual de ESRI.

usuario8175
fuente

Respuestas:

13

Estoy seguro de que se puede hacer algo como esto porque usamos el siguiente código en uno de nuestros cursos de capacitación. Si parece que no funciona, sospecho que no ha definido el objeto de capa al usar una capa en la Tabla de contenido de ArcMap o al usar MakeFeatureLayer fuera de ArcMap.

O, lo más probable es que piense que son las "conexiones =" al lado de SelectLayerByLocation lo que le está dando su problema porque lo está configurando como un objeto Result y no extrae nada de él antes de devolverlo.

import arcpy
schoolsLayer = "Schools"
suburbsLayer = "Suburbs"
# get an update cursor as we will be changing values
rows = arcpy.UpdateCursor(suburbsLayer)
# loop through each suburb in the layer
for row in rows:
    polygon = row.SHAPE
    arcpy.SelectLayerByLocation_management(schoolsLayer,"INTERSECT",polygon)
PolyGeo
fuente
2

Esto se puede hacer, pero que yo sepa, solo mediante el uso de Feature Layers w / arcpy. Básicamente, creará una cláusula where y la actualizará con el OID (u otro campo de identificación exclusivo) y recorrerá SelectLayerByLocation.

Echa un vistazo a este tutorial del programa maestro de PSU: cubre casi exactamente lo que buscas si no me equivoco.

No se necesita referencia a la geometría; la consulta espacial utiliza la geometría en función del tipo de consulta que defina (es decir, contiene completamente, comparte un borde, etc.). Si necesita hacer referencia a la geometría de estos puntos, una vez que se determine que están dentro del búfer, agréguelos (OID) a una lista de Python y trabaje con el conjunto de datos original utilizando una cláusula where.

Roy
fuente
Encontré la solución al problema. Tuve que dar un feature_layer como primer argumento en lugar de una cadena que hace referencia a class_layer.
user8175
1

Encontré la solución al problema. Tuve que proporcionar un feature_layer como primer argumento en lugar de una cadena que se refiera al class_layer ".

    # Make a feature layer from the feature class
    class_layer = arcpy.env.workspace + "." + "connections"
    arcpy.MakeFeatureLayer_management(class_layer, "feature_layer")

    # Do selection using feature_layer 
    arcpy.SelectLayerByLocation_management("feature_layer", "WITHIN", p_polygon)

    # get result
    connections_found_in_polygon = arcpy.SearchCursor("feature_layer")
    self._update_connections(connections_found_in_polygon)
usuario8175
fuente
3
Estoy bastante seguro de que la respuesta de PolyGeo cubrió esto. Debe tener cuidado al notar la distinción entre una clase de entidad y una capa de entidad .
blah238