ArcPy를 사용하여 프로그래밍 방식으로 조인 감지?


10

ArcMap 프로젝트 내에서 시작되는 Python 코드가 있습니다. 내 코드를 실행하려면 프로젝트에서 사용자가 생성 한 조인을 제거해야합니다. 불행히도 조인을 제거하는 코드… arcpy.RemoveJoin_management ( "layer1", "layer2")… 또한 내 응용 프로그램에 중요한 일부 레이어 속성 (강조 표시 필드, 읽기 전용 필드 등)을 손상시킵니다.

ArcMap에서 레이어를 마우스 오른쪽 버튼으로 클릭하고 "조인 제거"를 선택하여 조인을 제거하면 레이어 속성이 그대로 유지됩니다.

코드 내에서 조인이 있음을 감지 할 수 있으면 코드를 종료하고 코드를 실행하기 전에 사용자가 조인을 수동으로 제거해야한다는 메시지를 표시하기 만하면됩니다. 그렇다면 ... 프로그래밍 방식으로 조인을 감지 할 수 있습니까?


arcpy를 통해 RemoveJoin을 수행하면 문제가 발생하는 방식에 약간 빠져 있습니다. 읽기 전용 필드를 망치는 방법은 무엇입니까? 또한 ArcMap에서 조인 제거 도구를 사용하면 동일한 문제가 발생합니까?
Nathanus

어쩌면 이것을 해결하는 다른 방법은 파이썬 코드를 조인에 둔감하게 만드는 것입니까?
Dan S.

@ Nathanus-ArcMap에서 Join Join을 수동으로 제거해도 레이어 속성이 손상되지 않습니다. ESRI 도움말의 관련 인용문은 다음과 같습니다. "이 도구는 데이터 조인 대화 상자와 약간 다른 실제 비하인드 조인 처리를 수행하므로 해당 대화 상자의 조인 기능에 예기치 않은 문제가 발생하면 도구를 사용하십시오. "
BrianPeasley

@ Dan S.-코드에서 삽입 커서 등을 사용하고 있습니다. 내 코드를 조인에 둔감하게 만드는 방법을 모르겠습니다.
BrianPeasley

1
음, 물어볼 가치가있었습니다. ;) forums.esri.com/Thread.asp?c=93&f=1729&t=293173 은 열 이름 앞에 테이블 이름을 붙여 조인 된 테이블의 값을 업데이트 할 수 있음을 나타냅니다. 아마도 인서트에서도 작동합니까?
Dan S.

답변:


8

arcpy.Layer 클래스 에는 hasJoin 속성이 없습니다 . 필드 이름을 보면서 조인을 테스트 할 수 있다고 생각합니다. 다음은 파일 지오 데이터베이스의 데이터에 대한 간단한 개념 증명입니다.

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName

유망 해 보인다! "if f.name.find (lyr.datasetName)> -1 :"인 경우 고기의 고기를 이해하지 못하지만 며칠 후에 다시 시도하여보고합니다 (눈이 내리려고합니다) 안으로 & 힘을 잃는다!) ... 감사합니다!
BrianPeasley

기쁘다. 파이썬 문자열에 대한 내장 된 find 메소드를 확인하십시오 : docs.python.org/library/string.html 및 arcpy 필드 오브젝트에 대한 문서 : help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/ Field /… 나는이 코드에 데이터를 보여주고 작동하는지 확인하고 싶다.
Derek Swingley

1
나는 이것과 매우 유사한 함수를 사용하게되었고 훌륭하게 작동합니다 ... 내 문서의 각 레이어에 대해 필드 목록을 반복하고 파이썬을 사용하여 필드 이름에 "점"이 있는지 확인합니다.
BrianPeasley

1

GP 객체 로이 작업을 수행하는 데 방탄 방법이 없다는 것을 알게 될 것입니다 .ArcObjects와 comtypes를 사용해야합니다. 다음은 표준 GP 도구 / 오브젝트와의 조인을 확인하는 데 어려움에 대한 ESRI 포럼의 일부 토론입니다. https://geonet.esri.com/thread/20317


ArcObjects와 comtypes는이 프로젝트를위한 해결책이 될 수 없으며 나에게 이질적이며이 프로젝트는 어제 마감 될 것입니다. 해당 포럼 스레드를 알려 주셔서 감사합니다! "... fieldname.split (".) 중 어느 것이 2 개의 부분으로 연결되는지를 확인하십시오! "
BrianPeasley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.