O ArcPy possui função de busca espacial para geometria?

10

Meu problema: usando o ArcPy, quero fazer um loop sobre buffers e selecionar geometry_features dentro de cada buffer e fazer algo (atualizar) apenas os objetos encontrados nesse buffer específico. O código abaixo explica o que eu quero fazer (mais ou 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)

No entanto: isso não funcionará porque SelectLayerByLocation_management () não aceita uma geometria, "forma" como argumento, mas espera um feature_class_name (nome da camada). Existe um método arcpy que pode fazer uma pesquisa usando um predicado espacial. Não consegui encontrar como fazer isso no manual da ESRI.

user8175
fonte

Respostas:

13

Estou confiante de que algo assim pode ser feito porque usamos o código abaixo em um de nossos cursos de treinamento. Se parece que não está funcionando, suspeito que você não tenha definido o objeto da camada usando uma camada no Sumário do ArcMap ou usando MakeFeatureLayer fora do ArcMap.

Ou, mais provavelmente, acho que são as "conexões =" ao lado de SelectLayerByLocation que estão apresentando seu problema, porque você está definindo isso como um objeto Result e não extraindo nada dele antes de devolvê-lo.

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
fonte
2

Isso pode ser feito, mas até onde eu sei, apenas através do uso de Feature Layers w / arcpy. Essencialmente, você criará uma cláusula where e a atualizará com o OID (ou outro campo de identificação exclusivo) e percorrerá o SelectLayerByLocation.

Confira este tutorial no programa de mestrado da PSU - ele cobre praticamente exatamente o que você procura, se não me engano.

Nenhuma referência à geometria é necessária; a consulta espacial usa a geometria com base em que tipo de consulta você define (ou seja, contém completamente, compartilha uma borda etc.). Se você precisar fazer referência à geometria desses pontos, uma vez que eles estejam dentro do buffer, anexe-os (OID) a uma lista python e trabalhe com o conjunto de dados original usando uma cláusula where.

Roy
fonte
Encontrei a solução para o problema. Eu tive que dar um feature_layer como primeiro argumento em vez de string referindo-se ao class_layer.
user8175
1

Encontrei a solução para o problema. Eu tive que fornecer uma feature_layer como primeiro argumento em vez de string referindo-se à 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)
user8175
fonte
3
Tenho certeza de que a resposta da PolyGeo cobriu isso. Você deve ter cuidado ao observar a distinção entre uma classe de recurso e uma camada de recurso .
blah238