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"형상을 인수로 받아들이지 않지만 feature_class_name (레이어 이름)을 필요로하기 때문에 작동하지 않습니다. 공간 술어를 사용하여 검색을 수행 할 수있는 arcpy 메소드가 있습니까? ESRI 매뉴얼 에서이 작업을 수행하는 방법을 찾을 수 없습니다.

답변:


13

우리는 훈련 과정 중 하나에서 아래 코드를 사용하기 때문에 이와 같은 일을 할 수 있다고 확신합니다. 작동하지 않는 것 같으면 ArcMap 목차의 레이어를 사용하거나 ArcMap 외부의 MakeFeatureLayer를 사용하여 레이어 객체를 정의하지 않은 것 같습니다.

또는 SelectLayerByLocation 옆에있는 "connections ="인 것으로 생각됩니다. 결과 객체로 설정하고 다시 전달하기 전에 객체를 추출하지 않기 때문에 문제가 발생합니다.

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

이것은 내가 아는 한, 기능 레이어를 사용하여 arcpy를 통해서만 수행 할 수 있습니다. 기본적으로 where 절을 작성하고 OID (또는 다른 고유 식별 필드)로 업데이트하고 SelectLayerByLocation을 반복하십시오.

PSU 마스터 프로그램 에서이 튜토리얼 을 확인하십시오 . 실수하지 않은 경우에 따라야 할 내용을 정확히 다룹니다.

형상에 대한 참조는 필요하지 않습니다. 공간 쿼리는 사용자가 정의한 쿼리 유형 (즉, 완전히 포함, 경계 공유 등)에 따라 지오메트리를 사용합니다. 이러한 포인트의 지오메트리를 참조해야하는 경우 버퍼 내에있는 것으로 결정되면 OID (python list)를 파이썬 목록에 추가하고 where 절을 사용하여 원래 데이터 세트로 작업하십시오.


문제에 대한 해결책을 찾았습니다. class_layer를 참조하는 문자열 대신 feature_layer를 첫 번째 인수로 제공해야했습니다.
user8175

1

문제에 대한 해결책을 찾았습니다. class_layer를 참조하는 문자열 대신 feature_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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.