Чи має 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 () не приймає геометрію, "фігуру" в якості аргументу, але очікує, що буде вказано особливість_class_name (назва шару). Чи є метод arcpy, який може здійснити пошук, використовуючи просторовий предикат. Не вдалося знайти, як це зробити в посібнику з ESRI.

Відповіді:


13

Я впевнений, що щось подібне можна зробити, оскільки ми використовуємо наведений нижче код в одному з наших навчальних курсів. Якщо воно, здається, не працює, я підозрюю, що ви або не визначили об’єкт шару, використовуючи шар у таблиці змісту ArcMap, або використовуючи MakeFeatureLayer поза ArcMap.

Або, швидше за все, я вважаю, що саме "connection =" поруч із 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)

2

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

Ознайомтесь з цим підручником з магістерської програми PSU - він майже повністю охоплює те, що ви шукаєте, якщо я не помиляюся.

Посилання на геометрію не потрібне; просторовий запит використовує геометрію на основі того, який тип запиту ви визначаєте (тобто повністю містить, поділяє межу тощо). Якщо вам потрібно посилатись на геометрію цих точок, після того, як вони будуть визначені в буфері, додайте їх (OID) до списку python та працюйте з оригінальним набором даних, використовуючи пункт де.


Я знайшов рішення проблеми. Я повинен був надати особливість_шар в якості першого аргументу замість того, щоб передати рядок до class_layer.
користувач8175

1

Я знайшов рішення проблеми. Я повинен був надати особливість_шару в якості першого аргументу замість того, щоб передати рядок до 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
Я впевнений, що відповідь PolyGeo висвітлює це. Ви повинні бути обережними, щоб відзначити різницю між класом функцій та рівнем функції .
blah238
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.