Есть ли в ArcPy функция пространственного поиска для геометрии?

10

Моя проблема: используя ArcPy, я хочу перебрать буферы и выбрать geometry_features внутри каждого буфера и сделать что-то (обновить) только объекты, найденные в этом конкретном буфере. Код ниже объясняет, что я хочу сделать (более или менее):

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)

Однако: это не будет работать, потому что SelectLayerByLocation_management () не принимает геометрию, "shape" в качестве аргумента, но ожидает имя_класса_имя (имя слоя). Есть ли arcpy метод, который может выполнять поиск с использованием пространственного предиката. Я не мог найти, как это сделать из руководства ESRI.

user8175
источник

Ответы:

13

Я уверен, что что-то подобное можно сделать, потому что мы используем приведенный ниже код на одном из наших учебных курсов. Если кажется, что он не работает, то я подозреваю, что вы не определили объект слоя, используя слой в Оглавлении ArcMap или используя MakeFeatureLayer вне ArcMap.

Или, более вероятно, я думаю, что это «connections =» рядом с SelectLayerByLocation, которая дает вам вашу проблему, потому что вы устанавливаете это для объекта Result и ничего не извлекаете из него перед передачей обратно.

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
источник
2

Это можно сделать, но, насколько я знаю, только с помощью Feature Layers w / arcpy. По сути, вы создадите предложение where и обновите его с помощью OID (или другого уникально идентифицирующего поля) и выполните цикл по SelectLayerByLocation.

Посмотрите этот урок из магистерской программы PSU - он охватывает почти все, что вам нужно, если я не ошибаюсь.

Ссылка на геометрию не требуется; пространственный запрос использует геометрию, основанную на том, какой тип запроса вы определяете (то есть полностью содержит, разделяет границу и т. д.). Если вам нужно сослаться на геометрию этих точек, как только они будут определены в буфере, добавьте их (OID) в список Python и работайте с исходным набором данных, используя предложение where.

Рой
источник
Я нашел решение проблемы. Мне пришлось дать feature_layer в качестве первого аргумента вместо ссылки на строку в class_layer.
user8175
1

Я нашел решение проблемы. Я должен был предоставить feature_layer в качестве первого аргумента вместо ссылки на строку в 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
источник
3
Я почти уверен, что ответ PolyGeo охватил это. Вы должны быть осторожны, чтобы заметить различие между классом объектов и слоем объектов .
blah238