내가 겪은 모든 깨진 레이어가 있고 수동으로 재설정하는 약 50 mxd가 있습니다.
데이터가 다른 컴퓨터에서 이동되었고 폴더 구조가 변경되어 단순한 변경 프로세스가 아닙니다 (예).
“F : \ Data \ Rivers.shp”를 “C : \ Data \ Rivers.shp”로
그것은 더 같다 :
“F : \ Data \ Rivers.shp”를 C : \ Data \ Park \ Water \ Rivers.shp로
그 자체의 하위 폴더에있는 모든 종류의 데이터 (경계선, 채식 표지, 도로 등)에 대해서도 마찬가지입니다.
적어도 mxd의 대부분에서 발견되는 더 일반적인 레이어 중 일부를 복구하는 mxd 중 하나를 열 때마다 반복적으로 실행할 수있는 스크립트를 만들고 싶습니다. 그런 다음 나머지를 수동으로 복구 할 수 있습니다. 나 자신 저장 적어도 수있는 그런 식으로 몇 시간.
나는 라인을 따라 무언가를 사용하고있다 :
import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")
for lyr in arcpy.mapping.ListLayers(mxd):
if lyr == "Rivers": #Should this be the layner name in TOC or FC name?
lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")
아이디어는 어떻게 든 내 mxd에있는 다른 공통 레이어에 대해 위의 여러 대체 스크립트를 추가하는 것입니다.
그러나 위의 스크립트는 Rivers 레이어를 수정조차하지 않습니다.
파일 경로가 다른 수리 할 다른 레이어를 추가하려면 어떻게해야합니까?
답변
당신은 당신의 스크립트와 함께 올바른 길을 가고 있습니다. 그것은 당신이 비교하는 방법에 문제가 거짓말처럼 보이는 Layer
사람, 개체 이름 의 Layer
에 목차 .
ListLayers 함수 를 사용할 때 반환되는 것은 Layer
객체입니다. 그런 다음이를 a text string
와 비교하여 동일한 지 확인할 수 없으므로 대신 이름 에 액세스해야합니다 Layer
.
import arcpy
mxd = arcpy.mapping.MapDocument("CURRENT")
for lyr in arcpy.mapping.ListLayers(mxd):
if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")
선택기를 더 추가하려면 if/then
코드 의 일부를 확장하여 다른 레이어 이름을 찾으십시오.
for lyr in arcpy.mapping.ListLayers(mxd):
if lyr.name.lower() == "rivers": #This should be the Layer name in the TOC?
lyr.replaceDataSource(r"C:\Data\Park\Water", "SHAPEFILE_WORKSPACE", "Rivers")
elif lyr.name.lower() == "streets":
lyr.replaceDataSource(r"C:\Data\Facilities\Streets", "SHAPEFILE WORKSPACE", "Streets")
name
선택기를 계속 수정하여 에서 고유 한 특정 레이어를 찾은 다음 처리 할 함수를 .mxd
추가하면 replaceDataSource
됩니다. lower
이름을 테스트 할 때이 기능을 사용했습니다 . 이것은 ESRI의 도움말 문서에서도 사용되며, 대소 문자가 일치하지 않아 레이어 이름이 일치하지 않을 가능성이 있다는 추론이 있습니다.
다음은 Arcpy 매핑으로 데이터 소스 업데이트 및 수정 에 대한 ESRI 도움말입니다.
ArcGIS의 도움말 파일은 일반적으로 명확한 설명과 특정 요구에 맞게 간단히 복사 / 붙여 넣기 및 수정할 수 있는 많은 Python 코드 샘플을 포함하므로 매우 유용 합니다.