Czy ArcPy ma funkcję wyszukiwania przestrzennego geometrii?

10

Mój problem: za pomocą ArcPy chcę przeglądać bufory i wybierać właściwości geometry wewnątrz każdego bufora i robić coś (aktualizować) tylko obiekty znalezione w tym konkretnym buforze. Poniższy kod wyjaśnia, co chcę zrobić (mniej więcej):

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)

Jednak: to nie zadziała, ponieważ SelectLayerByLocation_management () nie akceptuje geometrii, „kształtuje” jako argument, ale oczekuje nazwy_klasy_funkcji (nazwa warstwy). Czy istnieje metoda arcpy, która może wyszukiwać przy użyciu predykatu przestrzennego. Nie mogłem znaleźć sposobu na zrobienie tego z podręcznika ESRI.

użytkownik8175
źródło

Odpowiedzi:

13

Jestem pewien, że coś takiego można zrobić, ponieważ wykorzystujemy poniższy kod na jednym z naszych kursów szkoleniowych. Jeśli wydaje się, że nie działa, podejrzewam, że albo nie zdefiniowałeś obiektu warstwy, używając warstwy w Spisie treści ArcMap, lub używając MakeFeatureLayer poza ArcMap.

Lub, bardziej prawdopodobne, myślę, że to „połączenia =” obok SelectLayerByLocation daje ci problem, ponieważ ustawiasz to na obiekt Result i nie wyciągasz z niego niczego przed przekazaniem go z powrotem.

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
źródło
2

Można to zrobić, ale o ile mi wiadomo, tylko poprzez użycie Feature Layers w / arcpy. Zasadniczo utworzysz klauzulę where i zaktualizujesz ją o OID (lub inne pole jednoznacznie identyfikujące) i zapętlisz przez SelectLayerByLocation.

Sprawdź ten samouczek z programu głównego zasilacza - obejmuje on dokładnie to, czego szukasz, jeśli się nie mylę.

Nie jest potrzebne odniesienie do geometrii; zapytanie przestrzenne wykorzystuje geometrię opartą na tym, jaki typ zapytania zdefiniujesz (tj. całkowicie zawiera, dzieli granicę itp.). Jeśli potrzebujesz odwołać się do geometrii tych punktów, po ustaleniu, że znajdują się one w buforze, dołącz je (OID) do listy python i pracuj z oryginalnym zestawem danych, używając klauzuli where.

Roy
źródło
Znalazłem rozwiązanie problemu. Musiałem podać Feature_layer jako pierwszy argument zamiast ciągu znaków odnoszącego się do player_layer.
user8175
1

Znalazłem rozwiązanie problemu. Musiałem podać funkcję player_layer jako pierwszy argument zamiast ciągu odnoszącego się do player_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)
użytkownik8175
źródło
3
Jestem prawie pewien, że odpowiedź PolyGeo to obejmowała. Należy zwrócić uwagę na różnicę między klasą elementów a warstwą elementów .
blah238