ArcPy를 사용하여 ArcGIS Desktop에서 점별로 ArcSDE 다각형을 선택 하시겠습니까?


15

나는 무언가를 놓치고 있어야한다고 생각하지만 ArcGIS 10에는 ArcPy를 통해 점 (X, Y) 위치의 레이어에서 피쳐 (특히 다각형)를 선택하는 도구가없는 것 같습니다. 이러한 도구의 매개 변수는 레이어 이름과 XY 위치 일뿐입니다.

현재 포인트를 포함하는 포인트 피쳐 클래스를 생성하고 그에 대해 SelectLayerByLocation을 수행하여이 문제를 해결할 수 있습니다. 그러나 다각형 피처 클래스가 Oracle에 있고 (ArcSDE 9.x를 통해 액세스) 350 만 개의 다각형이 포함 된 경우 선택하는 데 걸리는 시간은 코드가 적은 1 초 또는 2 초가 5 분 이상일 수 있습니다. 더 적절합니다. 기능 클래스에는 공간 인덱스가 있으며 arcpy.env.extent (SelectLayerByLocation은 무시하는 것으로 나타남)를 사용하여 액세스 된 지리적 영역을 제한하려고 시도했지만 성능은 여전히 ​​매우 낮습니다.

ArcGIS Desktop 10 및 ArcPy를 사용하여이 작업을 더 빨리 수행 할 수 있습니까?


이제 forums.arcgis.com/threads/ 에이 문제에 대한 해결책이 있습니다. 오늘이 정보를 나중에 여기에서 편집하겠습니다. Jason Scheirer와 Chris Snyder
PolyGeo

2
이에 대한 참고로 도구 참조 페이지 하단에서 도구가 선호하는 환경을 찾을 수 있습니다. SelectByLocation은 현재 작업 공간 및 출력 좌표계 만 사용합니다. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

답변:


9

이에 대한 또 다른 접근 방식은 Spatial Join 도구를 사용하는 것입니다. 위와 같이 점을 입력 피처 레이어로 사용하고 다각형 레이어를 아이디 피처로 사용하십시오.
SelectLayerByLocation 달리, SpatialJoin는 않는 정도의 환경을 존중.

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

JOIN_ONE_TO_MANY는 직관적이지 않은 것처럼 보이지만 하나의 결합 기능 만 있으므로이 옵션의 주요 기능은 집계 및 병합 규칙을 해제하는 것입니다. KEEP_COMMON은 출력이 포인트와 교차하는 다각형으로 만 제한되도록합니다. 필드 매핑은 출력 속성을 다각형 레이어의 모양과 속성으로 만 제한합니다. 기본값은 포인트 레이어의 속성도 포함합니다.

나머지 기본값은 정상적으로 작동하므로 나머지 인수를 생략 할 수 있습니다.


내가 시도하지 않은 두 가지 기술이 포함 된이 코드에 많은 감사를드립니다. 나는 이전에 SpatialJoin을 시도했지만 (지리 처리 환경을 존중 할 수 있도록) 지금 테스트 한 기술뿐만 아니라 테스트는 여전히 10-12 초와 비교하여 4-5 분의 응답 시간을 남겼습니다. 크리스 스나이더가 나를 이끌었습니다.
PolyGeo

SpatialJoin으로 Chris Snyder의 기술을 사용해 보셨습니까? 버퍼 기술이 너무 빠른 주된 이유는 다각형 클래스의 메모리 내 사본을 사용하기 때문입니다. 위치 별 선택은 공간 결합보다 빠르지 만 확실하지 않습니다.
blord-castillo

in_memory 비트를 사용하지 않았습니다. 그것은 이미 너무 많이 빨려서 그것을 예약 상태로 유지했습니다. 중요한 것은 X / Y를 확인하고 로컬 파일 지오 데이터베이스에 신속하게 복사 해야하는 하나 / 몇 개의 다각형 (3.5 백만에서)을 얻는 범위를 설정하는 것이라고 생각합니다. SpatialJoin 전에 그 부분을 수행하면 동일한 / 유사한 성능 향상으로 이어질 것이라고 생각합니다.
PolyGeo

1

방금 뭔가를 깨달았습니다 ...

이를 사용하여 지오 프로세싱 서비스를 구현하는 경우 폴리곤 레이어로 기능 서비스를 구현하고 기능 서비스에서 쿼리 작업을 사용할 수도 있습니다.

당신은 수있는 기능 서비스 쿼리 작업과 간단한 XY 위치를 사용뿐만 아니라 출력 형태를 포함하는 속성을 제어 할 수 있습니다.

다각형 피쳐 클래스를 얼마나 많이 노출 할 수 있는지에 대한 제한이있을 수 있지만 이미 지오 프로세싱 서비스에 액세스 할 수있게하는 경우 피쳐 서비스도 빌드 할 수 있어야합니다.


이것은 다른 요구 사항을 충족시키는 데 유용한 생각이지만이 경우 클라이언트 응용 프로그램은 매우 간단하고 통제 할 수 없으므로 지오 프로세싱 서비스 만 제공 할 수 있습니다.
PolyGeo

지오 프로세싱 서비스 이외의 다른 것을 사용하는 데 제한이있을 수 있다고 생각했습니다. 또한 원하는 기능을 사용할 수없는 이유도 설명 할 수 있습니다. 모든 응용 프로그램 수준에서 이미 수행 할 수 있습니다. ESRI에 요청을 보내 다음 버전에서 도구로 구현하도록하십시오.
blord-castillo

1

이 답변은 구 ArcGIS 토론 포럼 에서 나왔습니다 .

더 간결한 코드를 작성한 Jason Scheirer에게 감사드립니다.

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

성능 팁을 위해 특히 Chris Snyder에게 :

보다 빠른 해결 방법은 포인트를 약간 버퍼링 한 다음 버퍼 익스텐트를 분석 익스텐트로 사용하여 SDE 데이터의 in_memory 사본 (CopyFeatures 도구)을 작성한 다음 더 작은 로컬 in_memory 데이터 세트에서 SelectByLocation을 수행하는 것입니다. 이렇게하면 SelectByLocation 도구가 일반적으로 그렇지 않은 분석 범위 환경을 존중하게됩니다. BTW : 분석 범위와 겹치는 모든 피쳐는 CopyFeatures 도구를 사용하여 복사됩니다. SelectByLocation 도구와 커서 메소드가 분석 범위를 준수하기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.