ArcPy ha una funzione di ricerca spaziale per la geometria?


10

Il mio problema: usando ArcPy voglio passare in rassegna i buffer e selezionare geometria_features all'interno di ciascun buffer e fare qualcosa (aggiornare) solo gli oggetti trovati all'interno di quel buffer specifico. Il codice seguente spiega cosa voglio fare (più o meno):

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)

Tuttavia: questo non funzionerà perché SelectLayerByLocation_management () non accetta una geometria, "forma" come argomento ma prevede un feature_class_name (nome del layer). Esiste un metodo arcpico che può fare una ricerca usando un predicato spaziale. Non sono riuscito a trovare come farlo dal manuale ESRI.

Risposte:


13

Sono certo che si possa fare qualcosa del genere perché utilizziamo il codice seguente in uno dei nostri corsi di formazione. Se sembra non funzionare, sospetto che non sia stato definito l'oggetto livello utilizzando un livello nel Sommario di ArcMap o utilizzando MakeFeatureLayer al di fuori di ArcMap.

O, più probabilmente, penso che sia il "connections =" ​​accanto a SelectLayerByLocation che ti sta dando il tuo problema perché lo stai impostando su un oggetto Risultato e non stai estraendo nulla da esso prima di riproporlo.

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)

2

Questo può essere fatto, ma per quanto ne so, solo attraverso l'uso di Feature Layer w / arcpy. In sostanza, creerai una clausola where e la aggiornerai con l'OID (o altro campo identificativo univoco) e esegui il ciclo attraverso SelectLayerByLocation.

Dai un'occhiata a questo tutorial dal programma del master PSU: copre praticamente esattamente quello che stai cercando se non sbaglio.

Non è necessario alcun riferimento alla geometria; la query spaziale utilizza la geometria in base al tipo di query definita (ovvero contiene completamente, condivide un bordo, ecc.). Se è necessario fare riferimento alla geometria di questi punti, una volta determinato che si trovano all'interno del buffer, aggiungerli (OID) a un elenco Python e lavorare con il set di dati originale utilizzando una clausola where.


Ho trovato la soluzione al problema. Ho dovuto dare a feature_layer come primo argomento invece di string che si riferisce a class_layer.
user8175

1

Ho trovato la soluzione al problema. Ho dovuto fornire un feature_layer come primo argomento anziché la stringa che si riferisce a 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)

3
Sono abbastanza sicuro che la risposta di PolyGeo riguardasse questo. Prestare attenzione a notare la distinzione tra una classe di caratteristiche e un livello di funzionalità .
blah238,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.