ArcPy를 사용하여 * .lyr 파일의 피처 데이터 셋과 관련된 데이터 소스 경로를 변경 하시겠습니까?


11

arcpy를 사용하여 폴더 X의 모든 레이어 파일에 대한 소스 데이터 경로를 어떻게 변경할 수 있습니까?

필자는 최선을 다해 arcpy.mapping 으로 데이터 소스 업데이트 및 수정을 수행했지만Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected error 잘못되거나 누락 된 문제를 해결하기에 충분하지 않은 것은 도움 이되지 않습니다.

코드는 다음과 같습니다 (단일 레이어 파일을 테스트하기 위해 단순화 됨).

import arcpy, os

fname = r'K:\Layers\xxx.lyr'
lyr = arcpy.mapping.Layer(fname)
oldpath = lyr.workspacePath
print 'oldpath: ', oldpath
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
print 'newpath: ', lyr.workspacePath

그리고 결과 :

oldpath:  K:\Canvec_Utility\Temp.gdb
Traceback (most recent call last):
  File "x10x.py", line 12, in <module>
    lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\utils.py", line 181, in fn_
    return fn(*args, **kw)
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\_mapping.py", line 601, in findAndReplaceWorkspacePath
    return convertArcObjectToPythonObject(self._arc_object.findAndReplaceWorkspacePath(*gp_fixargs((find_workspace_path, replace_workspace_path, validate), True
)))
ValueError: Layer: Unexpected error

(( '업데이트'섹션을 답변으로 이동))


Runtime error...위 의 인용문은 Arccatalog의 대화 형 파이썬 쉘에서 인용 한 것으로 역 추적을 제공하지 않습니다. 역 추적 결과는 명령 셸에서 복사됩니다.
matt wilkie

1
작업 공간뿐만 아니라 피처 데이터 셋 내외부로 데이터를 이동하고 있습니까?
geographika

@geographika : 그렇습니다. FDS와 작업 공간이 바뀌고 있습니다. FDS를 지정 하지 않는다는 문서 에 헷갈 렸으며 mxd와 lyr은 무시합니다. 반면에 유효성 검사는 무시하지 않거나 적어도 완전히하지 않습니다 (내 답변 참조).
matt wilkie

답변:


7

작업 공간을 전환 할 때 사용하는 올바른 방법과 기능 데이터 세트가 lyr.replaceDataSource () 인 것 같습니다 . 내 작업 스크립트는 다음과 같습니다.

''' Change the datasource path for the given layer file '''

import arcpy, os

# layer file to re-path
fname = arcpy.GetParameterAsText(0)
# new path to workspace containing the feature class
target_wspace = arcpy.GetParameterAsText(1)
# where to save the layer files
savedir = arcpy.GetParameterAsText(2)

lyr = arcpy.mapping.Layer(fname)

fixed_fname = os.path.join(savedir, lyr.longName)

print '\nOld layer properties (%s)' % (fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

try:
    lyr.replaceDataSource(target_wspace, 'FILEGDB_WORKSPACE', lyr.datasetName, True)
    lyr.saveACopy(fixed_fname)
except:
    print arcpy.GetMessages()

print '\nNew layer properties (%s)' % (fixed_fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

del lyr

테스트 에서이 방법의 유효성 이 다시 다른 것으로 보입니다 . 새 작업 공간이 유효한지 확인하지만 기능 클래스 및 기능 데이터 세트를 무시합니다. 즉, 대상 FC가 없으면 오류를 리턴하지 않습니다.

반면, 대상 FC가 존재하는 경우 (다른 피쳐 데이터 세트 내부에도) 새 데이터 소스 경로는 validate가 true인지 false인지에 관계없이 적절하게 조정됩니다.

업데이트 : 이제 Github 에서 쉽게 공유하고 수정 할 수 있습니다.


.lyr 소스 shp 파일을 새 파일로 바꾸려고 할 때 작동합니까? ValueError : Layer : 예기치 않은 오류가 발생합니다.
GeorgeC

@GeorgeC-나는 이것이 오래된 게시물이라는 것을 알고 있지만 누군가가 검색 엔진을 통해 이것을 발견하면이 오류에 대한 해결책은 데이터 세트 이름에서 .shp를 삭제할 가능성이 있습니다.
DataSource를 대체

6

이 경우 도움이되지 않는 unexpected error것은 "새로운 경로가 존재하지 않습니다" 와 같은 것을 의미 합니다 . validate지정되지 않은 경우 선택적 매개 변수의 기본값은 True입니다. false로 설정하면 스크립트가 오류없이 완료되지만 대상 경로 및 기능 클래스가 있어도 결과 레이어 파일이 여전히 손상되었습니다.

...    
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb', False)
...

결과

oldpath:  K:\code\Canvec\Scripts\Temp.gdb
newpath:  C:\some\other.gdb

초기에 validate를 기본값으로 알지 못했을뿐만 아니라 버그 또는 최소한 매우 기발한 동작으로 인해 문제 해결이 어려워졌습니다. 업데이트 및 arcpy.mapping와 데이터 소스를 수정하는 것은 말한다 음주 작업 공간 경로의 기능 데이터 세트의 이름을 포함하지. 피처 데이터 셋은 작업 공간의 일부입니다. 예를 들어 피쳐 클래스가 독립형 피쳐 클래스에서 피쳐 데이터 세트로 이동 된 경우에도 레이어가 손상되지 않고 맵 문서가 계속 열립니다 ""맵 문서 또는 레이어 파일 내의 레이어 또는 테이블이 기능 데이터 세트 안팎으로 이동하면 링크가 끊어지지 않아야합니다. "

그것은 밝혀 검증이 이것에 약간 다른 각도를 가지고있다. 예. 새 지리 데이터베이스 (작업 공간)에서 대상 피쳐 클래스가 어디에 있는지 , 최상위 레벨에서 또는 완전히 다른 피쳐 데이터 세트 에서 중요하지 않습니다 . 그러나 대상 작업 공간에는 동일한 이름의 기능 데이터 세트가 포함되어 있거나 유효성 검증에 실패합니다 .

Arccatalog 및 Arcmap에서 볼 때 부서지고 "고정 된"레이어

출처 :

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