ArcPy를 사용하여 ArcMap 문서 버전을 확인 하시겠습니까?


21

ArcPy를 사용하여 MXD ( Map Document) 버전을 식별 할 수있는 방법이 있습니까? MXD인벤토리 하는 솔루션을 개발 중이며 문서가 8.1, 9.2, 10.0 등인지 알고 싶습니다.

현재 ArcGIS 10.0을 사용하고 있지만 10.0에없는 10.1 업데이트가 있으면 그 점을 들어 주셔서 감사합니다.

프로그래밍 방식으로 ArcGIS 버전어떻게 찾을 수 있습니까?에 대한 이전 질문이 있습니다. 하지만 모든 ArcObjects 솔루션을 참조합니다 ( python 에서 호출 할 수 있다고 생각 하지만 선호하지는 않습니다).


2
읽기 전용 버전 속성을 MapDocument 객체에 추가하려면 개선 요청이 필요할 수 있습니다 . 하나를 찾거나 만들면 여기에 링크하면 투표하겠습니다.
PolyGeo

버전 제어 의 ArcGIS 아이디어. (음, 3은 하나로 합쳐졌습니다)
gm70560

스크립트를 복사하고 내 환경에 맞게 약간 수정하여 일부 파일에서 실행했지만 9.3 또는 10.0에 저장되었다는 것을 알았지 만 일부 파일이 버전을 반환하지 않았습니다. 깨진 데이터 소스가 스크립트를 망칠 지 확실하지 않습니다.

관련 : gisnuts.com/terra/blog/2014/02/24/… @danjurgell 의 훌륭한 답변은 여기에서 허용 된 답변 에 대한 후속 질문 에 대한 의견에서 찾을 수 있습니다. 해당 블로그 게시물을 기반으로 정보를 예측 가능한 방식으로 파일에 저장하지 않기 때문에 100 % 신뢰할 수있는 방법은 없습니다. 둘 다 작동합니다 여기에 응답 일부 가 아니라 시간을 모든 시간.
Chris W

답변:


23

이 질문은 몇 달 전이지만 다른 사람들에게 도움이 될 수 있도록 게시하고 있습니다. MXD 문서에서 버전 번호를 구문 분석하기 위해이 kludge를 개발했습니다. 기본적으로 MXD 문서의 첫 4000 자 정도 문자를 읽고 버전 번호를 검색합니다. MXD 버전 9.2, 9.3, 10.0 및 10.1로 테스트했습니다.

import re

def getMXDVersion(mxdFile):
    matchPattern = re.compile("9.2|9.3|10.0|10.1|10.2")
    with open(mxdFile, 'rb') as mxd:
        fileContents = mxd.read().decode('latin1')[1000:4500]
        removedChars = [x for x in fileContents if x not in [u'\xff',u'\x00',u'\x01',u'\t']]
        joinedChars = ''.join(removedChars)
        regexMatch = re.findall(matchPattern, joinedChars)
        if len(regexMatch) > 0:
            version = regexMatch[0]
            return version
        else:
            return 'version could not be determined for ' + mxdFile

다음은 mxd 파일의 폴더를 스캔하고 버전과 이름을 인쇄하는 예입니다.

import os
import glob
folder = r'C:\Users\Administrator\Desktop\mxd_examples'
mxdFiles = glob.glob(os.path.join(folder, '*.mxd'))
for mxdFile in mxdFiles:
    fileName = os.path.basename(mxdFile)
    version = getMXDVersion(mxdFile)
    print version, fileName

이것은 이것을 반환합니다 :

>>> 
10.0 Arch_Cape_DRG.mxd
9.2 class_exercise.mxd
9.3 colored_relief2.mxd
10.1 CountyIcons.mxd
10.0 DEM_Template.mxd
9.2 ex_2.mxd
10.0 nairobimap.mxd
10.0 slope_script_example.mxd
10.1 TrailMapTemplateBetter.mxd
10.0 Wickiup_Mountain_DEM.mxd
>>>

이것은 매우 멋지다! 매우 유용한. 이제 레이어와 지오 데이터베이스로도이 작업을 수행 할 수 있습니까?
Mike

이것은 굉장합니다!
dchaboya

10.4 이전 작업 작업 Hexa 리더로 mxd를 분석했으며 버전 위치가 변경되었습니다 (경로 이전 및 현재 경로 이전 및 경로 앞에 "빌드 번호"접두어 단어 값 추가 (10.4.0.5524)). 헥사 값 부분에 10.3.6이
GeoStoneMarten

1
이것은 10.2.2로 다시 저장된 10.6.1 mxds (모든 반환 '버전을 결정할 수 없음')를 확인하여 작동하지 않는 것 같습니다 ... mxd 문서 에이 스크립트에 통합하기위한 업데이트가 있습니까?
JasonBK

14

아래의 기능은 Ryan의 아이디어를 기반으로하지만 조금 더 직접적입니다. ArcGIS 맵 문서는 실제로 OLE 문서이며 oletools모듈 로 구문 분석 할 수 있습니다 (pypi : https://pypi.python.org/pypi/oletools ). 함수는 파일을 열고 버전 문자열을 읽습니다. 9.0, 9.3, 10.1 및 10.3으로 테스트되었지만 아무것도 작동하지 않아야합니다 (3.x에 대해서는 확실하지 않습니다 ...).

from oletools.thirdparty import olefile

def mxd_version(filename):
    ofile = olefile.OleFileIO(filename)
    stream = ofile.openstream('Version')
    data = stream.read().decode('utf-16')
    version = data.split('\x00')[1]
    return version

if __name__ == '__main__':
    import sys
    print(mxd_version(sys.argv[-1]))

1
그것은 훌륭한 기능이기도합니다. 이 기능을 사용하는 것에 대한 유일한 주저는 사용자가 일부 조직에서는 사용자가 할 수없는 타사 라이브러리 (oletools)를 다운로드 / 설치해야한다는 것입니다.
RyanDalton

한 표만 얻지 만 다른 답변이 그렇지 않은 경우에는 효과가 있습니다.
DWynne

Snorfalorpagus는 10.3까지 잘 작동하지만 10.4의 경우 전체 빌드 번호 버전의 다른 스트림 키 'Mx Document Version Info'가 있습니다. 다른 버전의 arcgi를 확인했으며 마지막 버전은 10.4.0.5524를 반환합니다.
GeoStoneMarten

흥미 롭군 아직 10.4로 업그레이드하지 않았습니다. 빈 mxd를 공유해 주시겠습니까?
Snorfalorpagus

1
@GeoStoneMarten 감사합니다. 당신이 보낸 문서를 보았습니다. 원래 코드로 작동하는 것 같습니다. "Mx Document Version Info"스트림이 보이지 않습니까?
Snorfalorpagus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.