ArcPy có chức năng tìm kiếm không gian cho hình học không?


10

Vấn đề của tôi: Sử dụng ArcPy Tôi muốn lặp qua bộ đệm và chọn hình học_features bên trong mỗi bộ đệm và chỉ làm một cái gì đó (cập nhật) các đối tượng được tìm thấy trong bộ đệm cụ thể đó. Mã dưới đây giải thích những gì tôi muốn làm (nhiều hơn hoặc ít hơn):

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)

Tuy nhiên: điều này sẽ không hoạt động vì SelectLayerByLocation_man Quản lý () không chấp nhận hình học, "hình dạng" làm đối số nhưng mong đợi một tính năng_ class_name (tên lớp). Có một phương pháp arcpy có thể thực hiện tìm kiếm bằng cách sử dụng một vị từ không gian. Tôi không thể tìm thấy cách thực hiện điều này từ hướng dẫn ESRI.

Câu trả lời:


13

Tôi tự tin điều gì đó như thế này có thể được thực hiện bởi vì chúng tôi sử dụng mã dưới đây trong một trong các khóa đào tạo của chúng tôi. Nếu nó dường như không hoạt động, thì tôi nghi ngờ rằng bạn đã không xác định đối tượng lớp bằng cách sử dụng một lớp trong Mục lục của ArcMap hoặc bằng cách sử dụng MakeFeatureLayer bên ngoài ArcMap.

Hoặc, nhiều khả năng tôi nghĩ rằng đó là "kết nối =" bên cạnh ChọnLayerByLocation đang mang đến cho bạn vấn đề của bạn vì bạn đang đặt điều đó cho một đối tượng Kết quả và không trích xuất bất cứ điều gì từ nó trước khi gửi lại.

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

Điều này có thể được thực hiện, nhưng theo như tôi biết, chỉ thông qua việc sử dụng Lớp tính năng w / arcpy. Về cơ bản, bạn sẽ tạo một mệnh đề where và cập nhật nó với OID (hoặc trường nhận dạng duy nhất khác) và lặp qua ChọnLayerByLocation.

Hãy xem hướng dẫn này từ chương trình của bậc thầy PSU - nó bao gồm khá nhiều chính xác những gì bạn đang theo nếu tôi không nhầm.

Không cần tham khảo hình học; truy vấn không gian sử dụng hình học dựa trên loại truy vấn bạn xác định (nghĩa là hoàn toàn chứa, chia sẻ đường viền, v.v.). Nếu bạn cần tham chiếu hình dạng của các điểm này, một khi chúng được xác định là nằm trong bộ đệm, hãy thêm chúng vào danh sách python và làm việc với tập dữ liệu gốc bằng mệnh đề where.


Tôi tìm thấy giải pháp cho vấn đề. Tôi đã phải đưa ra một Feature_layer làm đối số đầu tiên thay vì tham chiếu chuỗi tới class_layer.
dùng8175

1

Tôi tìm thấy giải pháp cho vấn đề. Tôi đã phải cung cấp một Feature_layer như một đối số đầu tiên thay vì tham chiếu chuỗi tới 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
Tôi khá chắc chắn câu trả lời của PolyGeo bao gồm điều này. Bạn nên cẩn thận lưu ý phân biệt giữa một lớp đối tượng và một lớp đối tượng .
blah238
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.