Sử dụng ArcPy để xác định phiên bản tài liệu ArcMap?


21

Có cách nào để ArcPy xác định phiên bản của Tài liệu bản đồ (MXD) không. Tôi đang nghiên cứu một giải pháp để kiểm kê MXD của chúng tôi và muốn biết liệu một tài liệu có phải là 8.1, 9.2, 10.0, v.v.

Tôi hiện đang sử dụng ArcGIS 10.0, nhưng nếu có bản cập nhật 10.1 không tồn tại trong 10.0, tôi cũng sẽ đánh giá cao khi nghe điều đó.

Tôi thấy có một câu hỏi trước đây về Làm thế nào bạn có thể tìm thấy phiên bản ArcGIS theo chương trình? , nhưng nó tham chiếu tất cả các giải pháp ArcObjects (mà tôi cho rằng tôi có thể gọi từ python , nhưng tôi không muốn).


2
Tôi nghĩ rằng điều này có thể cần một yêu cầu nâng cao cho thuộc tính phiên bản chỉ đọc được thêm vào đối tượng MapDocument. Nếu bạn tìm / tạo một cái thì liên kết với nó ở đây và tôi sẽ bỏ phiếu cho nó.
PolyGeo

Có một phiên bản điều khiển ArcGis Idea. (tốt, 3 hợp nhất thành một)
gm70560

Tôi đã sao chép tập lệnh của bạn, sửa đổi nó một chút cho môi trường của tôi và chạy nó trên một số tệp của tôi, nhưng một số tệp không trả về phiên bản mặc dù tôi biết rằng chúng đã được lưu trong 9.3 hoặc 10.0. Tôi không chắc chắn nếu các nguồn dữ liệu bị hỏng sẽ làm hỏng tập lệnh của bạn.

Liên quan: gisnuts.com/terra/blog/2014/02/24/ Từ Một phát hiện xuất sắc của @danjurgell trong một nhận xét về câu hỏi tiếp theo cho câu trả lời được chấp nhận tại đây. Dựa trên bài đăng trên blog đó, không có cách nào đáng tin cậy 100% để làm điều này bởi vì thông tin không được lưu trữ trong tệp theo cách có thể dự đoán được. Cả hai câu trả lời ở đây sẽ làm việc một số thời gian nhưng không phải tất cả thời gian.
Chris W

Câu trả lời:


23

Tôi biết câu hỏi này đã được vài tháng tuổi, nhưng tôi sẽ đăng câu hỏi này trong trường hợp nó giúp được người khác. Tôi đã phát triển loại bùn này để phân tích số phiên bản từ các tài liệu MXD. Về cơ bản, nó đọc 4000 ký tự đầu tiên của tài liệu MXD và tìm kiếm số phiên bản. Tôi đã thử nghiệm với các phiên bản MXD 9.2, 9.3, 10.0 và 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

Dưới đây là một ví dụ về việc quét một thư mục cho các tệp mxd và in phiên bản và tên

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

Trả về cái này:

>>> 
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
>>>

Điều này rất tuyệt! Rất hữu dụng. Bây giờ chúng ta có thể làm điều này với các lớp và cơ sở dữ liệu địa lý không?
Mike

Đây là hoàn toàn tuyệt vời!
dchaboya

Work weel before 10.4 Tôi đã phân tích mxd với trình đọc Hexa và vị trí phiên bản đã thay đổi (đó là sau đường dẫn trước và hôm nay là trước đường dẫn và thêm giá trị từ tiền tố "Build Number" tiếp theo là (10.4.0.5524). Với 10.3.1 I có 10.3.6 trong phần giá trị hexa
GeoStoneMarten

1
điều này dường như không hoạt động đối với tôi, kiểm tra 10,6,1 mxds đã được lưu lại thành 10.2.2 (không thể xác định tất cả phiên bản ') ... có bất kỳ cập nhật nào trong tài liệu mxd để tích hợp vào tập lệnh này không?
JasonBK

14

Các chức năng dưới đây dựa trên ý tưởng của Ryan, nhưng trực tiếp hơn một chút. Các tài liệu bản đồ ArcGIS thực sự là các tài liệu OLE, có thể được phân tích cú pháp bằng oletoolsmô-đun (có sẵn trên pypi: https://pypi.python.org/pypi/oletools ). Hàm mở tệp và đọc chuỗi phiên bản. Đã thử nghiệm với 9.0, 9.3, 10.1 và 10.3, nhưng sẽ hoạt động với mọi thứ (không chắc chắn về 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
Đó cũng là một chức năng tuyệt vời. Sự do dự duy nhất tôi có thể chống lại việc sử dụng chức năng này là nó yêu cầu người dùng tải xuống / cài đặt thư viện của bên thứ ba (oletools) mà trong một số tổ chức, người dùng không thể làm được.
RyanDalton

Tôi chỉ nhận được một phiếu bầu, nhưng điều này sẽ hoạt động trong trường hợp câu trả lời khác không có.
DWynne

Snorfalorpagus nó hoạt động tốt cho đến 10.3 nhưng trong 10,4 có một khóa truyền phát khác 'Thông tin phiên bản tài liệu Mx' với phiên bản số bản dựng đầy đủ. Tôi đã kiểm tra với các phiên bản khác nhau của arcgis và phiên bản cuối cùng của tôi trở lại 10.4.0.5524
GeoStoneMarten

Hấp dẫn. Tôi chưa nâng cấp lên 10,4. Bạn có thể chia sẻ một mxd trống cho tôi xem?
Snorfalorpagus

1
@GeoStoneMarten Cảm ơn. Tôi đã xem tài liệu bạn gửi. Nó dường như hoạt động với mã gốc - Tôi không thấy luồng "Thông tin phiên bản tài liệu Mx"?
Snorfalorpagus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.